数字图像处理 彩色图像拼接

2014-11-24 08:14:38 · 作者: · 浏览: 0

圣诞礼物大作战前奏:拼图

ps的话简单,所以才有人开发了ps。现在使用matlab拼图,我喜欢的人喜欢下列的图,所以直接拿来拼。


bg.jpg

\

small.jpg

\


< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+z9bU2qOssNHW7ce2tb3NvMas1tDIpaGjPC9wPgo8cD48YnI+CjwvcD4KPHA+ssrJq828z/HT0FJHQrLjo6y67KOswsyjrMC2oaPL+dLUtb3Ksce2yOvQ6NKqwb3Vxc28xqy1xMO/0ruy47bU06a689TZtf6806GjPC9wPgo8cD48YnI+CjwvcD4KPHA+z8iyw7z0wvO2tc28xqyho8D708M8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">a = imread('small.jpg'); g = roipoly(f); imwrite(g,'mdb.jpg');roipoly,多边形裁剪图片。裁剪完后mdb.jpg

\

这是二值图像,只有0和1,保存之后为uint8,8位无符号整数类型。


接下来拿到麦兜rgb层的裁剪图片,就是将原图的rgb层与mdb.jpg这个矩阵进行点乘运算后,因为黑色的地方为0,所以相乘后将会去除边界。

同时补全图片,因为要和bg.jpg这个大图片叠加。


    %补全图片剩余的其他空间  拿的是R层
    b = a(:,:,1);
    d = b.*uint8(g);
    f = [zeros(50,160);g];
    f = [f;zeros(430,160)];
    f = [f,zeros(600,320)];
    f = [zeros(600,320),f];

\


与大图片叠加之前,我们要将bg.jpg中准备嵌入的那块置零。不然原本的背景数据叠加上麦兜图片便会失真。


 s = imread('bg.jpg');
 s = s.*uint8(~logical(f));

因为保存之后为uint8,要将其转成logical类型,0和1,麦兜的图像为1,取反为零,s为uint8,再转成uint8类型,点乘后乘零的那部分就没有了。


接下来将两个rgb层的图像叠加。


全代码:


function y = md()
%读入插入图像和roipoly的图像
a = imread('small.jpg');
c = imread('mdb.jpg');
%roipoly提取的二值图像  保存之后又变成uint8类型 但是为了提取所需要的图像 需要进行二值图像的转换
c = logical(c);

%背景图片的读入
r = imread('bg.jpg');
for i= 1:3
    %rgb图层的提取
    b = a(:,:,i);
    d = b.*uint8(c);
    %补全图片剩余的其他空间
    f = [zeros(50,160);d];
    f = [f;zeros(430,160)];
    f = [f,zeros(600,320)];
    f = [zeros(600,320),f];
    
    
    s = r(:,:,i);
    s = s.*uint8(~logical(f));
    
    %将rgb三层分别叠加,得到彩色图像
    image(:,:,i) = s+f;
    pig(:,:,i) = f;
    figure;
    imshow(s+f);
    
end
 imshow(image);
 figure();
 imshow(pig);
 
 %合成图像的输出
 %imwrite(image,'final.jpg');
y =1;

\



还有其余两层,不贴了,最终大功告成。



阿狸看着天空,想:“麦兜,你怎么不用穿内裤的?”。

麦兜:“因为我不知道理想和真谛”。