讀古今文學網 > 刷臉背後:人臉檢測 人臉識別 人臉檢索 > 2.4 圖像類型及轉換 >

2.4 圖像類型及轉換

根據圖像在計算機中表示形式的不同,形成了幾種不同類型的圖像,如RGB圖像、灰度圖像、索引圖像、二值圖像等。本節將分別介紹這4種圖像類型,以及它們之間的相互轉換。

2.4.1 圖像類型

1.RGB圖像

RGB圖像,由Red、Green、Blue三種顏色份量組成。這三種顏色的組合可形成其他顏色,所以用它們來表示彩色圖像。RGB圖像也稱真彩色圖像,由3個維度相同的二維數組組成,每個數組分別代表圖像顏色中紅色的份量、綠色的份量和藍色的份量。每個像素由24位組成,每8位代表一種顏色份量。通過函數imread讀入一幅真彩色圖像,返回的是一個M×N×3的三維數組。

2.灰度圖像

灰度圖像的像素值都在[0,255],一幅灰度圖像由一個二維矩陣表示,像素值0表示黑色,像素值255表示白色。像素值為[1,254],則表示不同程度的灰色。

3.索引圖像

索引圖像由數據矩陣和調色板矩陣組成。調色板矩陣是一個M×3的數組,每一行代表一種顏色,每種顏色由Red、Green、Blue三種顏色份量組成,顏色份量值為[0,1]的浮點型數據。數據矩陣是一個二維矩陣,數據矩陣中的值指向調色板對應行的數據,如值1指向調色板矩陣的第一行,值5指向調色板矩陣的第五行。

數據矩陣和調色板矩陣存放在一起,通過函數imread讀取一幅索引圖像,會返回數據矩陣X和調色板矩陣map,格式如下。

[X,map]=imread(\'索引圖像\');

4.二值圖像

二值圖像是由像素值0或1組成的一幅圖像,像素值為0對應的圖像為黑色,像素值為1對應的圖像為白色。由於二值圖像沒有中間過度的灰色,因此只能表示文字或圖像輪廓。二值圖像佔用的空間比較少。

2.4.2 圖像類型的轉換

在數字圖像處理中,經常需要轉換圖像類型,在MATLAB中有一些函數可以實現圖像類型之間的轉換。

1.RGB圖像轉換為灰度圖像

在MATLAB中,函數rgb2gray可以將RGB圖像轉換為灰度圖像,格式如下。

gray =rgb2gray(A)

A為輸入的RGB圖像,gray是轉換後輸出的灰度圖像。RGB圖像的每個像素由3個顏色份量值表示,灰度圖像每個像素只有一個值。分別將RGB圖像中3個份量的值乘以某個比例再相加,即可得到對應的灰度圖像的像素值。轉換後寬、高不變,數值類型不變。

rgb2gray就是按照如下公式比例進行轉換的。

gray1 = 0.29894 *A(:,:,1) + 0.58704 * A(:,:,2) + 0.11402 * A(:,: ,3);

註:上述公式只是為了說明轉換過程,由於精度的原因,按照上述公式轉換後的結果和使用函數rgb2gray轉換後得到的結果會有誤差,建議讀者以後使用函數rgb2gray進行轉換。

下面我們通過Code12說明如何利用函數rgb2gray和公式將RGB圖轉換為灰度圖像。

Code12:ch2_12.m

運行Code12後,結果如圖2-19所示。圖(a)是原真彩色圖像,圖(b)是利用函數rgb2gray轉換後得到的灰度圖像,圖(c)是利用公式轉換後得到的灰度圖像。

圖2-19 Code12的運行結果

2.索引圖像轉換為灰度圖像

在MATLAB中,函數ind2gray可以將索引圖像轉換為灰度圖像,格式如下。

gray=ind2gray(X,map)

在索引圖像轉換為灰度圖像的過程中,只保留索引圖像的亮度,去除了顏色和飽和度。輸入的索引圖像數據類型無論是double還是uint8,轉換後的灰度圖像數據類型都是double。下面我們通過Code13來說明如何利用函數ind2gray進行索引圖像到灰度圖像的轉換。

Code13:ch2_13.m

運行Code13後,結果如圖2-20所示。

圖2-20 Code13的運行結果

3.矩陣轉換為灰度圖像

在MATLAB中,一幅圖像由一個數據矩陣表示,數據矩陣中每個數值都在限定的範圍內。對於任意的一個矩陣,只要把矩陣中的數值轉換為限定的取值範圍內的數值,就可以把一個矩陣轉換為一幅灰度圖像。函數 mat2gray就可以將一個矩陣轉換為一幅灰度圖像,格式如下。

Gray=mat2gray(mat,[min,max]);

輸入一個矩陣mat,矩陣中的數值小於min會被轉換為0,即轉換為黑點;大於max會被轉換為1,即轉換為白點;其他值轉換為不同程度的灰度值。min和max可以選擇性地進行設置,如果不設置,則默認min對應矩陣mat中的最小值,max對應矩陣mat中的最大值。下面我們通過Code14來說明如何利用函數mat2gray將矩陣轉換為灰度圖像。

Code14:ch2_14.m

運行Code14後,結果如圖2-21所示,該圖是一幅灰度圖像。

圖2-21 Code14的運行結果

4.索引圖像轉換為RGB圖像

在MATLAB中,函數ind2rgb可以將索引圖像轉換為RGB圖像,格式如下。

rgb=ind2rgb(X,map);

X和map分別是索引圖像的數據矩陣和調色板矩陣,轉換過程就是將每個像素在調色板中對應的序號的顏色賦值給一個三維數組。無論輸入的索引圖像的數據類型是uint8、uint16還是double,轉換後RGB圖像的數據類型都是double。下面我們通過Code15來說明如何利用函數ind2rgb將索引圖像轉換為RGB圖像。

Code15:ch2_15.m

運行Code15後,結果如圖2-22所示。圖(a)是原索引圖像,圖(b)是通過函數ind2rgb轉換後的RGB圖像。

圖2-22 Code15的運行結果

5.RGB圖像轉換為索引圖像

上面介紹了函數ind2rgb可以將索引圖像轉換為RGB圖像。在MATLAB中,也有類似的函數rgb2ind,可以將RGB圖像轉換為索引圖像。函數rgb2ind有幾種不同的轉換方法,即均勻量化法、最小方差量化法和顏色表近似法,不同的轉換方法調用函數rgb2ind的方法不同,格式如下。

均勻量化法:

[X,map]=rgb2ind(rgb,tol)

rgb是待轉換的RGB圖像,tol決定了轉換後索引圖像的調色板矩陣map中的顏色種類,調色板矩陣map包含的顏色種類至少有[floor(1/tol)+1]3種。

最小方差量化法:

[X,map]=rgb2ind(rgb,N)

N表示生成的索引圖像的調色板矩陣map中至少有N中顏色。

顏色表近似法:

X=rgb2ind(rgb,map)

下面我們通過Code16來說明如何利用函數rgb2ind將RGB圖像轉換為索引圖像。

Code16:ch2_16.m

運行Code16後,結果如圖2-23所示。圖(a)是原RGB圖像,圖(b)是均勻量化法轉換後的索引圖像,圖(c)是最小方差量化法轉換後的索引圖像,圖(d)是顏色表近似法轉換後的索引圖像。

圖2-23 Code16的運行結果

6.灰度圖像轉換為索引圖像

在MATLAB中,函數gray2ind可以將灰度圖像轉換為索引圖像,格式如下。

[X,map]=gray2ind(gray,n)

n表示灰度級數,如果不設置,則默認為64。

下面我們通過Code17來說明如何利用函數gray2ind將灰度圖像轉換為索引圖像。

Code17:ch2_17.m

運行Code17後,結果如圖2-24所示。圖(a)是原灰度圖像,圖(b)是默認灰度級轉換後的索引圖像,圖(c)是灰度級為5轉換後的索引圖像。

圖2-24 Code17的運行結果

7.各種類型的圖像轉換為二值圖像

二值圖像中數據的值都是1或0,將其他類型的圖像矩陣轉換為二值圖像的主要工作是:確定哪些值轉換為1,哪些值轉換為0。通常我們設置一個閾值level,如果小於level的值轉化為0,則其他都轉換為1,這樣就可以將其他類型的圖像轉換為對應的二值圖像。在MATLAB中,函數im2bw可以將其他類型的圖像轉換為二值圖像,但調用格式不同,具體如下。

灰度圖像和RGB圖像轉換為二值圖像,格式為:

BW=im2bw(img,level)

level的取值範圍為(0,1)。若level=0.5,則所有小於255×0.5=127.5的值轉換為0,其他值都轉換為1。

如果img是RGB圖像,調用函數im2bw,RGB圖像首先會被直接轉換為灰度圖像,然後根據level值相應地轉換為0或1。

索引圖像轉換為二值圖像,格式為:

BW=im2bw(X,map,level)

Level的取值範圍為[0,1]。如果輸入的是索引圖像的數據矩陣X和調色板矩陣map,那麼首先它們會被轉換為灰度圖像,然後根據level值相應地轉換為0或1。下面我們通過Code18來說明如何利用函數im2bw將各種類型的圖像轉換為二值圖像。

Code18:ch2_18.m

運行Code18後,結果如圖2-25所示,有三組圖,分別為灰度圖像、RGB圖像和索引圖像到二值圖像的轉換。

圖2-25 Code18的運行結果

圖2-25 Code18的運行結果(續)