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

使用MATLAB

输入两幅图片,将两幅图片拆分成像素列尺度,间隔合并起来。
就是说,第一幅图大小为800*600,将它拆成1*600,的800个像素条。
第二幅图,大小为800*600,同样拆开
最后,合成图像3,它的第1列像素来自图像1的1列,第2列来自图像2的1列,第3列来自图像1的2列,直到1600列合成完,并输出。

这个倒是不难,但有几点问题:
1、图像是否同类型(同为真彩或索引色)?
2、图像是否同尺寸(比如都是800x600)?追问

非同类,非同尺寸.同类可以通过使用同一台照相设备来完成。尺寸不同,是否可以通过MATLAB来选取同样大小区域?比如800*600.或者 如果两者大小不同,未填充满的地方留白即可。
谢谢,我的Q905063008

追答

1、对于不同类型的图片,应考虑统一转换为真彩图像来处理,避免调色板不同导致的问题。
2、尺寸不同,有以下几种处理思路:
(1)通过缩放,变成相同尺寸(问题:变大还是变小?)
(2)从大图片截取和小图片相同的尺寸(问题:截取位置——中间?靠左?靠上?)
(3)小图片外面加空白(问题:空白区域颜色?小图片放在什么位置?)

你所说的图像合成问题本身并不难,比较复杂的就是输入的两张图片可能有各种各样的情况,需要考虑周全,处理起来比较繁琐。

追问

真彩色,不缩放,如果小的话 自动填充白色,大的话自动裁剪左上到右下的大小,可否提供一段代码试试看,谢谢

追答

大和小是相对的概念,填充是向大图片对齐的做法,裁剪是向小图片对齐的做法,而这时不一样的。你的说法两者都有,究竟是要按照哪种做法?
而无论裁剪还是填充,水平和垂直方向都存在不同的对齐方式,你说的【左上到右下】也并没有回答究竟是用哪种方式。

追问

按水平方向对齐吧,两者中先取大的,以大的位标准,将不足的地方填充。水平方向,从左到右,如果真彩色比较麻烦,转成灰度图像再处理也可以,谢谢了。

追答

好像你还是没看明白我要明确的问题:
水平方向对齐,是把小图放在左边,右边空白?
垂直方向呢?小图放上边,下面空白?

追问

嗯,对的。如果我没理解错的话。

我想做的事情是这样,比如两幅图, 它们分别是 “豇” 和 明”,各是2x2像素大小,

我希望程序能将它组合成 “豆日工月”变成了4X2。
假设 图1 是 800*600 图2 是 1200*800

那么合成图像就按小的乘以 两倍, 即应该是1600*1200, 从图2中取800*600的部分,填进去。

前800列,600行,即可。

谢谢,麻烦了我稍后追加分数。

追答

晕,你说了好半天,一些基本的概念怎么一直没搞清楚?

按照你现在的描述,那应该是水平方向按照宽度比较小的进行裁剪,垂直方向按照高度比较大的填充?

你只是按列合并,宽度乘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)改变像素列单元宽度,每张图像各取 2 、3、4 个像素列为一组,再组合,如何修改?
2)三张图像合并,如何修改。

非常感谢。

温馨提示:答案为网友推荐,仅供参考
相似回答