210 likes | 448 Views
數位影像處理 第十三章 色彩處理. 13.1 何謂色彩 13.2 色彩模型 13.3 MATLAB 的色彩影像 13.4 虛擬上色 13.5 彩色影像處理. 13.1 何謂色彩. 人類的視覺系統一般來說,會將色彩分為不同份量的紅、綠、藍混合起來的結果,因此紅、綠、藍稱為三原色,將任二原色混合後得到的是第二次色 : 紫紅 ( 紫 )= 紅 + 藍 青綠 = 綠 + 藍 黃 = 紅 + 綠. RGB 對色函數. 13.1 何謂色彩.
E N D
數位影像處理第十三章 色彩處理 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) ,明暗度(Value) ,縮寫為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 虛擬上色 • 虛擬上色指的是對灰階影像上指定顏色,以便在視覺上凸顯影像的某些面向。 • 明暗度切割:這個方法是將影像切割成幾個灰些範圍,每個範圍只定不同顏色:
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