圣诞礼物大作战前奏:拼图
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;
还有其余两层,不贴了,最终大功告成。
阿狸看着天空,想:“麦兜,你怎么不用穿内裤的?”。
麦兜:“因为我不知道理想和真谛”。