matlab编程,要求将以下四幅图片随机组合形成数码迷彩。也就是说将四幅图放到一幅图中随机生成新图像。
先提供一个半成品,供题主参考。稍后有时间再完善下。
后面有些问题需要题主确认,如果还发现其它问题也欢迎提出来一并解决。
clear A
% 各小图片的特征,1表示有颜色,0表示空白
A(1).Patten = [1 0 0 0; 1 1 0 0; 0 1 1 1; 0 1 1 0];
A(2).Patten = [1 0 0 0; 1 1 0 0; 0 1 1 1; 0 1 1 0];
A(3).Patten = [1 0 0; 1 1 0; 0 1 1; 0 1 1];
A(4).Patten = [1 0 0; 1 1 0; 0 1 0; 0 1 1];
% 大图划分为M*N个单元小格
M = 30/2;
N = 30/2;
% 允许重叠的单元格数量
X = 0;
% 尝试1000次生成大图片,一旦生成满足要求的图片则退出循环
for attemp = 1:1000
% 生成空白图片
B = zeros(M,N);
% 将各小图片依次填入大图片
for i=1:length(A)
% 对小图片随机做旋转0、90、180、270度
Rot = floor(rand*4);
T = A(i).Patten;
for j=1:Rot
T = rot90(T);
end
% 将随机旋转后的小图片随机填充到大图片中
[m,n] = size(T);
r = floor(rand*(M-m)) + 1;
c = floor(rand*(N-n)) + 1;
B(r:r+m-1,c:c+n-1) = B(r:r+m-1,c:c+n-1) + T;
end
% 如果生成的图片满足对重叠区域的要求,则退出循环
if sum(B(:)>1) <= X, break, end
end
fprintf('\n本次生成数码迷彩共经过%i次尝试,图案如下:\n\n', attemp)
disp(num2str(B))
pcolor(B)
目前存在以下几个问题:
1、绘图。目前暂时用pcolor简单生成图片,但存在问题,因为pcolor的数据表现在各单元格的顶点上,而实际上需要的是表现在单元格的面上。稍后考虑更好的绘图手段。
2、算法也有点小问题。开始的时候我想简单了,认为既然小图片由2*2cm的单元小格组成,那就以2为基本单位,把30x30的图片划分成15x15个单元格,但编完之后想起来,这种处理是有问题的,例如,小图片可以从第2cm处(也就是半个单元格)排,这与算法对不上。
3、需要题主确认的两个问题:
(1)下面两个图案只有三列单元格,是否考虑存在第四列?也就是说,在往大图片中排的时候,是否考虑(不旋转的条件下)最右侧要有一列空白?
(2)现在的图案其实只有两种颜色,是否要使用4种不同的颜色对其进行区分?
1、第二条我没有明白,划分成15*15的单元格是很正确的,为什么会有问题?
2、针对第三条第二款,实际情况下确实是多种颜色,一般4种,还有5种的情况。
3、小图片中单元格的列数最多有10列,最少有3列,也就是说,总共有十几种不同形状的小图片,每一种列数都稍有差别,不需要空白。小图片在拼成大图片时,留下空白是必然情况,有部分重叠也是必然情况。
解答的非常精彩,非常感谢,期待更优化的方案。
抱歉,最近很忙,程序虽然早就编了,但没及时上传。
受字数限制,代码作为附件上传。以下是生成的一些效果图。
简单说明几点:
1、关于划分为15*15单元格的问题,我的理解是,这其实要看基本单位是什么。既然题目给的条件是2x2cm和30x30cm,而不是1x1和15x15,应该是要把1cm作为基本单位的。二者的差别可以在上面几张图上得到体现,例如,距离左边缘可以是1cm,重叠的部分也可以是半个或1/4个单元格。
2、颜色方面,用白色背景、灰色格线,四种单元格分别使用不同的颜色,而重叠部分也分别使用不同颜色加以区分。配色使用hsv,效果应该比jet稍好,但也不算太理想。
3、如果用patch设置半透明进行绘图,效果可能会更好一些,但做起来比较麻烦,如果没有特别需要,就用现在的这个将就吧。
如果还有别的什么要求,请提出来,我再酌情修改。