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

版权声明:本文版权归Heavn所有,转载或引用请注明出处 https://blog.csdn.net/qq_38137411/article/details/83212976

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

实验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是以下这张图像
a.gif
但是经过Matlab处理之后却变成了这样:
在这里插入图片描述

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

实验1.2
根据Alpha通道合成公式:
formula
现在想要把以下两张图合成到一起
b
background
那就要将第一张图片的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')

最终的效果是:
conbine
可以发现,头发没有处理好,还有很多毛躁,我想这个等以后学了相关知识之后可以再好好改进一下,如果是另外一个笔筒,效果就很不错:
c

backgroundC
combineC

追加:
在某位同学的帮助下,明白了小人的头发出现毛刺的原因,是因为数据精度的问题,把相关代码修改一下,就会发现效果很好:

img = imread('b.png');
%R通道
R = double(img(:,:,1));
%G通道
G = double(img(:,:,2));
%B通道
B = double(img(:,:,3));
%Alpha通道
[I,map,Alpha] = imread('b.png');
P = imread('b.png');
subplot(1,3,1);
imshow(P),title('要剪切的图片');
background = imread('backgroundB.png');
subplot(1,3,2);
imshow(background),title('背景图片');
%计算参数
a = double(Alpha)/255.00;
%三通道合成
img2(:,:,1) = uint8(R .* a + (1-a) .* double(background(:,:,1)));
img2(:,:,2) = uint8(G .* a + (1-a) .* double(background(:,:,2)));
img2(:,:,3) = uint8(B .* a + (1-a) .* double(background(:,:,3)));
subplot(1,3,3);
imshow(img2),title('合成的图片');

修改后的结果:
在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页