數位影像處理第十三章 色彩處理
13.1 何謂色彩13.2 色彩模型13.3 MATLAB的色彩影像13.4 虛擬上色13.5 彩色影像處理
13.1 何謂色彩• 人類的視覺系統一般來說,會將色彩分為
不同份量的紅、綠、藍混合起來的結果,因此紅、綠、藍稱為三原色,將任二原色混合後得到的是第二次色 :
紫紅 ( 紫 )= 紅 + 藍 青綠 = 綠 + 藍 黃 = 紅 + 綠
RGB 對色函數
13.1 何謂色彩• 某些波長中的紅、綠、藍色值為負數,實
際上不可能會有這樣的結果,不過可以看成色源再加上其他原色光束,以維持對色。為了除去色彩中的負數值, CIE 採用 XYZ色彩模型, XYX 可以透過線性轉換與從對應的 RGB 數值得到。
XYZ 對色函數
13.1 何謂色彩• 一般來說,組成特定顏色的 XYZ 值稱為三
色激值,若不考慮亮度,三色激值可以除以 X+Y+Z 加以正規劃 :
x = X / X+Y+Z
y = Y / X+Y+Z
z = Z / X+Y+Z
可發現 x+y+z=1 ,因此顏色可以只用 x 與 y表示,稱為色度座標。
13.1 何謂色彩• 知道 xy 與 Y 值後,便可以透過反推上述方程式求得三色
激值的 XZ :
X= ( x / y ) r Z= (1 – x – y / y ) r• 色度圖 : wxyz=load('ciexyz31.txt'); xyz=wxyz(:,2:4)'; xy=xyz'./(sum(xyz)'*[1 1 1]); x=xy(:,1)'; y=xy(:,2)'; figure,plot([x x(1)],[y y(1)]),xlabel('x'),ylabel('y'),axis square
色度圖
13.2 色彩模型• 色彩模型是以某種標準的方式分辨顏色的
方法, 基本上是由三維座標與一個子空間所組成,在這子空間中,一個點便代表一個色彩。
• 要定義出色域,首先產生一個 100X100X3的陣列,陣列中的每個點都對應一個 XYZ數值 (i/100 , j/100 , 1-i/100-j/100) ,然後計算對應 RGB 值,若為負數,輸出為白色 :
13.2 色彩模型• function res=gamut()• • global cg;• x2r=[3.063 -1.393 -0.476;-0.969 1.876 0.042;0.068 -0.229 1.069];• cg=zeros(100,100,3);• for i=1:100,• for j=1:100,• cg(i,j,:)=x2r*[j/100 i/100 1-i/100-j/100]';• if min(cg(i,j,:))<0, • cg(i,j,:)=[1 1 1];• end;• end;• end;• res=cg;• 然後使用下列指令顯示位於色度圖中的色域 :• >> imshow(cG),line([x' x(1)],[y' y(1)]),axis square,axis xy,
axis on
RGB 色域
13.2 色彩模型• 色調 (Hue) ,飽和度 (Saturation) ,明暗度 (Val
ue) ,縮寫為 HSA 。• 色調 (Hue):[ 全彩 ] 的屬性 ( 紅、綠、藍、橘等 ) 。• 飽和度 (Saturation): 色彩被白色稀釋的程度。色
彩中含有白色越多,飽和度變越低,因此深紅色飽和度高,亮紅色飽和度低。
• 明暗度 (Value): 亮的顏色明暗度高,岸的顏色明暗度低。
13.3 MATLAB的色彩影像• 由於彩色影像的每個像素資訊都必須獨立
分為三項,因此在 MATLAB 中,全彩影像可用三維陣列來表示,假設獨取一 RGB 影像 :
• >> x=imread('lily.tif');• >> size(x)• ans =• 186 230 3• >> figure,imshow(x(:,:,1))• >> figure,imshow(x(:,:,2))• >> figure,imshow(x(:,:,3))
紅色部分
綠色部分 藍色部分
13.3 MATLAB的色彩影像• 轉換成 YIQ 或 HSV ,再次檢視組成部分 :
• >> xh=rgb2hsv(x);• >> imshow(xh(:,:,1))• >> figure,imshow(xh(:,:,2))• >> figure,imshow(xh(:,:,3))
色調 飽和度 明暗度
13.3 MATLAB的色彩影像• YIQ 色彩空間 :• >> xn=rgb2ntsc(x);• >> imshow(xn(:,:,1))• >> figure,imshow(xn(:,:,2))• >> figure,imshow(xn(:,:,3))
Y I Q
13.4 虛擬上色• 虛擬上色指的是對灰階影像上指定顏色,以便在視
覺上凸顯影像的某些面向。• 明暗度切割 : 這個方法是將影像切割成幾個灰些範
圍,每個範圍只定不同顏色 :
灰階 0-63 64-127 128-191 192-255
顏色 藍 紫紅 綠 紅
13.4 虛擬上色• 在 MATLAB 中,要使用另外顏色來檢視影像,可
以使用 imshow ,並設定參數 colormap 。>> b=imread('blocks.tif');
>> imshow(b,colormap(jet(256)))
然而,色譜若選擇錯誤可能會破壞整個影像,例如將 vga色譜代入就很不恰當,因為這個色譜只有 16 列,所以必須將影像灰階數目減至 16 ,可以使用函數 grayslice:
13.4 虛擬上色• >> b16=grayslice(b,16);• >> figure,imshow(b16,colormap(vga))• 我們也可以自行產生色譜必須產生三個 行的矩陣,每一列都是介於 0.0 與 1.0 之間的 RGB 值構
成,使用下列指令產生色譜 :• >> mycolormap=[0 0 1;1 0 1;0 1 0;1 0 0];• >> b4=grayslice(b,4);• >> imshow(b4,mycolormap)
13.5 彩色影像處理• 分別處理每個 RGB 矩陣。• 轉換色彩空間,將明暗度自色彩資訊抽離,
單獨處理明暗度部分。
• 加強比對 : 透過明暗度部份處裡,可以獲得對比加強效果。
13.5 彩色影像處理• 轉全彩 (RGB) 影像 :>> [x,map]=imread('emu.tif'); >> c=ind2rgb(x,map);
RGB 轉 YIQ 以便取明暗度部分 :>> cn=rgb2ntsc(c);
將明暗度部分帶入直方圖均化,然後轉回 RGB 方便顯示 :>> cn(:,:,1)=histeq(cn(:,:,1));>> c2=ntsc2rgb(cn);>> imshow(c2)
將 RGB各個部份帶入直方圖均化 :>> cr=histeq(c(:,:,1));>> cg=histeq(c(:,:,2));>> cb=histeq(c(:,:,3));
全部放入單一三維陣列顯示 :>> c3=cat(3,cr,cg,cb);>> imshow(c3)
RGB
轉直方圖均化RGB
單一三維陣列
13.5 彩色影像處理• 空間濾波 : 低通 >> a15=fspecial('average',15); >> cr=filter2(a15,c(:,:,1)); >> cg=filter2(a15,c(:,:,2)); >> cb=filter2(a15,c(:,:,3)); >> blur=cat(3,cr,cg,cb); >> imshow(blur) 高通 >>cn=rab2ntsc(c); >>a=fspecial(‘unsharp’); >>cn(:,:,1)=filter2(a,cn(:,:,1)); >>cu=ntsc2rgb(cn); >> imshow(cu)
低通
高通
13.5 彩色影像處理• 去除雜訊 :使用色彩影像處理tw=imread('twins.tif');加入雜訊tn=imnoise(tw,'salt & pepper');figure,imshow(tn(:,:,1))figure,imshow(tn(:,:,2))figure,imshow(tn(:,:,3))將各 RGB 部分帶入中位數濾波器trm=medfilt2(tn(:,:,1));tgm=medfilt2(tn(:,:,2));tbm=medfilt2(tn(:,:,3));tm=cat(3,trm,tgm,tbm);imshow(tm)
雜訊紅色部分
雜訊綠色部分
雜訊藍色部分
13.5 彩色影像處理只除去 y 部分雜訊tnn=rgb2ntsc(tn);
tnn(:,:,1)=medfilt2(tnn(:,:,1));
tm2=ntsc2rgb(tnn);
imshow(tm2)
去除 RGB各部份雜訊 除去 y 部分雜訊
13.5 彩色影像處理• 邊緣檢測 :
使用函數 rgb2gray
f=imread('flowers.tif');
fg=rgb2gray(f);
fe1=edge(fg);
imshow(fe1)
使用邏輯運算子 or 合併結果f1=edge(f(:,:,1));
f2=edge(f(:,:,2));
f3=edge(f(:,:,3));
fe2=f1 |f2| f3;
figure,imshow(fe2)
fe1
fe2