Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)

时间:2024-04-05 14:45:24

本文属于原创,转载请注明出处。

实验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之山东大学数字图像处理实验一(图像加载,显示与合成)
但是经过Matlab处理之后却变成了这样:
Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)

色彩丢失严重,甚至如果pause()函数里面的参数太大,也会出现刷新过慢而导致的图像重叠的问题,如上图所示。因此pause(0.001)较为合适,但是有的gif图像却能够正常显示,比如下面这一张:
Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)
至于为什么会出现色彩丢失的情况,哪位大佬如果知道麻烦评论一下。

实验1.2
根据Alpha通道合成公式:
Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)
现在想要把以下两张图合成到一起
Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)
Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)
那就要将第一张图片的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')

最终的效果是:
Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)
可以发现,头发没有处理好,还有很多毛躁,我想这个等以后学了相关知识之后可以再好好改进一下,如果是另外一个笔筒,效果就很不错:
Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)

Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)
Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)