1. 程式人生 > >Matlab之山東大學數字影象處理實驗一(影象載入,顯示與合成)

Matlab之山東大學數字影象處理實驗一(影象載入,顯示與合成)

本文屬於原創,轉載請註明出處。

實驗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

追加:
在某位同學的幫助下,明白了小人的頭髮出現毛刺的原因,是因為資料精度的問題,把相關程式碼修改一下,就會發現效果很好:

%計算引數
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)));

修改後的結果:
在這裡插入圖片描述