這一章主要是熟悉一些彩色空間處理的基本操作,對色彩學有進一步的認識。其主要內容包括rgb圖像和索引圖像,各種彩色空間之間的轉換,彩色變換和彩色空間濾波,包過彩色平滑和銳化,最后進行彩色邊緣檢測和rgb向量空間的圖像分割。代碼如下:
%% 生成RGB立方體
clc
clear
rgbcube(-10,-10,4);%3個參數表示觀看圖像視角的點坐標
axis on;grid on;
title('RGB立方體1');
figure,rgbcube(10,10,4);%10,10,4是默認的坐標
axis on;grid on;
title('RGB立方體2');
%其運行結果如下:


%不過貌似也看不出視角點的坐標就是(-10,-10,4)和(10,10,4),不過2個視角在xy平面對稱倒是真的
%% 用較少的顏色來近似一幅索引圖像
clc
clear
%[X,map]=imread('.\images\dipum_images_ch06\Fig0604(a)(iris).tif');
RGB=imread('.\images\dipum_images_ch06\Fig0615(d)(Iris Original).tif');
[X map]=rgb2ind(RGB,256);%一定要采用這句,不能用上面注釋掉的那句,否則后面的結果根本都一樣
imshow(X,map);%max(X(:))=255;
title('原始索引彩色圖像(256色)');
%其運行結果如下:

[Y,newmap]=imapprox(X,map,128);%用較少的128顏色來近似一幅索引圖像
figure,imshow(Y,newmap);
title('索引圖像(128色)');
%其運行結果如下:
[Y,newmap]=imapprox(X,map,64);%用較少的64顏色來近似一幅索引圖像
figure,imshow(Y,newmap);
title('索引圖像(64色)');
%其運行結果如下:
[Y,newmap]=imapprox(X,map,32);%用較少的32顏色來近似一幅索引圖像
figure,imshow(Y,newmap);
title('索引圖像(32色)');
%其運行結果如下:
[Y,newmap]=imapprox(X,map,16);%用較少的16顏色來近似一幅索引圖像
figure,imshow(Y,newmap);
title('索引圖像(16色)');
%其運行結果如下:
[Y,newmap]=imapprox(X,map,8);%用較少的8顏色來近似一幅索引圖像
figure,imshow(Y,newmap);
title('索引圖像(8色)');
%其運行結果如下:
[Y,newmap]=imapprox(X,map,4);%用較少的4顏色來近似一幅索引圖像
figure,imshow(Y,newmap);
title('索引圖像(4色)');
%其運行結果如下:
[Y,newmap]=imapprox(X,map,2);%用較少的2顏色來近似一幅索引圖像
figure,imshow(Y,newmap);
title('索引圖像(2色)');
%其運行結果如下:
%% dither使用
clc
clear
RGB=imread('.\images\dipum_images_ch06\Fig0604(a)(iris).tif');
imshow(RGB);
title('dither真彩色(256_256_256)圖像');
%其運行結果如下:
GRAY=rgb2gray(RGB);
figure,imshow(GRAY);
title('灰度圖像256色');
%其運行結果如下:
BW=dither(rgb2gray(RGB));
figure,imshow(BW)
title('灰度抖動處理后圖像');
%其運行結果如下:
[IND,map]=rgb2ind(RGB,256);%將RGB圖像轉換成索引圖像
%figure,imshow(IND,map);%顯示索引圖像
X=dither(RGB,map);%抖動處理
figure,imshow(X);%顯示抖動圖像
title('彩色抖動處理后圖像');
%其運行結果如下:
X=dither(RGB,jet(256));%jet函數為HSV空間的一個變種
figure,imshow(X);
title('HSV變換后抖動處理');
%其運行結果如下:
I1=ind2gray(IND,map);
figure,imshow(I1);
title('恢復為灰度圖像');
%其運行結果如下:
I2=ind2rgb(IND,map);
figure,imshow(I2);
title('恢復為彩色圖像');
%其運行結果如下:
%% grayslice函數使用
clc
clear
I=imread('.\images\dipum_images_ch06\Fig0615(a)(Aerial Original).tif.tif');
imshow(I);
title('原始灰度圖像(256色)');
%其運行結果如下:
X=grayslice(I,16);%表示從原圖像I中等分16份來創建索引圖像
figure,imshow(X,jet(16));%jet(16)后是一個16*3的矩陣
title('HSV16份灰度索引');
%其運行結果如下:
%% 綜合運用前面的
clc
clear
RGB=imread('.\images\dipum_images_ch06\Fig0619(a)(RGB_iris).tif');
imshow(RGB);
title('原始真彩圖像');
%其運行結果如下:
[X1,map1]=rgb2ind(RGB,8,'nodither');%將rgb圖轉換成索引圖
figure,imshow(X1,map1);
title('8色無抖動處理后索引圖像');
%其運行結果如下:
[X2,map2]=rgb2ind(RGB,8,'dither');%將rgb圖轉換成索引圖
figure,imshow(X2,map2);
title('8色有抖動處理后索引圖像');%有抖動和無抖動的具體區別在哪呢?
%其運行結果如下:
I=rgb2gray(RGB);%轉換成了灰度圖像
I1=dither(I);%將灰度圖像抖動處理后就是二值圖像了
figure,imshow(I1);
title('采用抖動處理后的灰度圖像');
%其運行結果如下:
%% rgb2***函數使用
clc
clear
RGB=imread('.\images\dipum_images_ch06\Fig0602(b)(RGB_color_cube).tif');
imshow(RGB);
title('rgb原圖');
%其運行結果如下:
NTSC=rgb2ntsc(RGB);
figure,imshow(NTSC);
title('RGB轉換成NTSC后');
%其運行結果如下:
RGB2=ntsc2rgb(NTSC);
figure,imshow(RGB2);
title('NTSC轉換成RGB后');
%其運行結果如下:
YCBCR=rgb2ycbcr(RGB);
figure,imshow(YCBCR);
title('RGB轉換成YCBCR后');
%其運行結果如下:
RGB3=ycbcr2rgb(YCBCR);
figure,imshow(RGB3);
title('YCBCR轉換成RGB后');
%其運行結果如下:
HSV=rgb2hsv(RGB);
figure,imshow(HSV);
title('RGB轉換成HSV后');
%其運行結果如下:
RGB4=hsv2rgb(HSV);
figure,imshow(RGB4);
title('HSV轉換成RGB后');
%其運行結果如下:
HSI=rgb2hsi(RGB);
figure,imshow(HSI);
title('RGB轉換成HSI后');
%其運行結果如下:
RGB5=hsi2rgb(HSI);
figure,imshow(RGB5);
title('HSI轉換成RGB后');
%其運行結果如下:
%很明顯同時顯示9幅圖用內存太大,電腦容易卡死
%% interplq函數的使用
clc
clear
z=interp1q([0 255]',[0 255]',[0:255]');%線性插值,z=[0 1 2 ... 255];
%% spline函數的使用
clc
clear
x= 0: 10;
y=sin(x);
subplot( 121),plot(x,y, ' + ',x,y, ' r ');%畫xy圖像,並標出x和y點
xx= 0:. 25: 10;
yy=spline(x,y,xx);
subplot( 122),plot(x,y, ' o ',xx,yy, ' b ');%也是畫xy圖像,標出x和y點,但是這中間插值了隔.25的數,只是沒被標出來
%其運行結果如下:
%% ice函數的使用
clc
clear
f=imread('.\images\dipum_images_ch06\Fig0619(a)(RGB_iris).tif');
g=ice('image',f);%將f由指定映射交互式進行變換
%其運行結果如下:
f1=imread('.\images\dipum_images_ch06\Fig0617(a)(JLK Magenta).tif');
g=ice('image',f1,'space','CMY');%修改CMY彩色空間
%其運行結果如下:
%% 彩色圖像平滑
clc
clear
fc=imread('.\images\dipum_images_ch06\Fig0604(a)(iris).tif');
imshow(fc);
title('原始真彩圖像(平滑處理)');
%其運行結果如下:
fr=fc(:,:,1);%取分量r
fg=fc(:,:,2);%取分量g
fb=fc(:,:,3);%取分量b
h=rgb2hsi(fc);
H=h(:,:,1);%取分量h
S=h(:,:,2);%取分量s
I=h(:,:,3);%取分量i
w=fspecial('average',15);
I_filtered=imfilter(I,w,'replicate');
h=cat(3,H,S,I_filtered);%cat函數是拼接數組的函數,這里將在第3維上進行拼接。
f=hsi2rgb(h);%平滑亮度分量后的rgb圖像
f=min(f,1);%保證元素值最大為1,因為按公式轉換為rgb后可能出現大於1的情況
figure,imshow(f);
title('僅平滑亮度分量所得到的RGB圖像');
%其運行結果如下:
fc_filtered=imfilter(fc,w,'replicate');
figure,subplot(121),imshow(fc_filtered);
title('分別平滑rgb后得到的rgb圖像');
h_filtered=imfilter(h,w,'replicate');
f=hsi2rgb(h_filtered);
f=min(f,1);
subplot(122),imshow(f);
title('分別平滑hsi后得到的rgb圖像');
%其運行結果如下:
%% 彩色圖像銳化
clc
clear
fc=imread('.\images\dipum_images_ch06\Fig0604(a)(iris).tif');
subplot(121),imshow(fc);
title('原始真彩圖像(銳化處理)');
w=fspecial('average',15);
fc_filtered=imfilter(fc,w,'replicate');
subplot(122),imshow(fc_filtered);
title('分別平滑rgb3分量后');
%其運行結果如下:
lapmask=[1 1 1;1 -8 1;1 1 1];
fen=imsubtract(fc_filtered,imfilter(fc_filtered,lapmask,'replicate'));
figure,imshow(fen);
title('拉普拉斯增強圖像');
%其運行結果如下:
LPA=imfilter(fc,lapmask,'replicate');
figure,subplot(121),imshow(LPA);
title('對原圖拉普拉斯算子后');
fen=imsubtract(fc,imfilter(fc,lapmask,'replicate'));
subplot(122),imshow(fen);
title('用拉普拉斯算子增強真彩色');
%其運行結果如下:
%%
clc
clear
fc=imread('.\images\dipum_images_ch06\Fig0604(a)(iris).tif');
imshow(fc);
title('原始真彩圖像(邊緣檢測)');
%其運行結果如下:
[VG,A,PPG]=colorgrad(fc);%VG為向量梯度,A為向量角度,PPG為計算每一維梯度后合成
figure,subplot(121),imshow(VG);
title('在rgb空間計算梯度圖像');
subplot(122),imshow(PPG);
title('分別在rgb計算梯度然后相加');
%其運行結果如下:
figure,imshow(abs(VG-PPG),[]);
title('2種梯度的絕對值');
%%
clc
clear
f=imread('.\images\dipum_images_ch06\Fig0627(a)(jupitermoon_original).tif');
imshow(f);
title('原始真彩圖像(分割)');
%其運行結果如下:
figure,mask=roipoly(f);%roipoly為選擇感興趣的多邊形
title('交互選取采用點');
red=immultiply(mask,f(:,:,1));%immultipy函數為2幅圖像對應的元素相乘
green=immultiply(mask,f(:,:,2));
blue=immultiply(mask,f(:,:,3));
g=cat(3,red,green,blue);%將對應的3個分量重新組合
figure,imshow(g);
%g2=immultiply(mask,f);%為什么直接這樣相乘是錯誤的呢
%figure,imshow(g2);
[M,N,K]=size(g);%這里k為3
I=reshape(g,M*N,3);%I為M*N行,3列的數組
idx=find(mask);
I=double(I(idx,1:3));
[C,m]=covmatrix(I);%計算出協方差矩陣C和均值m
d=diag(C);%方差
sd=sqrt(d)'%標准差
E25=colorseg('euclidean',f,25,m);%使用高斯距離進行彩色分割
figure,subplot(221),imshow(E25);
title('使用高斯距離25的分割');
E50=colorseg('euclidean',f,50,m);
subplot(222),imshow(E50);
title('使用高斯距離50的分割');
E75=colorseg('euclidean',f,75,m);
subplot(223),imshow(E75);
title('使用高斯距離75的分割');
E100=colorseg('euclidean',f,100,m);
subplot(224),imshow(E100);
title('使用高斯距離100的分割');
%其運行結果如下:
M25=colorseg('mahalanobis',f,25,m,C);%使用馬氏距離分割
figure,subplot(221),imshow(M25);
title('使用馬氏距離25的分割');
M50=colorseg('mahalanobis',f,50,m,C);
subplot(222),imshow(M50);
title('使用馬氏距離50的分割');
M75=colorseg('mahalanobis',f,75,m,C);
subplot(223),imshow(M75);
title('使用馬氏距離75的分割');
M100=colorseg('mahalanobis',f,100,m,C);
subplot(224),imshow(M100);
title('使用馬氏距離100的分割');
通過本次試驗,更進一步了解了彩色空間的處理。歡迎交流!