本文属于原创,转载请注明出处。
实验1.1:图像加载、显示
- 利用图像库的功能,实现从文件加载图像,并在窗口中进行显示的功能;利用常见的图像文件格式(.jpg; .png; .bmp; .gif)进行测试;
实验1.2:图像合成
- 现有一张4通道透明图像a.png:
- 从其中提取出alpha通道并显示;
- 用alpha混合,为a.png替换一张新的背景(背景图自选);
实验1.1
在Matlab中加载与显示图像主要用到两个函数imread()和imshow()两个函数。
对于.jpg; .png; .bmp; 三种类型的图像,只要用这两个函数就能正常显示:
img = imread('a.bmp');
%img = imread('a.png');
%img = imread('a.jpg');
imshow(img)
但是对于.gif图像,Matlab却不能很友好的支持,甚至会出现色彩丢失、刷新过慢的问题。
%gif图像的特殊处理
[I,map]=imread('a.gif','frames','all');
for i=1:size(I,4)
imshow(I(:,:,:,i),map);
pause(0.001);
end
a.gif是以下这张图像
但是经过Matlab处理之后却变成了这样:
色彩丢失严重,甚至如果pause()函数里面的参数太大,也会出现刷新过慢而导致的图像重叠的问题,如上图所示。因此pause(0.001)较为合适,但是有的gif图像却能够正常显示,比如下面这一张:
至于为什么会出现色彩丢失的情况,哪位大佬如果知道麻烦评论一下。
实验1.2
根据Alpha通道合成公式:
现在想要把以下两张图合成到一起
那就要将第一张图片的Alpha通道取出来才能进行合成,一开始想着直接用图片合成,答案是发现参数是一维的,但是图片却是三维的,因此又取出RGB三通道,对每个通道都进行合成,以下是完整代码:
img = imread('b.png');
%R通道
R = img(:,:,1);
%G通道
G = img(:,:,2);
%B通道
B = img(:,:,3);
%Alpha通道
[I,map,Alpha] = imread('b.png');
background = imread('backgroundB.png');
%计算参数
a = Alpha/255;
%三通道合成
img2(:,:,1) = img(:,:,1) .* a + (1-a) .* background(:,:,1);
img2(:,:,2) = img(:,:,2) .* a + (1-a) .* background(:,:,2);
img2(:,:,3) = img(:,:,3) .* a + (1-a) .* background(:,:,3);
imshow(img2);
imwrite(img2,'combineB.png')
最终的效果是:
可以发现,头发没有处理好,还有很多毛躁,我想这个等以后学了相关知识之后可以再好好改进一下,如果是另外一个笔筒,效果就很不错: