日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Matlab数字图像处理学习记录【5】——彩色图像处理

發(fā)布時(shí)間:2024/8/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Matlab数字图像处理学习记录【5】——彩色图像处理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

彩色圖像處理

  • 一.Matlab中彩色圖像的表示方法
    • 1.1RGB圖像
    • 1.2索引圖像
    • 1.3用來處理RGB圖像或索引圖像的IPT函數(shù)
  • 二.轉(zhuǎn)換值其他彩色空間
    • 2.1NTSC彩色空間
    • 2.2YCbCr彩色空間
    • 2.3HSV色彩空間
    • 2.4CMY和CMYK彩色空間
    • 2.5 HSI彩色空間
  • 三.彩色圖像處理基礎(chǔ)
  • 四.彩色變換
  • 五.彩色圖像的空間濾波
    • 5.1彩色圖像平滑
    • 5.2彩色圖像銳化
  • 六.在RGB向量空間直接處理
    • 6.1使用梯度的彩色邊緣檢測
    • 6.2 RGB向量空間中的圖像分割

一.Matlab中彩色圖像的表示方法

一般來說在IPT里,彩色圖像被當(dāng)做索引圖像和RGB圖像來處理。所以重點(diǎn)學(xué)習(xí)這兩個(gè)圖像。

1.1RGB圖像

這個(gè)沒啥說的,就是將紅綠藍(lán)三色圖像組合起來。當(dāng)然,可以用cat將圖像組合起來。
frgb = cat(dim, fr, fg, fb) dim是將后者矩陣疊加的維度。此處寫3即可。
當(dāng)然,也可以通過切片的方式來分割成圖像分量:
fR = frgb(:, :, 1); 、fG = frgb(:, :, 2);、fB = frgb(:, :, 3);
創(chuàng)建函數(shù),建立一個(gè)可以自定義觀測角度的RGB立方體:

%使用rgbcube展示RGB彩色立方體示意圖 function rgbcube(vx,vy,vz) %rgbcube用于展示RGB彩色立方體示意圖,其中觀測的角度是(vx,vy,vz)。如果無輸入角度,默認(rèn)為(10104. patch('Vertices',vertices_matrix,'Faces',faces_matrix,'FaceVertexCData',colors,'FaceColor','interp','EdgeAlpha',0) %處理觀測點(diǎn) if nargin==0vx=10;vy=10;vz=4; elseif nargin~=3error('Wrong number of inputs.') end axis off%取消對坐標(biāo)軸的一切設(shè)置 view([vx, vy, vz])%輸入觀測點(diǎn) axis square%使繪圖區(qū)域?yàn)檎叫?

傳參即可

rgbcube(0.7, 0.2, 0.3)

1.2索引圖像

索引圖像有兩個(gè)分量。一個(gè)是數(shù)據(jù)矩陣X,一個(gè)是色彩映射矩陣map。
映射矩陣map存放顏色數(shù)據(jù),長度由顏色的數(shù)量決定。數(shù)據(jù)矩陣則是存放指向映射矩陣的索引值。
這樣做的好處就是,假設(shè)需要更換顏色類型。那么直接修改map即可,而不需要對數(shù)據(jù)矩陣進(jìn)行復(fù)雜的變換操作。
若需要顯示該圖像,一般使用
imshow(X, map)或者image(X)、colormap(map).
可以通過[Y, newmap] = imapprox(X, map, n)
利用該函數(shù),將X和map 變?yōu)椴怀^n中顏色的新組合Y和newmap但注意其對值矩陣的縮放。
指定色彩圖像,可以用:
map(k, :) = [r(k), g(k), b(k)]
其中[r(k), g(k), b(k)]是RGB值,指定色彩映射的一行,變化k的值,就可以填充滿整個(gè)圖。
修改圖像的背景色可以用
whitebg(),推薦填RGB值,當(dāng)然也可以填名字:

在顯示圖像,或者置映射map的時(shí)候,我們可以用預(yù)設(shè)的彩色映射:

1.3用來處理RGB圖像或索引圖像的IPT函數(shù)


比如dither,可以用于灰度圖和彩色圖像(但是我試了RGB不行, 只能單通道),比如在灰度圖里,使用它可以在白色背景上添加黑點(diǎn)得到灰色調(diào)。也就是用二值化的圖模擬灰度圖。
用法bw = dither(gray_image)

gray_image = imread('gray.jpg'); bw = dither(gray_image); subplot(1,2,1); imshow(gray_image); subplot(1,2,2); imshow(bw);

在處理彩色圖像的時(shí)候,抖動(dòng)函數(shù)需要和rgb2ind結(jié)合使用,這個(gè)函數(shù)后面討論。
然后就是通過一個(gè)閾值,將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?
如果將標(biāo)量n改為向量v,則可以自定義映射map的大小。其中向量v的取值在[0,1]之間,函數(shù)會(huì)自己縮放。
利用[X, map] = gray2ind(gray_image, n)縮放后,會(huì)用彩色映射,也就是表6.2中的gray(n)進(jìn)行轉(zhuǎn)換。若n省略,則默認(rèn)64.
ind2gary()同理。
[X, map] = rgb2ind(rgb_image, n, dither_option) 參數(shù)同灰度圖,不過多了個(gè)參數(shù)。
若填字符串dither則執(zhí)行抖動(dòng),會(huì)提高空間分辨率達(dá)到更好的顏色分辨力。nodither則是將顏色映射到新圖上最金額近的顏色。
rgb_image = ind2rgb(X, map)和gray_image = rgb2gray(rgb_image)同理。

二.轉(zhuǎn)換值其他彩色空間

2.1NTSC彩色空間

NTSC色彩空間中,顏色由亮度Y、色調(diào)I、飽和度Q組成。
亮度描述灰度信息,色調(diào)和飽和度描述彩色信息。
轉(zhuǎn)換公式:
[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????
轉(zhuǎn)換函數(shù)為:yiq_image = rgb2ntsc(rgb_image)
輸出為double類圖像,當(dāng)然還是可以通過切片提取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????
函數(shù)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????
函數(shù)ycbcr_image = rgb2ycbcr(rgb_image)和rgb_image = ycbCr2rgb(ycbcr_image)

2.3HSV色彩空間

HSV(色調(diào)、飽和度、亮度)是較常用的一種模型。

色調(diào)是圍繞彩色六邊形的角度來描述的。沿錐體的軸來測量值,也就是我這里說的亮度。V = 0時(shí),軸的末端為黑色,V=1是,州的末端為白色。比如要制作呼吸燈,那么保持HS不變,變化V的大小,即可完成在近似相同的顏色的情況下調(diào)整亮度。RGB轉(zhuǎn)HSV的方法就是將RGB坐標(biāo)系映射指柱坐標(biāo)系,這里沒有推導(dǎo),可以去別處看。
函數(shù)是:hsv_image = rgb2hsv(rgb_image)和rgb_image = hsv2rgb(hsv_image)。

2.4CMY和CMYK彩色空間

一般用于打印機(jī)內(nèi)部的顏色。

理論上,等量的顏料原色即青色、品紅色和黃色混合會(huì)產(chǎn)生黑色。在實(shí)踐中,將這些顏色加以混合來印刷會(huì)生成一幅模糊不清的黑色圖像。所以,為了生成一種純正的黑色(打印中使用的主要顏色),便要添加第四種顏色,即黑色,從而出現(xiàn)了CMYK彩色模型。這樣,當(dāng)出版者談?wù)摗八纳∷ⅰ睍r(shí),他們其實(shí)是在說CMY彩色模型的三種顏色加上黑色。
函數(shù):cmy_image = imcomplement(rgb_image)和rgb_image = imcomplement(cmy_image)

2.5 HSI彩色空間

HSI(hue色度;saturation飽和度,intensity亮度)彩色空間,該模型將亮度分量用途一幅彩色圖像中攜帶的彩色信息分開,是一種對于開發(fā)基于彩色描述的圖像處理算法是個(gè)理想的工具。
其推導(dǎo)過程:

  • 如在6.1.1節(jié)中討論過的那樣,RGB彩色圖像是由三幅單色的亮度圖像構(gòu)成的,所以一定可以從一幅RGB圖像中提取出亮度。若拿圖6.2所示的彩色立方體來看,一切就很清楚。假設(shè)我們站在黑色頂點(diǎn)(0,0,0)處,如圖6.6(a)所示,它的正上方是白色頂點(diǎn)(1,1,1)。再同圖6.2聯(lián)系起來看,亮度是沿著連接著兩個(gè)點(diǎn)的連線分布的。在圖6.6所示的排列中,這條連接黑色和白色頂點(diǎn)的線(亮度軸)是垂直的。因此,若想確定圖6.6中任意彩色點(diǎn)的亮度分量,我們就需要經(jīng)過一個(gè)包含該點(diǎn)且垂直于亮度軸的平面。這個(gè)平面和亮度軸的交點(diǎn)就給出了范圍在[0,1]之間的亮度值。我們也注意到飽和度是一個(gè)與亮度軸之間的距離的函數(shù)。事實(shí)上,亮度軸上的點(diǎn)的飽和度為零,亮度軸上的所有點(diǎn)都是灰色的這個(gè)事實(shí)是很顯然的。為了弄清從一個(gè)給定RGB點(diǎn)確定色調(diào)的方式,可參考圖6.6(b),它顯示了一個(gè)由三個(gè)點(diǎn)(黑色、白色和青色)所定義的平面。該平面上含有黑色和白色頂點(diǎn)的事實(shí)告訴我們亮度軸同樣在這個(gè)平面上。此外,可以看到由亮度軸和立方體邊界共同定義的平面上的所有點(diǎn)都有相同的色調(diào)(在此例中為青色)。這是因?yàn)樵谝粋€(gè)彩色三角形內(nèi),顏色是由這三個(gè)頂點(diǎn)顏色的多種多樣的組合或者混合而成的。若這些頂點(diǎn)中的兩個(gè)是黑色和白色,第三個(gè)頂點(diǎn)是-一個(gè)彩色的點(diǎn),則這個(gè)三角形中所有點(diǎn)的色調(diào)都是相同的,因?yàn)榘咨秃谏至繉τ谏实淖兓瘺]有影響(當(dāng)然,在這個(gè)三角形中,點(diǎn)的亮度和飽和度會(huì)變化)。以垂直的強(qiáng)度軸旋轉(zhuǎn)這個(gè)個(gè)陰影平面,可以獲得不同的色調(diào)。
  • 圖6.7(b)顯示了六邊形和一個(gè)任意的彩色點(diǎn)(用點(diǎn)的形式顯示)。這個(gè)點(diǎn)的色調(diào)是由其與某參考點(diǎn)的夾角決定的。一般來說(但也不總是如此),與紅色軸的夾角為0°,色調(diào)在此處按逆時(shí)針方向增加。飽和度(距垂直軸的距離)是從原點(diǎn)到該點(diǎn)的向量的長度。注意,原點(diǎn)由該彩色平面與垂直亮度軸的交點(diǎn)定義。HSI彩色空間的重要分量包括垂直亮度軸、到彩色點(diǎn)的向量長度以及該向量與紅色軸間的夾角。因此,當(dāng)用剛才討論過的六邊形甚至如圖6.7?和如圖6.7(d)所示的三角形或圓形時(shí),這些形式定義一個(gè)HSI平面是不足為奇的。選擇哪種形狀是不重要的,因?yàn)槿我庖环N形狀都可以通過幾何變換變換成另一種形狀。圖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?θ,?BGG??θ=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轉(zhuǎn)換為RGB則是根據(jù)H來決定
  • RG區(qū)(0°≤H<120°)
    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)
  • GB區(qū)(120°≤H<240°)
    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)
  • BR區(qū)(240°≤H<360°)
    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)
    那么代碼為:
  • function rgb = hsi2rgb(hsi) %HSI2RGB Converts an HSI image to RGB. % RGB = HSI2RGB(HSI) converts an HSI image to RGB, where HSI is % assumed to be of class double with: % hsi(:, :, 1) = hue image, assumed to be in the range % [0, 1] by having been divided by 2*pi. % hsi(:, :, 2) = saturation image, in the range [0, 1]. % hsi(:, :, 3) = intensity image, in the range [0, 1]. % % The components of the output image are: % rgb(:, :, 1) = red. % rgb(:, :, 2) = green. % rgb(:, :, 3) = blue. % Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins % Digital Image Processing Using MATLAB, Prentice-Hall, 2004 % $Revision: 1.5 $ $Date: 2003/10/13 01:01:06 $ % Extract the individual HSI component images. H = hsi(:, :, 1) * 2 * pi; S = hsi(:, :, 2); I = hsi(:, :, 3); % Implement the conversion equations. R = zeros(size(hsi, 1), size(hsi, 2)); G = zeros(size(hsi, 1), size(hsi, 2)); B = zeros(size(hsi, 1), size(hsi, 2)); % RG sector (0 <= H < 2*pi/3). idx = find( (0 <= H) & (H < 2*pi/3)); B(idx) = I(idx) .* (1 - S(idx)); R(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx)) ./ cos(pi/3 - H(idx))); G(idx) = 3*I(idx) - (R(idx) + B(idx)); % BG sector (2*pi/3 <= H < 4*pi/3). idx = find( (2*pi/3 <= H) & (H < 4*pi/3) ); R(idx) = I(idx) .* (1 - S(idx)); G(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 2*pi/3) ./ cos(pi - H(idx))); B(idx) = 3*I(idx) - (R(idx) + G(idx)); % BR sector. idx = find( (4*pi/3 <= H) & (H <= 2*pi)); G(idx) = I(idx) .* (1 - S(idx)); B(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 4*pi/3) ./cos(5*pi/3 - H(idx))); R(idx) = 3*I(idx) - (G(idx) + B(idx)); % Combine all three results into an RGB image. Clip to [0, 1] to % compensate for floating-point arithmetic rounding effects. rgb = cat(3, R, G, B); rgb = max(min(rgb, 1), 0); function hsi = rgb2hsi(rgb) %RGB2HSI Converts an RGB image to HSI. % HSI = RGB2HSI(RGB) converts an RGB image to HSI. The input image % is assumed to be of size M-by-N-by-3, where the third dimension % accounts for three image planes: red, green, and blue, in that % order. If all RGB component images are equal, the HSI conversion % is undefined. The input image can be of class double (with values % in the range [0, 1]), uint8, or uint16. % % The output image, HSI, is of class double, where: % hsi(:, :, 1) = hue image normalized to the range [0, 1] by % dividing all angle values by 2*pi. % hsi(:, :, 2) = saturation image, in the range [0, 1]. % hsi(:, :, 3) = intensity image, in the range [0, 1]. % Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins % Digital Image Processing Using MATLAB, Prentice-Hall, 2004 % $Revision: 1.4 $ $Date: 2003/09/29 15:21:54 $ % Extract the individual component immages. rgb = im2double(rgb); r = rgb(:, :, 1); g = rgb(:, :, 2); b = rgb(:, :, 3); % Implement the conversion equations. num = 0.5*((r - g) + (r - b)); den = sqrt((r - g).^2 + (r - b).*(g - b)); theta = acos(num./(den + eps)); H = theta; H(b > g) = 2*pi - H(b > g); H = H/(2*pi); num = min(min(r, g), b); den = r + g + b; den(den == 0) = eps; S = 1 - 3.* num./den; H(S == 0) = 0; I = (r + g + b)/3; % Combine all three results into an hsi image. hsi = cat(3, H, S, I);

    三.彩色圖像處理基礎(chǔ)

    一般把彩色圖像處理細(xì)分為三個(gè)主要類別:

  • 顏色變換
  • 單獨(dú)顏色平面的空間處理
  • 顏色向量處理
  • 第一類就類似于處理每個(gè)彩色平面的像素,以像素值為基礎(chǔ),處理方法類似。而第二類則對各個(gè)彩色平面空間進(jìn)行空間濾波。第三類則是同時(shí)處理所有分量。每個(gè)像素則為一個(gè)向量:
    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)????
    為了使獨(dú)立的彩色分量和以向量為基礎(chǔ)的處理都相同,必須滿足兩個(gè)條件:
    首先,處理要對向量和標(biāo)量都可以用。
    對向量的每個(gè)分量的運(yùn)算必須獨(dú)立于其他分量。

    四.彩色變換

    在單個(gè)彩色模型的情況下,處理彩色圖像的彩色分量或單色圖像的亮度分量。對于彩色圖像有: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中的彩色分量數(shù)。該方程描述把灰度級轉(zhuǎn)換成任意顏色的映射,這一處理常稱為偽彩色變換或偽彩色映射。注意,若令r1=r2= r3=r,則第一個(gè)方程可用來處理RGB中的單色圖像。
    第3章已介紹過一些灰度變換:

  • imcomplement,它計(jì)算一幅圖像的負(fù)片,與被變換圖像的灰度級內(nèi)容無關(guān)。
  • 另外,如果與灰度級分布有關(guān)的histeq是自適應(yīng)的,則一旦估計(jì)了必要的參數(shù),變換就會(huì)固定。
  • imadjust,它要求使用者選擇合適的曲線形狀參數(shù),且最好是交互式地指定。當(dāng)用偽彩色和全彩色映射時(shí),尤其是涉及到人的觀察和說明(如彩色平衡)時(shí),存在相似的情況。
  • 在這些應(yīng)用中,直接產(chǎn)生候選函數(shù)的圖形表示并在被處理圖像上觀察其組合效果(實(shí)時(shí))的方法,是選擇合適的映射函數(shù)的最好方法。
    使用雙插值z=interp1q(x, y, xi)可以用圖形來指定映射函數(shù)。
    它返回一個(gè)列向量,該向量包括在點(diǎn)xi處使用-維函數(shù)z線性插值的值。列向量x和y指定控制點(diǎn)的水平和垂直坐標(biāo)。x的元素必須單調(diào)增長。z的長度等于xi的長度。
    例如:z = interp1q([0 255]', [0 255]', [0: 255]')則產(chǎn)生了一個(gè)產(chǎn)生一個(gè)有著256個(gè)元素的一一映射,以連接控制點(diǎn)(0,0)和(255,255),即z=[ 012…255]’。
    三次樣條插值函數(shù)則是:z=interp1q(x, y, xi)
    交互式產(chǎn)生變換函數(shù)可以用ice生成:
    g = ice ( 'Property Name ', 'Property value', . . .)
    其中,Property Name和Property value必須成對出現(xiàn),并且這些點(diǎn)表示由相應(yīng)輸入對所組成的模式的重復(fù)。表6.4列出了ice函數(shù)中的正確搭配。一些例子將在本章稍后給出。
    關(guān)于wait參數(shù),當(dāng)顯式地或默認(rèn)地選擇on時(shí),輸出g是處理后的圖像。在這種情況下,ice將控制處理,包括光標(biāo),因而在命令窗口不必鍵入任何命令,直到函數(shù)關(guān)閉,這時(shí)最后的結(jié)果就是圖像g。當(dāng)選擇off時(shí),g為處理后的圖像的句柄,并且控制會(huì)立即返回到命令窗口;因此,在函數(shù)ice仍處于活動(dòng)狀態(tài)時(shí),可以鍵入新的命令。為了用句柄g獲得圖像的屬性,我們使用get函數(shù)h=get(g)



    不過ice這個(gè)函數(shù)好像沒有,但是Google到了其源碼,下載地址:http://fourier.eng.hmc.edu/e161/dipum/ice.m
    然后發(fā)現(xiàn)這個(gè)網(wǎng)頁基本上涵蓋了該書所有要自定義的函數(shù)。
    下載ice.m和ice.fig即可運(yùn)行:

    f = imread('./test.jpg'); ice('image', f)


    五.彩色圖像的空間濾波

    5.1彩色圖像平滑

    其思想還是對三個(gè)通道的顏色“求平均”,假設(shè)Sxy是彩色圖像中以(x,y)為中心的領(lǐng)域的一組坐標(biāo)。其平均值是:
    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通過對三個(gè)通道分別濾波,再疊加即可成為fc_imfilter。
    當(dāng)然也可以對HSI圖像進(jìn)行濾波。

    fc = imread('./test.jpg'); R = fc(:,:,1); G = fc(:,:,2); B = fc(:,:,3); h = rgb2hsi(fc); H = h(:, :, 1); S = h(:, :, 2) ; I = h(:, :, 3); w = fspecial('average', 25); I_filtered = imfilter(I, w,'replicate'); h = cat(3,H, S, I_filtered); f = hsi2rgb(h); f = min(f, 1); fR = imfilter(R, w, 'replicate'); fG = imfilter(G, w, 'replicate'); fB = imfilter(B, w, 'replicate'); frgb = cat(3,fR, fG, fB); subplot(1,3,1); imshow(fc); subplot(1,3,2); imshow(frgb); subplot(1,3,3); imshow(f);

    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)????

    fb = imread('./test.jpg'); lapmask = [1 1 1; -8 1 1; 1 1 1]; fen = imsubtract(fb, imfilter(fb, lapmask, 'replicate')); subplot(1, 2, 1); imshow(fb); subplot(1, 2, 2); imshow(fen)

    六.在RGB向量空間直接處理

    因?yàn)橛行r(shí)候,疊加后的信息,并不等于分離后再疊加。所以需要直接對[RGB]這向量進(jìn)行操作。

    6.1使用梯度的彩色邊緣檢測

    二維函數(shù)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| ?fGx?+Gy?
    梯度:
    α(x,y)=arctan(GyGx)\alpha(x,y)=arctan(\frac{G_y}{G_x}) α(x,y)=arctan(Gx?Gy??)
    當(dāng)然離散化的情況下,可以用卷積核代替:

    將這個(gè)思維拓展到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?bv=?y?R?r+?y?G?g+?y?B?b
    點(diǎn)積:
    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
    封裝成函數(shù):colorgrad:

    function [VG, A, PPG]= colorgrad(f, T) %COLORGRAD Computes the vector gradient of an RGB image. % [VG, VA, PPG] = COLORGRAD(F, T) computes the vector gradient, VG, % and corresponding angle array, VA, (in radians) of RGB image % F. It also computes PPG, the per-plane composite gradient % obtained by summing the 2-D gradients of the individual color % planes. Input T is a threshold in the range [0, 1]. If it is % included in the argument list, the values of VG and PPG are % thresholded by letting VG(x,y) = 0 for values <= T and VG(x,y) = % VG(x,y) otherwise. Similar comments apply to PPG. If T is not % included in the argument list then T is set to 0. Both output % gradients are scaled to the range [0, 1].% Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins % Digital Image Processing Using MATLAB, Prentice-Hall, 2004 % $Revision: 1.6 $ $Date: 2003/11/21 14:27:21 $if (ndims(f) ~= 3) | (size(f, 3) ~= 3)error('Input image must be RGB.'); end% Compute the x and y derivatives of the three component images % using Sobel operators. sh = fspecial('sobel'); sv = sh'; Rx = imfilter(double(f(:, :, 1)), sh, 'replicate'); Ry = imfilter(double(f(:, :, 1)), sv, 'replicate'); Gx = imfilter(double(f(:, :, 2)), sh, 'replicate'); Gy = imfilter(double(f(:, :, 2)), sv, 'replicate'); Bx = imfilter(double(f(:, :, 3)), sh, 'replicate'); By = imfilter(double(f(:, :, 3)), sv, 'replicate');% Compute the parameters of the vector gradient. gxx = Rx.^2 + Gx.^2 + Bx.^2; gyy = Ry.^2 + Gy.^2 + By.^2; gxy = Rx.*Ry + Gx.*Gy + Bx.*By; A = 0.5*(atan(2*gxy./(gxx - gyy + eps))); G1 = 0.5*((gxx + gyy) + (gxx - gyy).*cos(2*A) + 2*gxy.*sin(2*A));% Now repeat for angle + pi/2. Then select the maximum at each point. A = A + pi/2; G2 = 0.5*((gxx + gyy) + (gxx - gyy).*cos(2*A) + 2*gxy.*sin(2*A)); G1 = G1.^0.5; G2 = G2.^0.5; % Form VG by picking the maximum at each (x,y) and then scale % to the range [0, 1]. VG = mat2gray(max(G1, G2));% Compute the per-plane gradients. RG = sqrt(Rx.^2 + Ry.^2); GG = sqrt(Gx.^2 + Gy.^2); BG = sqrt(Bx.^2 + By.^2); % Form the composite by adding the individual results and % scale to [0, 1]. PPG = mat2gray(RG + GG + BG);% Threshold the result. if nargin == 2VG = (VG > T).*VG;PPG = (PPG > T).*PPG; end

    寫代碼:

    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彩色向量進(jìn)行彩色區(qū)域分割是很簡單的。假設(shè)我們的目的是在RGB圖像中分割一個(gè)特定彩色范圍的物體。給定一組感興趣的彩色(或彩色范圍)描述的彩色樣本點(diǎn),我們獲得一個(gè)“平均”的顏色估計(jì),它是我們希望分割的那種顏色。讓這種平均色用RGB列向量m來定義。分割的目的是對圖像中的每一個(gè)RGB像素進(jìn)行分類,使其在指定的范圍內(nèi)有一種顏色或沒有顏色。為執(zhí)行這一比較,我們需要一個(gè)相似性度量。最簡單的度量之一是歐幾里得距離。令z表示RGB空間的任意點(diǎn)。若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
    其中||·||是參量的范數(shù),下標(biāo)R、G和B表示向量m和z的RGB分量。D(z,m)≤T的點(diǎn)的軌跡是一個(gè)半徑為T的實(shí)心球體。由定義可知,包含在球體內(nèi)部或表面的點(diǎn)滿足特定的彩色準(zhǔn)則;而球體外面的點(diǎn)則不滿足。在圖像中對這兩組點(diǎn)編碼,如黑的和白的,產(chǎn)生一幅二值分割圖像。
    對前述方程一個(gè)有用歸納是距離:
    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是我們要分割的彩色的樣值表示的協(xié)方差矩陣。該距離稱為Mahalanobis距離。D(z, m)≤T的點(diǎn)的軌跡描述了一個(gè)實(shí)心三維橢圓體,它的重要屬性是其主軸取在最大的數(shù)據(jù)擴(kuò)展方向上。當(dāng)C等于單位矩陣I時(shí),Mahalanobis距離約簡為歐幾里得距離。除了現(xiàn)在數(shù)據(jù)包含在橢球體內(nèi)而不是包含在圓球體內(nèi)之外,分割和在前段描述過的一樣。

    其函數(shù)為:S = colorseg(method, f, T, parameters)
    其中,method不是euclidean就是mahalanobis,f是待分割的RGB 圖像,T是前邊描述過的閾值。若選擇euclidean,則輸入?yún)?shù)是m,若選擇mahalanobis,則輸人參數(shù)是m和c。參數(shù)m是一個(gè)在上面描述過的向量m,它的形式不是行就是列,并且c是3×3協(xié)方差矩陣C。
    輸出s是一幅二值圖像(和原始圖像同樣大小),在未通過閾值測試的點(diǎn)包含0,在通過了閾值測試的點(diǎn)包含1。1表示從基于彩色內(nèi)容的f中分割的區(qū)域。
    colorseg的代碼:在http://fourier.eng.hmc.edu/e161/dipum/下載:imstack2vectors.m、covmatrix.m、colorseg.m

    f = imread('test.jpg'); mask = roipoly(f); red = immultiply(mask, f(:,:,1)); green = immultiply(mask, f(:,:,2)); blue = immultiply(mask, f(:,:,3)); g = cat(3, red, green, blue); figure; [M, N, K] = size(g); I = reshape(g, M * N, 3); idx = find(mask); I = double(I(idx, 1:3)); [C, m] = covmatrix(I); d = diag(C); sd = sqrt(d)' subplot(1,4,1); E25 = colorseg('euclidean', f, 25, m); imshow(E25); subplot(1,4,2); E50 = colorseg('euclidean', f, 50, m); imshow(E50); subplot(1,4,3); E75 = colorseg('euclidean', f, 75, m); imshow(E75); subplot(1,4,4); E100 = colorseg('euclidean', f, 100, m); imshow(E100);

    先選中卡通人物的衣服:

    然后得到圖像:

    其中C的主對角線包括RGB分量的方差,所以我們必須提取這些元素并計(jì)算它們的平方根,也就是代碼中的d = diag(C); sd = sqrt(d)'
    當(dāng)我們的值越大,我們圖像分割的效果越不明顯。
    當(dāng)值在10的時(shí)候,對于此圖,效果是最好的:

    總結(jié)

    以上是生活随笔為你收集整理的Matlab数字图像处理学习记录【5】——彩色图像处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。