matlab编程,要求将以下四幅图片随机组合形成数码迷彩。也就是说将四幅图放到一幅图中随机生成新图像。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab编程,要求将以下四幅图片随机组合形成数码迷彩。也就是说将四幅图放到一幅图中随机生成新图像。相关的知识,希望对你有一定的参考价值。

将这四幅图片(都是由2*2cm的单元小格组成的)随机分布到一副30cm*30cm的大图中,形成一副新图片,可以出现未填充的空格,也可以出现部分重叠,但是不要重叠太多。这些小图片最好在分布时能够随机旋转90度,180度,270度。难度极大,大神顶起!!!

先提供一个半成品,供题主参考。稍后有时间再完善下。

后面有些问题需要题主确认,如果还发现其它问题也欢迎提出来一并解决。

 

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设置半透明进行绘图,效果可能会更好一些,但做起来比较麻烦,如果没有特别需要,就用现在的这个将就吧。

 

如果还有别的什么要求,请提出来,我再酌情修改。

参考技术A 有点意思 如果 明天 没人弄的话 就我来……

用matlab截取图像的一部分?

1.读入给定四幅图像并正确显示;
2.分别截取四幅图像中一部分正确显示

已经给定了四幅图像,分别是JPG,gif,PNG等格式,1我会,请问2怎么截图,好像要涉及坐标。请问那个函数能比较简单的截图?请写下完整程序,谢啦~

1、首先打开matlab,在命令行窗口中输入a=[1 5 6 7;8 12 14 16;6 3 5 7],创建一个3行4列的a矩阵,如下图所示。

2、输入x=find(a>10),找到a数组中大于10的元素的下标,如下图所示。

3、按回车键之后,可以看到找到大于10的元素下标,下标位置是按一列开始数,一列一列数的。

4、输入a(x)=[],将a数组中大于10的元素全部删除,如下图所示。

5、最后按回车键之后,可以看到a数组大于10的元素全部删除了,如下图所示。

参考技术A % 由于读入图像的方法你已经掌握,所以这里只示范怎样截取图像的部分
% 需要说明的主要有以下几点:
% 1、图像数据有索引色和真彩色这两种不同格式,截取前需要搞清楚是哪一种;
% 2、截取图像实际上就是取出数组的部分;
% 3、数组第一维为高度方向(从上到下),第二维为宽度方向(从左向右)。

% 载入MATLAB系统自带图像数据
load durer X map

% 显示原图像
subplot(1,2,1)
image(X)
colormap(map)
axis off; axis image
title('原图')

% 原图像为索引色,这个示范截取其右上角(宽度1/2,高度1/3)
subplot(2,2,2)
w = size(X,2); h=size(X, 1);
image( X(1:fix(h/3), fix(w/2):end) )
axis off; axis image
title('右上角(宽1/2,高1/3)')

% 下面示范示范截取真彩图
% 首先把索引色图像转换为真彩色,然后截取左下角(宽度1/3,高度1/2)
subplot(2,2,4)
rgb = ind2rgb(X, map);
w = size(rgb,2); h = size(rgb,1);
image( rgb(fix(h/2):end, 1:fix(w/3), :) )
axis off; axis image
title('左下角(宽1/3,高1/2)')追问

谢谢您了,你前面回答很好。就是有一个问题,有一幅图像是gif,彩色的,但我
a=imread(‘sst.gif’); %sst是图像名称%
imshow(a)
之后,本来是彩色的图片显示出来后的figure却是黑白的,老师说还要调用map色板,可我不知道语法,能否说一下?

还没问完,我发到你私信里了,我提高悬赏到70分了,就选你为正确答案了。请帮忙回答,多谢la~

追答

首先,你读取gif图像的方法有问题。因gif是索引色图像,所以读图像的时候仅仅读图像数据是不够的,还要带上调色板信息。至于怎样用调色板,前面其实已经示范过。

你的程序可以改成:
[a,map]=imread(‘sst.gif’); %sst是图像名称%
image(a)
colormap(map)

但这样有个问题:map是针对整个figure而非axes的,如果你有多个gif图要在同一个窗口里面显示,使用哪个图的map?事实上,使用哪个map都不合适。

这个问题怎么解决呢?其实上次也已经给了你解决的办法——使用ind2rgb把索引图转换成真彩图,真彩图的图像数据已经包含了完整的信息,和map无关。

追问

截图时,有一副彩色的JPG图片,我用whos看了一下,是这样的:
c 3000x2000x3 18000000 uint8 array %c是我令图片的变量
我用了 cat=c(10:125,20,250); imshow(cat) 结果显示出来了所截图像的一部分,但是截图是灰色的,怎么把颜色带进去呢? 让它显示成原来的颜色

追答

问题已经在另一个新开的帖子里解决了,我就不多说了。
其实真彩图的截取在我上面给的代码倒数第三行已经给出来了,你可能之前还是没看太明白。

至于你说的表达式
cat=c(10:125,20,250);
我认为是错误的,在6.5和R2007b里面测试也都报错,不知道你用的是什么版本?按常理,其他版本也不会允许这样的表达式。

本回答被提问者和网友采纳

以上是关于matlab编程,要求将以下四幅图片随机组合形成数码迷彩。也就是说将四幅图放到一幅图中随机生成新图像。的主要内容,如果未能解决你的问题,请参考以下文章

matlab编程实现一种简单的数字水印嵌入与提取方法

用matlab截取图像的一部分?

求助急用,利用MATLAB编程描绘出随机过程 的图像

MATLAB-随机森林实现数据回归分析预测

matlab中矩阵随机取几个元素赋值

怎么用matlab生成随机数,排序,取数排序前的位置?