您的位置:首页 > 其它

数字图像处理(四) 彩色图像拼接

2013-12-03 22:50 513 查看
圣诞礼物大作战前奏:拼图

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

bg.jpg



small.jpg



现在,把猪嵌到图片中去。

彩色图像有RGB层,红,绿,蓝。所以到时嵌入需要两张图片的每一层对应后再叠加。

先裁剪麦兜图片。利用

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;




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



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

麦兜:“因为我不知道理想和真谛”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: