【Matlab编程】将两幅图片分裂成像素列,再合并输出

使用MATLAB输入两幅图片,将两幅图片拆分成像素列尺度,间隔合并起来。就是说,第一幅图大小为800*600,将它拆成1*600,的800个像素条。第二幅图,大小为800... 使用MATLAB

输入两幅图片,将两幅图片拆分成像素列尺度,间隔合并起来。
就是说,第一幅图大小为800*600,将它拆成1*600,的800个像素条。
第二幅图,大小为800*600,同样拆开
最后,合成图像3,它的第1列像素来自图像1的1列,第2列来自图像2的1列,第3列来自图像1的2列,直到1600列合成完,并输出。
------
% 读取图像
X1 = imread('5.jpg');
X2 = imread('3.jpg');

% 转换为double类型统一处理
X1 = im2double(X1);
X2 = im2double(X2);

% 预处理:高度不足的地方用白色填充
h1 = size(X1,1);
h2 = size(X2,1);
h = max(h1,h2);
if h1<h2
X1(h1+1:h,:,:) = 1;
else
X2(h2+1:h,:,:) = 1;
end

% 预处理:按照较小的宽度进行裁剪
w1 = size(X1,2);
w2 = size(X2,2);
w = min(w1,w2);
if w1>w2
X1(:,w+1:end,:) = [];
else
X2(:,w+1:end,:) = [];
end

% 按列交叉合并
X = zeros(h,2*w,3);
X(:,1:2:end,:) = X1;
X(:,2:2:end,:) = X2;
subplot 131
imshow(X1)
subplot 132
imshow(X2)
subplot 133
imshow(X)

-----------------------------------------
如果我要改成:
1)改变像素列单元宽度,每张图像各取1列改为取 2 、3、4 …像素列为一组,再组合,如何修改?
2)例如三张图像或者更多张合并,如何修改。
展开
 我来答
tianxiawulang
2014-03-24 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2633万
展开全部

【问】改变像素列单元宽度,每张图像各取1列改为取 2 、3、4 …像素列为一组,再组合,如何修改?

【答】把原来代码中下列两行

X(:,1:2:end,:) = X1;
X(:,2:2:end,:) = X2;

改成

cols = 20;
intC = fix(w/cols)*2*cols;
inx1 = [sort(cell2mat(arrayfun(@(i){i:2*cols:intC},1:cols))) intC+1:w+intC/2];
inx2 = [sort(cell2mat(arrayfun(@(i){i:2*cols:intC},cols+1:cols*2))) w+intC/2+1:2*w];
X(:,inx1,:) = X1;
X(:,inx2,:) = X2;

其中cols就是你所说的单元宽度

 

【问】三张图像或者更多张合并,如何修改

 

【答】需要改动的地方比较多。

以三张为例,原来代码中读图像、预处理的部分类似,省略不写了。

主要改动的是下面几行:

X = zeros(h,2*w,3);
X(:,1:2:end,:) = X1;
X(:,2:2:end,:) = X2;

改为

X = zeros(h,3*w,3);
X(:,1:3:end,:) = X1;
X(:,2:3:end,:) = X2; 
X(:,3:3:end,:) = X3;

这是单元宽度为一个像素的情况,如果考虑多个像素,写法可参考上一问。

 

如果处理更多的图像,应该考虑用循环,那样改动就更多。

追问

你好,cols 那一段我拿两张,纯黑纯白图片试了下,似乎如果图片像素尺寸不同,计算取整会有一定误差? 按你的程序我cols 取1 的时候 得到的图片 比cols 取  10 的时候频率还低。


谢谢


     取10 

取1

追答

【如果图片像素尺寸不同,计算取整会有一定误差?】

如果尺寸不同,前面的预处理会将其变成相同尺寸,照理说不会有影响。

至于你看到图中疏密好像不均匀,有可能只是屏幕显示的问题,你试试放大了看。

 

【cols 取1 的时候 得到的图片 比cols 取  10 的时候频率还低】

我的实际测试没有发现你说的情况。

 

cols取1:

cols取10:

 

改动那几句虽然代码量不大,但我是花了不少心思的,考虑了各种可能,做了很充分的测试,应该是比较可靠的。

紫鹤静轩
2014-03-24 · 超过28用户采纳过TA的回答
知道答主
回答量:74
采纳率:0%
帮助的人:45.8万
展开全部
第一个问题
columlength=2;%也可以改成3,4,看你要求了。
for i=1:2*w
if(i%(2*columlength)<columlength+1)
a1=floor(i/(2*columlength));
for j=1:columlength
X(:,i,:)=X1(:,a1*columlength+i%columlength,:);
end
else
a1=floor(i/(2*columlength));
for j=1:columlength
X(:,i,:)=X2(:,a1*columlength+i%columlength,:);
end
end
subplot 131
imshow(X1);
subplot 132
imshow(X2);
subplot 133
imshow(X);
最后一部分的,就是按交叉那的。没有在MALTAB上跑,自己写的,你粘进去试试吧。

至于第二个问题,我觉得你如果看的懂程序的话,从两张往三张或更多上扩展很容易的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式