文章目录:
这一部分,将要讨论利用图像处理工具箱进行彩色图像处理的基本原理
8.1 MATLAB中彩色图像的表示方法
1)彩色图像可以表示为索引图像和RGB图像来处理。一幅RGB图像就是一个MxNx3的一个数组,其中每个彩色像素都对应着RGB空间的红绿蓝分量。
2)如果fR、fG、fB分别代表三种RGB分量图像。一幅RGB图像就是利用cat(级联)操作符将这些分量组合成彩色图像。
rgb_image = cat(3, fR, fG, fB);
3)如果所有分量都是相同的,那么这幅图像就是灰度图。令rgb_image大鸟一幅RGB图像,下面命令可以提取出三幅分量图像:
fr= rgbimage(:,:,1);
fg= rgbimage(:,:,2);
fb= rgbimage(:,:,3);
4) 颜色立方体的可视化:
rgbcube(vx,vy,vz);
5)示例:
rgb_image = imread('GoldRushYukon_ZH-CN6132080652_1920x1080.jpg');
subplot(2,2,1);imshow(rgb_image);
fr = rgb_image(:,:,1);
fg = rgb_image(:,:,2);
fb = rgb_image(:,:,3);
subplot(2,2,2);imshow(fr);
subplot(2,2,3);imshow(fg);
subplot(2,2,4);imshow(fb);
8.2 颜色空间及转换
有很多可以表示彩色图像的颜色空间,他们的转换关系如下。
8.2.1 NTSC颜色空间
1)RGB >> NTSC
变换关系如下:
NTSC制式的优点是亮度信息和彩色信息是分离的:Y表示亮度信息,I表示色调,Q表示饱和度。对应的函数为:
yiq_image = rgb2ntsc(rgb_image);
2)NTSC >> RGB
变换关系如下:
函数如下:
rgb_image = ntsc2rgb(ntsc_image);
8.2.2 YCbCr颜色空间
Y表示亮度信息,Cb和Cr表示彩色信息。
变换关系如下:
转换函数如下:
ycbcr_image = rgb2ycbcr(rgb_image);
rgb_image = ycbcr2rgb(ycbcr_image);
8.2.3 HSV颜色空间
HSV(色调、饱和度、数值)是调色板的彩色系统之一。
其与RGB图像转换函数如下:
hsv_image = rgb2hsv(rgb_image);
rgb_image = hsv2rgb(hsv_image);
8.2.4 CMY颜色空间
变换关系如下:
函数如下:
cmy_image = imcomplent(rgb_image);
rgb_image = imcomplent(cmy_image);
8.2.5 HSI颜色空间
H表示色度、S表示饱和度、I表示亮度,HSI图像的I分量就可表示灰度。
1)RGB >> HSI:
2)HSI >> RGB:
在不同的区域有不同的转换方法。
8.3 彩色图像处理基础
1)令c为彩色空间的任意向量,则图像上任意一点x、y可表示为:
2)处理彩色图像可以分为:
(1)多通道分别处理
(2)每个通道单独处理
(3)将灰度图像进行伪彩色处理
(4)插值映射函数(将三个通道分别处理或者同时处理)
3)线性插值函数: z=interp1q(x,y,xi)
z=interp1q([0 0.6 1],[0 0.41],linspace(0,1,10));
plot(linspace(0,1,10),z);
grid;
4)样条差值函数 :z=spline(x,y,xi)
z=spline([0 0.6 1],[0 0.4 1],linspace(0,1,10));
plot(linspace(0,1,10),z);
grid
8.4 颜色变换
交互式颜色编辑系统 ICE (interactive color editing):
g=ice('Property Name','property value',…)
Property Name为句柄,有三种情况如下表:
每个Property Name对应一个property value。
1)示例1:颜色反转
f=imread('Fig0303(a)(breast).tif');
g=ice('image',f);
subplot(1,2,1);imshow(f);
subplot(1,2,2);imshow(g);
2)示例2:图像增强
%处理灰度图像 图像增强
f3 = imread('Fig0309(a)(washed_out_aerial_image).tif');
g3=ice('image',f3);
subplot(1,2,1);imshow(f3);
subplot(1,2,2);imshow(g3);
3)示例3:彩色图像对比度增强
f = imread('Fig0635(top_ left_flower).tif');
g = ice('image',f);
subplot(1,2,1);imshow(f);
subplot(1,2,2);imshow(g);
4)示例4:伪彩色图像处理
f = imread('Fig0621(a)(weld-original).tif');
g = ice('image',f);
subplot(1,2,1);imshow(f);
subplot(1,2,2);imshow(g);
5)示例5:色彩平衡
f = imread('Fig0636(woman_baby_original).tif');
g = ice('image',f,'space','cmy');
subplot(1,2,1);imshow(f);
subplot(1,2,2);imshow(g);
6)示例6:彩色图像直方图均衡
f = imread('Fig0637(a)(caster_stand_original).tif');
g = ice('image',f, 'space','ycbcr');
subplot(1,2,1);imshow(f);
subplot(1,2,2);imshow(g);
8.5 彩色图像的空域滤波
8.5.1 彩色图像平滑
1)RGB 颜色向量邻域内的均值可通过下式进行计算:
2)使用线性空域滤波平滑一幅RGB彩色图像需要如下几个步骤:
(1) 提取各颜色通道
fR=fc(:,:,1);…
(2)对图像的各个组成部分分别滤波
fR_filtered=imfilter(fR,w);…
(3)重建
fc_filtered=cat(3,fR_filtered,..);
3)示例:彩色图像平滑
f = imread('Fig0651(a)(flower_no_compression).tif');
fR = f(:,:,1);fG = f(:,:,2);fB = f(:,:,3);
w = fspecial('average',25);
fR_fitered = imfilter(fR,w,'replicate');
fG_fitered = imfilter(fG,w,'replicate');
fB_fitered = imfilter(fB,w,'replicate');
f_filtered = cat(3,fR_fitered,fG_fitered,fB_fitered);
subplot(1,2,1);imshow(f);
subplot(1,2,2);imshow(f_filtered);
8.5.2 彩色图像锐化
1)彩色图像锐化使用拉普拉斯算子:
2)示例:
f = imread('Fig0635(middle_row_left_chalk ).tif');
lapmask=[1 1 1;1 -8 1;1 1 1];
fen=imsubtract(f,0.5*imfilter(f,lapmask,'replicate'));
subplot(1,2,1);imshow(f);
subplot(1,2,2);imshow(fen);
8.6 RGB向量空间中的图像处理技术
8.6.1 使用梯度的彩色边缘检测
1)二维图像的梯度可以表示为:
幅值:
幅角:
但是在彩色图像中的三维空间就需要用到梯度的向量表示,r,g,b是沿着R, G , B 轴的单位向量,令:
定义数量:
角度即为c(x,y)最大改变率的方向:
对应的变化率的值为:
2)使用IPT工具箱计算 RGB 图像的颜色梯度:
[VG,A,PPG]=colorgrad(f,T)
f为彩色图像,T为0-1的阈值,VG是RGB向量梯度F(x,y),A是theta(x,y),PPG是单独彩色图像梯度值之和。
示例:两种计算梯度的方法结果不同
f = imread('Fig0635(top_ left_flower).tif');
[VG,A,PPG]=colorgrad(f);
subplot(2,2,1);imshow(f);
subplot(2,2,2);imshow(VG);
subplot(2,2,3);imshow(PPG);
subplot(2,2,4);imshow(10*imsubtract(VG,PPG));
8.6.2 RGB 向量空间中的图像分割
比如我们想要分割某一种颜色,用下面的公式计算欧式距离:
其中z代表某张图片,m代表想要分割出的颜色RGB向量。
还可以使用下面的码是距离来定义:
使用IPT进行图像分割函数:
S=colorseg(method,f,T,parameters)
method代表使用哪种距离,不是‘euclidean’就是‘mahalanobis’,f代表待分隔图像,T是阈值,若选择‘euclidean’,参数输入m,若选择‘mahalanobis’,参数输入m和C。
示例:
f=imread('Fig0642(a)(jupiter_moon_original).tif');
mask=roipoly(f);
imshow(mask);
red=immultiply(mask,f(:,:,1));
green=immultiply(mask,f(:,:,2));
blue=immultiply(mask,f(:,:,3));
g=cat(3,red,green,blue);
subplot(2,2,1);imshow(g);
[M,N,K]=size(g);
I=reshape(g,M*N,3);
idx=find(mask);
I=double(I(idx,1:3));
[C,m]=covmatrix(I);
d=diag(C);
sd=sqrt(d)'
e25 = colorseg('euclidean',f,25,m);
e50 = colorseg('euclidean',f,50,m);
e75 = colorseg('euclidean',f,75,m);
subplot(2,2,2);imshow(e25);title('T = 25')
subplot(2,2,3);imshow(m50);title('T = 50')
subplot(2,2,4);imshow(m75);title('T = 75')
m25 = colorseg('mahalanobis',f,25,m,C);
m50 = colorseg('mahalanobis',f,50,m,C);
m75 = colorseg('mahalanobis',f,75,m,C);
figure;
subplot(2,2,1);imshow(g);
subplot(2,2,2);imshow(m25);title('T = 25');
subplot(2,2,3);imshow(m50);title('T = 50');
subplot(2,2,4);imshow(m75);title('T = 75');
使用欧氏距离:
使用马氏距离: