1. 程式人生 > >第六章 彩色影象處理

第六章 彩色影象處理

MATLAB中影象的表示

影象處理工具箱會將彩色影象當做索引影象或RGB影象(紅,綠,藍)來處理。

RGB影象

一幅RGB影象是一個M * N * 3的彩色畫素陣列,其中每個色彩畫素是一個三值組,這三個值分別對應一個特定空間位置處該RGB影象的紅,綠,藍分量。
RGB影象
另 fR,fG,fB分別表示三幅RGB影象,一幅RGB影象就是使用cat(連線)運算子通過堆疊這些分量影象形成的:rgb_image = cat(3,fR,fG,fB),該運算中,要求影象按順序放置。
用下面的命令提取三幅分量影象:
fR = rgb_image(:,:,1)
fG = rgb_image(:,:,2)
fB = rgb_image(:,:,3)
RGB色彩空間通常以圖解方式顯示為一個RGB色彩立方體
這裡寫圖片描述


為從任意角度檢視該彩色立方體,可使用自定義函式 rgbcube(vx,vy,vz)

rgbcube(5,5,2)

彩色立方體

索引影象

索引影象有兩個分量:一個整數資料矩陣X和一個彩色對映矩陣map.矩陣map是一個m*3的double類陣列,其值是區間[0,1]上的浮點數。
要顯示一幅索引影象,可寫出imshow(x,map)image(x);colormap(map)
有時需要用具有較少顏色的對映去近似一個索引對映。為此,我們使用函式imapprox
語法:[Y,newmap] = imapprox(X,map,n)

處理RGB和索引影象的函式

dither 採用“抖動”方法從RGB影象建立索引影象
grayslice 從灰度影象通過閾值處理建立索引影象
gray2ind 從灰度影象建立索引影象
ind2gray 從索引影象建立灰度影象
rgb2ind 從RGB影象建立索引影象
ind2rgb 從索引影象建立RGB影象
rgb2gray 從RGB影象建立灰度影象

使用dither
dither
使用grayslice
grayslice

[X map]=rgb2ind(f,256);subplot(241),imshow(X,map);title('256索引'
); [X map]=rgb2ind(f,128);subplot(242),imshow(X,map);title('128索引'); [X map]=rgb2ind(f,64);subplot(243),imshow(X,map);title('64索引'); [X map]=rgb2ind(f,32);subplot(244),imshow(X,map);title('32索引'); [X map]=rgb2ind(f,16);subplot(245),imshow(X,map);title('16索引'); [X map]=rgb2ind(f,8);subplot(246),imshow(X,map);title('8索引'); [X map]=rgb2ind(f,4);subplot(247),imshow(X,map);title('4索引'); [X map]=rgb2ind(f,2);subplot(248),imshow(X,map);title('2索引');

索引影象

彩色空間轉換

顏色基本概念:

  • 亮度

    明亮程度,光作用於人眼時所引起的明亮程度不同。
    它與被觀察物體的發光強度有關,強度大小,決定我們的感覺亮或暗。
    如果彩色光的強度降到使人們看不到了,在亮度這個分量上他就以黑色對應,如果其強度變得很大,那麼亮度就以白色對應。亮度是非彩色的屬性,它描述亮還是暗,彩色圖象中的亮度對應於黑白圖象中的灰度。
    對同一物體照射的光越強,反射光也越強,則越亮。
    對不同物體在相同照射情況下,發射越強者看起來越亮。(例如:鏡子的反射)
    亮度還與人類視覺系統的視覺敏感函式相關,即使強度相同,不同顏色的光當照射同一物體時也會產生不同的亮度。

  • 色調

    明亮程度,光作用於人眼時所引起的明亮程度不同。
    它與被觀察物體的發光強度有關,強度大小,決定我們的感覺亮或暗。
    如果彩色光的強度降到使人們看不到了,在亮度這個分量上他就以黑色對應,如果其強度變得很大,那麼亮度就以白色對應。亮度是非彩色的屬性,它描述亮還是暗,彩色圖象中的亮度對應於黑白圖象中的灰度。
    對同一物體照射的光越強,反射光也越強,則越亮。
    對不同物體在相同照射情況下,發射越強者看起來越亮。(例如:鏡子的反射)
    亮度還與人類視覺系統的視覺敏感函式相關,即使強度相同,不同顏色的光當照射同一物體時也會產生不同的亮度。

  • 飽和度

    飽和度是指顏色的純度即摻入白光的程度。
    飽和度(saturation)是顏色的另一個屬性,它描述純顏色用白色沖淡的程度,高飽和度的顏色含有較少的白色。
    飽和度也是可以指顏色的深淺程度。對於同一個色調的彩色光,飽和度越深顏色越鮮明或者說越純。
    例如:當紅色加進白光之後沖淡為粉紅色,其基本色調還是紅色,但飽和度降低;也就是說,淡色的飽和度比鮮豔的顏色要低一些。
    飽和度還和亮度有關,如果在就飽和的彩色光中加入白光的成分,增加了光的強度,會變得更亮,但它的飽和度降低了。如果在某色調的彩色光中,摻入別的彩色光,則會引起色調的變化,既基本的顏色變了,只有摻入白光時,僅僅引起飽和度的變化。

  • 色度

    通常,把色調和飽和度稱為色度,則亮度表示某彩色光的明亮程度,色度表示顏色的類別和深淺程度。

NTSC彩色空間

NTSC彩色空間用於模擬電視。這種格式的主要優勢是灰度資訊和彩色資料是分離開來的,所以同一訊號可以用於彩色電視機和黑白電視機。在NTSC格式中,影象資料由三部分組成:亮度(Y)、色調(I)和飽和度(Q)。在這裡,字母YIQ的選擇常常是按照慣例進行的。亮度分量描述灰度資訊,其他兩個分量攜帶電視訊號的彩色資訊。YIQ分量都是用線性變換從一幅影象的RGB分量得到的:

NTSC

f = imread('hua.png');
g = rgb2ntsc(f);
subplot(121),imshow(f),title('原圖');
subplot(122),imshow(g),title('rgb2ntsc');

相應的函式ntsc2rgb可以將圖片轉化回去
rgb2ntsc

YCbCR彩色空間

YCbCr彩色空間廣泛用於數字視訊。在這種格式中,亮度資訊用單獨的分量Y來表示,彩色資訊是用兩個色差分量Cb和Cr來儲存的。分量Cb是藍色分量與參考值的差,分量Cr是紅色分量與參考值的差。工具箱採用的從RGB轉換為YcbCr的變換是:

g = rgb2ycbcr(f);
subplot(121),imshow(f),title('原圖');
subplot(122),imshow(g),title('rgb2ycbcr');

相應的函式ycbr2rgb可以將圖片轉化回去
ycbcr

HSV彩色空間

HSV(色調、飽和度、值)是人們用來從顏色輪或調色盤中挑選顏色(例如顏料或墨水)時使用的彩色系統之一,值得考慮的是,這個顏色系統比RGB系統更接近人們的經驗和對彩色的感知。在畫家的術語裡,色調、飽和度和數值被稱作色調、明暗和色值。
HSV彩色空間可以通過從RGB彩色立方體沿灰度軸(連線黑色頂點和白色頂點的軸)用公式來表達,從而得出圖6-5(a)所示的六邊形表示的彩色調色盤。當我們沿著圖6-5(b)中的垂直軸(灰)軸移動時,這個與軸垂直的六邊形平面的大小是變化的,併產生了圖中描述的量。
這裡寫圖片描述這裡寫圖片描述

g = rgb2hsv(f);
subplot(121),imshow(f),title('原圖');
subplot(122),imshow(g),title('rgb2hsv');

使用函式rgb2hsv,hsv2rgb可以轉換回去
rgb2hsv

CMY和CMYK彩色空間

imcomplement
imcomplement

HSI彩色空間

HSI模型是美國色彩學家孟塞爾(H.A.Munseu)於1915年提出的,它反映了人的視覺系統感知彩色的方式,以色調、飽和度和強度三種基本特徵量來感知顏色。
rgb = rgb2hsi(‘img’),rgb = hsi2rgb(‘img’)可以轉換回來
rgb2hsi

彩色影象處理的基礎知識

1) 顏色變換(也叫彩色對映)
2) 單獨彩色平面的空間處理
3) 顏色向量的處理

  • ice函式(互動顏色編輯)
    屬 性 名 屬 性 值
    image 一幅RGB或單色輸入影象f,由互動指定的對映來變換
    space 被修改的分量彩色空間。可能的值是’rgb’、’cmy’、’hsi’、’hsv’、’ntsc’(或’yiq’)和’ycbcr’,預設值是’rgb’
    wait 如果是’on’(預設),g是被對映的影象;如果是’off’,g是對映輸入影象的控制代碼
g = ice('image',f);
![ice](https://img-blog.csdn.net/20170628173852874?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![這裡寫圖片描述](https://img-blog.csdn.net/20170628174242345?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![這裡寫圖片描述](https://img-blog.csdn.net/20170628174909261?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![這裡寫圖片描述](https://img-blog.csdn.net/20170628192501656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![這裡寫圖片描述](https://img-blog.csdn.net/20170629133220145?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzY3NzE4NTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

彩色影象的空間濾波

彩色影象平滑

  • 抽取三幅分量圖
f = imread('hua.png');
 fR = f(:, :, 1);
fG = f(:, :, 2);
fB = f(:, :, 3);
subplot(221);imshow(f);title('原圖');
subplot(222);imshow(fR);title('原圖');
subplot(222);imshow(fR);title('RED');
subplot(223);imshow(fG);title('GREEN');
subplot(224);imshow(fB);title('BLUE');

這裡寫圖片描述

  • 分別對每幅分量影象濾波
w = fspecial('average',5);
fR_filtered = imfilter(fR,w,'replicate');
fR_filtered = imfilter(fG,w,'replicate');
fR_filtered = imfilter(fB,w,'replicate');
  • 重建濾波後的RGB影象
fc_filtered = cat(3,fR_filtered,fG_filtered,fB_filtered);

rgb
上訴三步可以合併為:fc_filtered = imfilter(f,w,’replicate’);

HSI亮度分量平滑

h = rgb2hsi(f);
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);
fc = hsi2rgb(h);
imshow(fc)

hsi

彩色影象銳化

w = fspecial('average',5);
fa = imfilter(f, w, 'replicate');
lapmask = [1 1 1; 1 -8 1; 1 1 1];
fen = imsubtract(fa, imfilter(fa, lapmask, 'replicate'));
subplot(121),imshow(fa);
subplot(122),imshow(fen);

銳化

直接在RGB向量空間的處理

使用梯度進行色彩邊緣檢測

[VG,A,PPG] = colorgrad(f);

其中,f是RGB影象,T是[0,1]範圍內的閾值選項(預設為0);VG是RGB向量梯度Fθ(x, y);A是以弧度計的角度θ(x, y),並且PPG是由單獨彩色平面的2D梯度之和形成的梯度影象。計算上述方程時,要求全部微分都可用函式clorgrad中的Sobel運算元來實現。輸出VG和PPG通過clorgrad被歸一化到[0, 1]範圍內,並且把它們作為閾值進行處理。所以,它們的值小於或等於T,VG(x,y)=0;對於其他的情況,VG(x,y) = VG(x,y)。類似的解釋可用於PPG。

f1 = imread('1.jpg');
f2 = imread('2.jpg');
f3 = imread('3.jpg');
g = cat(3,f1,f2,f3);
[VG, A, PPG] = colorgrad(g);

這裡寫圖片描述

在RGB向量空間中進行影象分割

 mask = roipoly(f); % Select region interactively.
red = immultiply(mask, f(:, :, 1));
green = immultiply(mask, f(:, :, 2));
blue = immultiply(mask, f(:, :, 3));
g = cat(3, red, green, blue);
figure, imshow(g);

這裡寫圖片描述