Matlab数字图像处理学习记录【5】——彩色图像处理
彩色圖像處理
- 一.Matlab中彩色圖像的表示方法
- 1.1RGB圖像
- 1.2索引圖像
- 1.3用來處理RGB圖像或索引圖像的IPT函數
- 二.轉換值其他彩色空間
- 2.1NTSC彩色空間
- 2.2YCbCr彩色空間
- 2.3HSV色彩空間
- 2.4CMY和CMYK彩色空間
- 2.5 HSI彩色空間
- 三.彩色圖像處理基礎
- 四.彩色變換
- 五.彩色圖像的空間濾波
- 5.1彩色圖像平滑
- 5.2彩色圖像銳化
- 六.在RGB向量空間直接處理
- 6.1使用梯度的彩色邊緣檢測
- 6.2 RGB向量空間中的圖像分割
一.Matlab中彩色圖像的表示方法
一般來說在IPT里,彩色圖像被當做索引圖像和RGB圖像來處理。所以重點學習這兩個圖像。
1.1RGB圖像
這個沒啥說的,就是將紅綠藍三色圖像組合起來。當然,可以用cat將圖像組合起來。
frgb = cat(dim, fr, fg, fb) dim是將后者矩陣疊加的維度。此處寫3即可。
當然,也可以通過切片的方式來分割成圖像分量:
fR = frgb(:, :, 1); 、fG = frgb(:, :, 2);、fB = frgb(:, :, 3);
創建函數,建立一個可以自定義觀測角度的RGB立方體:
傳參即可
rgbcube(0.7, 0.2, 0.3)1.2索引圖像
索引圖像有兩個分量。一個是數據矩陣X,一個是色彩映射矩陣map。
映射矩陣map存放顏色數據,長度由顏色的數量決定。數據矩陣則是存放指向映射矩陣的索引值。
這樣做的好處就是,假設需要更換顏色類型。那么直接修改map即可,而不需要對數據矩陣進行復雜的變換操作。
若需要顯示該圖像,一般使用
imshow(X, map)或者image(X)、colormap(map).
可以通過[Y, newmap] = imapprox(X, map, n)
利用該函數,將X和map 變為不超過n中顏色的新組合Y和newmap但注意其對值矩陣的縮放。
指定色彩圖像,可以用:
map(k, :) = [r(k), g(k), b(k)]
其中[r(k), g(k), b(k)]是RGB值,指定色彩映射的一行,變化k的值,就可以填充滿整個圖。
修改圖像的背景色可以用
whitebg(),推薦填RGB值,當然也可以填名字:
在顯示圖像,或者置映射map的時候,我們可以用預設的彩色映射:
1.3用來處理RGB圖像或索引圖像的IPT函數
比如dither,可以用于灰度圖和彩色圖像(但是我試了RGB不行, 只能單通道),比如在灰度圖里,使用它可以在白色背景上添加黑點得到灰色調。也就是用二值化的圖模擬灰度圖。
用法bw = dither(gray_image)
在處理彩色圖像的時候,抖動函數需要和rgb2ind結合使用,這個函數后面討論。
然后就是通過一個閾值,將gray圖生成一幅索引圖像的:X = grayslice(gray_image, n)
其中閾值為:1n、2n、3n…n?1n\frac{1}{n}、\frac{2}{n}、\frac{3}{n}…\frac{n-1}{n}n1?、n2?、n3?…nn?1?
如果將標量n改為向量v,則可以自定義映射map的大小。其中向量v的取值在[0,1]之間,函數會自己縮放。
利用[X, map] = gray2ind(gray_image, n)縮放后,會用彩色映射,也就是表6.2中的gray(n)進行轉換。若n省略,則默認64.
ind2gary()同理。
[X, map] = rgb2ind(rgb_image, n, dither_option) 參數同灰度圖,不過多了個參數。
若填字符串dither則執行抖動,會提高空間分辨率達到更好的顏色分辨力。nodither則是將顏色映射到新圖上最金額近的顏色。
rgb_image = ind2rgb(X, map)和gray_image = rgb2gray(rgb_image)同理。
二.轉換值其他彩色空間
2.1NTSC彩色空間
NTSC色彩空間中,顏色由亮度Y、色調I、飽和度Q組成。
亮度描述灰度信息,色調和飽和度描述彩色信息。
轉換公式:
[YIQ]=[0.2990.5870.1140.596?.0274?0.3220.211?0.5230.12][RGB]\begin{bmatrix}Y \\ I \\Q\end{bmatrix} = \begin{bmatrix}0.299 & 0.587 & 0.114 \\ 0.596 & -.0274 & -0.322 \\0.211 & -0.523 & 0.12\end{bmatrix} \begin{bmatrix}R \\ G \\B\end{bmatrix} ???YIQ????=???0.2990.5960.211?0.587?.0274?0.523?0.114?0.3220.12???????RGB????
轉換函數為:yiq_image = rgb2ntsc(rgb_image)
輸出為double類圖像,當然還是可以通過切片提取Y、I、Q。
類似:
[RGB]=[1.0000.9560.6211.000?.0272?0.6470.211?1.1061.703][YIQ]\begin{bmatrix}R \\ G \\B\end{bmatrix} = \begin{bmatrix}1.000 & 0.956 & 0.621 \\ 1.000 & -.0272 & -0.647 \\0.211 & -1.106 & 1.703\end{bmatrix} \begin{bmatrix}Y \\ I \\Q\end{bmatrix} ???RGB????=???1.0001.0000.211?0.956?.0272?1.106?0.621?0.6471.703???????YIQ????
函數rgb_image = ntsc2rgb(yiq_image)
2.2YCbCr彩色空間
[YCbCr]=[16128128]+[64.481128.55324.966?37.797?74.203112.000112.000?93.786?18.214][RGB]\begin{bmatrix}Y \\ Cb \\Cr\end{bmatrix} = \begin{bmatrix}16 \\ 128 \\128\end{bmatrix} +\begin{bmatrix}64.481& 128.553 & 24.966 \\ -37.797 & -74.203 &112.000 \\ 112.000 & -93.786 & -18.214\end{bmatrix} \begin{bmatrix}R \\ G \\B \end{bmatrix} ???YCbCr????=???16128128????+???64.481?37.797112.000?128.553?74.203?93.786?24.966112.000?18.214???????RGB????
函數ycbcr_image = rgb2ycbcr(rgb_image)和rgb_image = ycbCr2rgb(ycbcr_image)
2.3HSV色彩空間
HSV(色調、飽和度、亮度)是較常用的一種模型。
色調是圍繞彩色六邊形的角度來描述的。沿錐體的軸來測量值,也就是我這里說的亮度。V = 0時,軸的末端為黑色,V=1是,州的末端為白色。比如要制作呼吸燈,那么保持HS不變,變化V的大小,即可完成在近似相同的顏色的情況下調整亮度。RGB轉HSV的方法就是將RGB坐標系映射指柱坐標系,這里沒有推導,可以去別處看。
函數是:hsv_image = rgb2hsv(rgb_image)和rgb_image = hsv2rgb(hsv_image)。
2.4CMY和CMYK彩色空間
一般用于打印機內部的顏色。
理論上,等量的顏料原色即青色、品紅色和黃色混合會產生黑色。在實踐中,將這些顏色加以混合來印刷會生成一幅模糊不清的黑色圖像。所以,為了生成一種純正的黑色(打印中使用的主要顏色),便要添加第四種顏色,即黑色,從而出現了CMYK彩色模型。這樣,當出版者談論“四色印刷”時,他們其實是在說CMY彩色模型的三種顏色加上黑色。
函數:cmy_image = imcomplement(rgb_image)和rgb_image = imcomplement(cmy_image)
2.5 HSI彩色空間
HSI(hue色度;saturation飽和度,intensity亮度)彩色空間,該模型將亮度分量用途一幅彩色圖像中攜帶的彩色信息分開,是一種對于開發基于彩色描述的圖像處理算法是個理想的工具。
其推導過程:
- 如在6.1.1節中討論過的那樣,RGB彩色圖像是由三幅單色的亮度圖像構成的,所以一定可以從一幅RGB圖像中提取出亮度。若拿圖6.2所示的彩色立方體來看,一切就很清楚。假設我們站在黑色頂點(0,0,0)處,如圖6.6(a)所示,它的正上方是白色頂點(1,1,1)。再同圖6.2聯系起來看,亮度是沿著連接著兩個點的連線分布的。在圖6.6所示的排列中,這條連接黑色和白色頂點的線(亮度軸)是垂直的。因此,若想確定圖6.6中任意彩色點的亮度分量,我們就需要經過一個包含該點且垂直于亮度軸的平面。這個平面和亮度軸的交點就給出了范圍在[0,1]之間的亮度值。我們也注意到飽和度是一個與亮度軸之間的距離的函數。事實上,亮度軸上的點的飽和度為零,亮度軸上的所有點都是灰色的這個事實是很顯然的。為了弄清從一個給定RGB點確定色調的方式,可參考圖6.6(b),它顯示了一個由三個點(黑色、白色和青色)所定義的平面。該平面上含有黑色和白色頂點的事實告訴我們亮度軸同樣在這個平面上。此外,可以看到由亮度軸和立方體邊界共同定義的平面上的所有點都有相同的色調(在此例中為青色)。這是因為在一個彩色三角形內,顏色是由這三個頂點顏色的多種多樣的組合或者混合而成的。若這些頂點中的兩個是黑色和白色,第三個頂點是-一個彩色的點,則這個三角形中所有點的色調都是相同的,因為白色和黑色分量對于色彩的變化沒有影響(當然,在這個三角形中,點的亮度和飽和度會變化)。以垂直的強度軸旋轉這個個陰影平面,可以獲得不同的色調。
- 圖6.7(b)顯示了六邊形和一個任意的彩色點(用點的形式顯示)。這個點的色調是由其與某參考點的夾角決定的。一般來說(但也不總是如此),與紅色軸的夾角為0°,色調在此處按逆時針方向增加。飽和度(距垂直軸的距離)是從原點到該點的向量的長度。注意,原點由該彩色平面與垂直亮度軸的交點定義。HSI彩色空間的重要分量包括垂直亮度軸、到彩色點的向量長度以及該向量與紅色軸間的夾角。因此,當用剛才討論過的六邊形甚至如圖6.7?和如圖6.7(d)所示的三角形或圓形時,這些形式定義一個HSI平面是不足為奇的。選擇哪種形狀是不重要的,因為任意一種形狀都可以通過幾何變換變換成另一種形狀。圖6.8顯示了基于彩色三角形和圓形的HSI模型。
那么從RGB變HSI的過程:
H分量:
H={θ,若B≤G360?θ,若>G其中θ=arccos{0.5[R?G]+R?B[(R?G)2+(R?B)(G?B)0.5]}H = \begin{cases} \theta ,& 若B≤G\\ 360- \theta,&若>G \end{cases} \\其中 \ \theta=arccos\{\frac{0.5[R-G]+R-B}{[(R-G)^2+(R-B)(G-B)^{0.5}]}\} \\ H={θ,360?θ,?若B≤G若>G?其中?θ=arccos{[(R?G)2+(R?B)(G?B)0.5]0.5[R?G]+R?B?}
S分量:
S=1?3(R+B+G)[min(R,G,B)]S= 1-\frac{3}{(R+B+G)}[min(R,G,B)] S=1?(R+B+G)3?[min(R,G,B)]
I分量:
I=13(R+B+G)I = \frac{1}{3}(R+B+G) I=31?(R+B+G)
若RGB輸入為[0,1]將H/360°,則HSI輸出也為[0,1]
若將HSI轉換為RGB則是根據H來決定:
R=I[1+ScosHcos(60°?H)]B=I(1?S)G=3I?(R+B)R = I[1+\frac{ScosH}{cos(60°-H)}] \\ B = I(1-S) \\ G = 3I-(R+B) R=I[1+cos(60°?H)ScosH?]B=I(1?S)G=3I?(R+B)
H=H?120°G=I[1+ScosHcos(60°?H)]R=I(1?S)B=3I?(R+G)H = H - 120° \\ G = I[1+\frac{ScosH}{cos(60°-H)}] \\ R =I(1-S) \\ B = 3I-(R+G) H=H?120°G=I[1+cos(60°?H)ScosH?]R=I(1?S)B=3I?(R+G)
H=H?240°B=I[1+ScosHcos(60°?H)]G=I(1?S)R=3I?(G+B)H = H - 240° \\ B = I[1+\frac{ScosH}{cos(60°-H)}] \\ G = I(1-S) \\ R = 3I-(G+B) H=H?240°B=I[1+cos(60°?H)ScosH?]G=I(1?S)R=3I?(G+B)
那么代碼為:
三.彩色圖像處理基礎
一般把彩色圖像處理細分為三個主要類別:
第一類就類似于處理每個彩色平面的像素,以像素值為基礎,處理方法類似。而第二類則對各個彩色平面空間進行空間濾波。第三類則是同時處理所有分量。每個像素則為一個向量:
c=[cRcGcB]=[RGB]c=\begin{bmatrix} c_R\\c_G\\c_B \end{bmatrix}=\begin{bmatrix} R \\ G \\ B \end{bmatrix} c=???cR?cG?cB?????=???RGB????
若用x,y表示則是:
c(x,y)=[cR(x,y)cG(x,y)cB(x,y)]=[R(x,y)G(x,y)B(x,y)]c(x,y)=\begin{bmatrix} c_R(x,y)\\c_G(x,y)\\c_B(x,y) \end{bmatrix}=\begin{bmatrix} R(x,y) \\ G(x,y) \\ B(x,y) \end{bmatrix} c(x,y)=???cR?(x,y)cG?(x,y)cB?(x,y)????=???R(x,y)G(x,y)B(x,y)????
為了使獨立的彩色分量和以向量為基礎的處理都相同,必須滿足兩個條件:
首先,處理要對向量和標量都可以用。
對向量的每個分量的運算必須獨立于其他分量。
四.彩色變換
在單個彩色模型的情況下,處理彩色圖像的彩色分量或單色圖像的亮度分量。對于彩色圖像有:si=Ti(ri),i=1,2,...,ns_i=T_i(r_i),i=1,2,...,nsi?=Ti?(ri?),i=1,2,...,n若該圖像是單色的,則方程可以改為:si=Ti(r),i=1,2,...,ns_i=T_i(r),i=1,2,...,nsi?=Ti?(r),i=1,2,...,n
其中,r表示灰度級的值,si和T 如上所示,n是si中的彩色分量數。該方程描述把灰度級轉換成任意顏色的映射,這一處理常稱為偽彩色變換或偽彩色映射。注意,若令r1=r2= r3=r,則第一個方程可用來處理RGB中的單色圖像。
第3章已介紹過一些灰度變換:
在這些應用中,直接產生候選函數的圖形表示并在被處理圖像上觀察其組合效果(實時)的方法,是選擇合適的映射函數的最好方法。
使用雙插值z=interp1q(x, y, xi)可以用圖形來指定映射函數。
它返回一個列向量,該向量包括在點xi處使用-維函數z線性插值的值。列向量x和y指定控制點的水平和垂直坐標。x的元素必須單調增長。z的長度等于xi的長度。
例如:z = interp1q([0 255]', [0 255]', [0: 255]')則產生了一個產生一個有著256個元素的一一映射,以連接控制點(0,0)和(255,255),即z=[ 012…255]’。
三次樣條插值函數則是:z=interp1q(x, y, xi)
交互式產生變換函數可以用ice生成:
g = ice ( 'Property Name ', 'Property value', . . .)
其中,Property Name和Property value必須成對出現,并且這些點表示由相應輸入對所組成的模式的重復。表6.4列出了ice函數中的正確搭配。一些例子將在本章稍后給出。
關于wait參數,當顯式地或默認地選擇on時,輸出g是處理后的圖像。在這種情況下,ice將控制處理,包括光標,因而在命令窗口不必鍵入任何命令,直到函數關閉,這時最后的結果就是圖像g。當選擇off時,g為處理后的圖像的句柄,并且控制會立即返回到命令窗口;因此,在函數ice仍處于活動狀態時,可以鍵入新的命令。為了用句柄g獲得圖像的屬性,我們使用get函數h=get(g)
不過ice這個函數好像沒有,但是Google到了其源碼,下載地址:http://fourier.eng.hmc.edu/e161/dipum/ice.m
然后發現這個網頁基本上涵蓋了該書所有要自定義的函數。
下載ice.m和ice.fig即可運行:
五.彩色圖像的空間濾波
5.1彩色圖像平滑
其思想還是對三個通道的顏色“求平均”,假設Sxy是彩色圖像中以(x,y)為中心的領域的一組坐標。其平均值是:
cˉ(x,y)=1K∑(s,t)∈Sxyc(s,t)\bar{c}(x,y)= \frac{1}{K} \sum_{(s,t)∈S_{xy}}c(s,t) cˉ(x,y)=K1?(s,t)∈Sxy?∑?c(s,t)
將前面的平滑濾波imfilter通過對三個通道分別濾波,再疊加即可成為fc_imfilter。
當然也可以對HSI圖像進行濾波。
5.2彩色圖像銳化
同理,分通道銳化,疊加:
?2[c(x,y)]=[?2R(x,y)?2G(x,y)?2B(x,y)]\nabla^2[c(x,y)] = \begin{bmatrix} \nabla^2R(x,y) \\ \nabla^2G(x,y) \\ \nabla^2B(x,y) \end{bmatrix} ?2[c(x,y)]=????2R(x,y)?2G(x,y)?2B(x,y)????
六.在RGB向量空間直接處理
因為有些時候,疊加后的信息,并不等于分離后再疊加。所以需要直接對[RGB]這向量進行操作。
6.1使用梯度的彩色邊緣檢測
二維函數f(x,y)的梯度定義為向量:
?f=[GxGy]=[?f?x?f?y]\nabla f = \left[\frac{G_x}{G_y}\right]= \left[\frac{\frac{ \partial f}{ \partial x}}{\frac{ \partial f}{ \partial y}}\right] ?f=[Gy?Gx??]=[?y?f??x?f??]
該向量幅值為:
?f=mag(?f)=[Gx2+Gy2]1/2=[(?f/?x)2+(?f/?y)2]1/2\nabla f = mag(\nabla f) = [G_x^2 + G_y^2]^{1/2} = [(\partial f/\partial x)^2 + (\partial f/\partial y)^2]^{1/2} ?f=mag(?f)=[Gx2?+Gy2?]1/2=[(?f/?x)2+(?f/?y)2]1/2
通常,該量用絕對值代替:
?f≈∣Gx∣+∣Gy∣\partial f ≈|G_x|+|G_y| ?f≈∣Gx?∣+∣Gy?∣
梯度:
α(x,y)=arctan(GyGx)\alpha(x,y)=arctan(\frac{G_y}{G_x}) α(x,y)=arctan(Gx?Gy??)
當然離散化的情況下,可以用卷積核代替:
將這個思維拓展到RGB上:
u=?R?xr+?G?xg+?B?xb和v=?R?yr+?G?yg+?B?ybu=\frac{\partial R}{\partial x}r+\frac{\partial G}{\partial x}g+\frac{\partial B}{\partial x}b \\ 和 \\ v=\frac{\partial R}{\partial y}r+\frac{\partial G}{\partial y}g+\frac{\partial B}{\partial y}b u=?x?R?r+?x?G?g+?x?B?b和v=?y?R?r+?y?G?g+?y?B?b
點積:
gxx=u?ugyy=y?ygxy=x?yg_{xx} = u \cdot u \\ g_{yy} = y \cdot y \\ g_{xy} = x \cdot y gxx?=u?ugyy?=y?ygxy?=x?y
則可以得到:
c(x,y)的最大變化率的方向由角度
θ(x,y)=12arctan[2gxy(gxx?gyy)]\theta(x,y)=\frac{1}{2}arctan[\frac{2g_{xy}}{(g_{xx}-g_{yy})}] θ(x,y)=21?arctan[(gxx??gyy?)2gxy??]
梯度值:
Fθ={12[(gxx+gyy)+(gxx?gyy)cos2θ+2gxysin2θ]}1/2F_{\theta} = \{\frac{1}{2}[(g_{xx}+g_{yy})+(g_{xx}-g_{yy})cos2\theta+2g_{xy}sin2\theta]\}^{1/2} Fθ?={21?[(gxx?+gyy?)+(gxx??gyy?)cos2θ+2gxy?sin2θ]}1/2
封裝成函數:colorgrad:
寫代碼:
f = imread('./test.jpg'); [VG, A, PPG] = colorgrad(f); subplot(2,2,1); imshow(f); subplot(2,2,2); imshow(VG); subplot(2,2,3); imshow(A); subplot(2,2,4); imshow(PPG);6.2 RGB向量空間中的圖像分割
使用RGB彩色向量進行彩色區域分割是很簡單的。假設我們的目的是在RGB圖像中分割一個特定彩色范圍的物體。給定一組感興趣的彩色(或彩色范圍)描述的彩色樣本點,我們獲得一個“平均”的顏色估計,它是我們希望分割的那種顏色。讓這種平均色用RGB列向量m來定義。分割的目的是對圖像中的每一個RGB像素進行分類,使其在指定的范圍內有一種顏色或沒有顏色。為執行這一比較,我們需要一個相似性度量。最簡單的度量之一是歐幾里得距離。令z表示RGB空間的任意點。若z和m之間的距離小于指定的閾值T,則我們說z相似于m。z和m之間的歐幾里得距離公式得:
D(z,m)=∣∣z?m∣∣=[(z?m)T(z?m)]1/2=[(zR?mR)2+(zG?mG)2+(zB?mB)2]1/2D(z,m) = ||z-m|| \\ \ = [(z-m)^T(z-m)]^{1/2}\\ \ = [(z_R - m_R)^2+(z_G-m_G)^2+(z_B-m_B)^2]^{1/2} D(z,m)=∣∣z?m∣∣?=[(z?m)T(z?m)]1/2?=[(zR??mR?)2+(zG??mG?)2+(zB??mB?)2]1/2
其中||·||是參量的范數,下標R、G和B表示向量m和z的RGB分量。D(z,m)≤T的點的軌跡是一個半徑為T的實心球體。由定義可知,包含在球體內部或表面的點滿足特定的彩色準則;而球體外面的點則不滿足。在圖像中對這兩組點編碼,如黑的和白的,產生一幅二值分割圖像。
對前述方程一個有用歸納是距離:
D(z,m)=[(z?m)TC?1(z?m)]1/2D(z,m)=[(z-m)^TC^{-1}(z-m)]^{1/2} D(z,m)=[(z?m)TC?1(z?m)]1/2
其中,C是我們要分割的彩色的樣值表示的協方差矩陣。該距離稱為Mahalanobis距離。D(z, m)≤T的點的軌跡描述了一個實心三維橢圓體,它的重要屬性是其主軸取在最大的數據擴展方向上。當C等于單位矩陣I時,Mahalanobis距離約簡為歐幾里得距離。除了現在數據包含在橢球體內而不是包含在圓球體內之外,分割和在前段描述過的一樣。
其函數為:S = colorseg(method, f, T, parameters)
其中,method不是euclidean就是mahalanobis,f是待分割的RGB 圖像,T是前邊描述過的閾值。若選擇euclidean,則輸入參數是m,若選擇mahalanobis,則輸人參數是m和c。參數m是一個在上面描述過的向量m,它的形式不是行就是列,并且c是3×3協方差矩陣C。
輸出s是一幅二值圖像(和原始圖像同樣大小),在未通過閾值測試的點包含0,在通過了閾值測試的點包含1。1表示從基于彩色內容的f中分割的區域。
colorseg的代碼:在http://fourier.eng.hmc.edu/e161/dipum/下載:imstack2vectors.m、covmatrix.m、colorseg.m
先選中卡通人物的衣服:
然后得到圖像:
其中C的主對角線包括RGB分量的方差,所以我們必須提取這些元素并計算它們的平方根,也就是代碼中的d = diag(C); sd = sqrt(d)'
當我們的值越大,我們圖像分割的效果越不明顯。
當值在10的時候,對于此圖,效果是最好的:
總結
以上是生活随笔為你收集整理的Matlab数字图像处理学习记录【5】——彩色图像处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想微型计算机拆装图解,笔记本电脑的拆卸
- 下一篇: 步进电机、伺服电机、舵机、无刷电机、有刷