Matlab DIP(瓦)ch6彩色图像处理练习

    

      这一章主要是熟悉一些彩色空间处理的基本操作,对色彩学有进一步的认识。其主要内容包括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的分割');


     通过本次试验,更进一步了解了彩色空间的处理。欢迎交流!

作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)
posted on 2012-03-09 00:27  tornadomeet  阅读(6860)  评论(0编辑  收藏  举报

阿萨德发斯蒂芬