Matlab之山东大学数字图像处理实验一(图像加载,显示与合成)
本文属于原创,转载请注明出处。
实验1.1:图像加载、显示
借助图像库提供的功能,实现从文件中加载并展示图像的功能;通过使用常见的图形文件格式(.jpg、.png、.bmp和.gif)作为测试手段;
实验1.2:图像合成
- 有一份具有四通道透明度的图片文件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)
但是Matlab无法友好地支持.gif图像,并且经常会出现色彩丢失或刷新缓慢的情况
%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')
最终的效果是:

我发现头发没有处理得足够精细,在外观上显得比较毛躁。我希望等到掌握了更多相关知识后能够进一步改善这种情况;不过如果换成另一个笔筒的话,则会得到更好的效果。



在同学的帮助下深刻理解了小人头发出现毛刺的原因在于数据精度的问题对相关代码进行调整实验结果表明效果显著:
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('合成的图片');
修改后的结果:

