数字图像处理第六章 彩色图像处理


在图像处理中,彩色的运用主要受两个因素的推动。第一,彩色是一个强有力的描绘子,它常常可简化从场景中提取和识别目标;第二,人可以辨别几千种彩色色调和亮度,但相比之下只能辨别几十种灰色色调。第二个因素在人工图像分析中特别重要。彩色图像处理可分为两个主要领域:全彩色处理和伪彩色处理。第一类中,通常要求图像用全彩色传感器获取,如彩色电视摄像机或彩色扫描仪。第二类中,问题是对一种特定的单色灰度或灰度范围赋予一种颜色。

1 彩色模型

彩色模型(也称为彩色空间或彩色系统)的目的是,在某些标准下用通常可以接受的方式方便对彩色加以说明。本质上,彩色模型是坐标系统和子空间的说明,其中,位于系统中的每种颜色都由单个点表示。

1.1 RGB彩色模型

在RGB模型中,每种颜色出现在红、绿、蓝的原色光谱成分中。该模型基于笛卡尔坐标系,下图是RGB彩色立方体的示意图:
在这里插入图片描述
在该模型中,灰度(RGB值相等的点)沿着连接着两点的直线从黑色延伸到白色。该模型中的不同颜色是位于立方体上的或立方体内部的点,且由自原点延伸的向量来定义。为方便起见,假定所有颜色值均已归一化,因此上图所示的立方体是一个单位立方体,即R,G,B的所有值都假定在区间[0,1]内。

一幅RGB图像就是M✖N✖3大小的彩色像素的数组,其中的每个彩色像素点都是在特定空间位置的彩色图像所对应的红、绿、蓝三个分量。RGB图像也可以看做有三个灰度图像形成的“堆栈”,当发送到彩色监视器的红、绿、蓝输入端时,就在屏幕上产生彩色图像。

>> rgb_image = imread('raccoon.jpg');
>> fR = rgb_image(:, :, 1);
>> fG = rgb_image(:, :, 2);
>> fB = rgb_image(:, :, 3);
>> subplot(2,2,1),imshow(rgb_image),title('Original Image');
>> subplot(2,2,2),imshow(fR),title('Red Component Of Image');
>> subplot(2,2,3),imshow(fG),title('Green Component Of Image');
>> subplot(2,2,4),imshow(fB),title('Blue Component Of Image');

在这里插入图片描述
为了更加形象我们将上面三个分量可视化出来我们做一个小的拼接:

>> rgb_red=cat(3,fR,zeros(size(fR)),zeros(size(fR)));
>> rgb_green=cat(3,zeros(size(fR)),fG,zeros(size(fR)));
>> rgb_blue=cat(3,zeros(size(fR)),zeros(size(fR)),fB);
>> subplot(2,2,1),imshow(rgb_image),title('Original Image');
>> subplot(2,2,2),imshow(rgb_red),title('Red Component Of Image');
>> subplot(2,2,3),imshow(rgb_green),title('Green Component Of Image');
>> subplot(2,2,4),imshow(rgb_blue),title('Blue Component Of Image');

在这里插入图片描述
RGB模型的建立原理是基于人眼的视觉三原色理论,遗憾的是RGB模型不太适用于颜色的直观描述,即人类实际上解释颜色的方式。

1.2 HSI彩色模型

基于上面的RGB模型的结论,观察彩色物体时,我们用其色调、饱和度和亮度来描述这个物体。色调描述的是一张纯色(纯黄色、纯橙色或纯红色)的颜色属性,而饱和度是一种纯色被白光稀释的程度的度量。亮度是一个主观描述子,实际上它是不可度量的。它体现了无色的强度概念,并且是描述色彩感觉的关键因子之一。我们即将提出的模型称为HSI(色调、饱和度和强度)彩色模型,该模型可在彩色图像中从携带的彩色信息(色调和饱和度)中消去强度分量的影响,这种彩色描述对人来说才是自然且直观的,毕竟人才是这些算法的开发者和使用者。
在这里插入图片描述
由上图我们引出HSI颜色模型,我们可以看出来HSI颜色模型实际上是RGB颜色模型“立起来”,将黑色为底白色为顶的一种锥型变体,中间黑色和白色相连的垂直直线就是像素点的强度轴,强度(灰度级)是沿连接这两个顶点的直线分布的。这样,如果我们要确定上图中任何色彩点的强度分量,可以简单地找到通过一个垂直于强度轴并包含该彩色点的平面,然后找到这个平面与强度轴的交点,交点的值即为区间[0,1]内的强度值。稍加思考,我们还注意到,一种颜色的饱和度(纯度)以强度轴的距离为函数而增大。事实上,强度轴上点的饱和度为零,事实证明所有沿着这条轴的点都是灰色的。如何去从给定点RGB点来确定色调,当我们在上图锥体边界确定一个点时,由该点与黑点和白点可以定义一个平面,包括在由强度轴和锥体边界定义的平面段内的所有点,都有着相同的色调。

关于HSI的彩色空间,要记住一个关键点是,HSI空间由一个垂直强度轴和位于与该轴垂直的平面内的彩色点的轨迹表示。通常,色调的增长以红轴的0度角指定为0色调开始逆时针增长;饱和度(距垂直轴间的距离)是从原点到该点的向量长度。

2 彩色空间之间的转换

在一幅RGB图像中,工具箱直接把颜色描述成RGB值,或者在索引图像中间接地用RGB格式来存储彩色映射。然而,还有其他的彩色空间(又被称为彩色模型),他们在应用中的使用可能比RGB更方便或更恰当。这些模型是RGB模型的变换,上一小节我们只介绍了HSI彩色模型,但是还有NTSC、YCbCr、HSV、CMY、CMYK彩色空间。

2.1 NTSC彩色空间

NTSC彩色空间用于模拟电视。这种格式的主要优势是灰度信息和彩色数据是分离开来的,所以同一信号可以用于彩色电视机和黑白电视机。在NTSC格式中,图像数据由三部分组成:亮度(Y)、色调(I)和饱和度(Q)。亮度分量描述灰度信息,其他两个分量携带电视信号的彩色信息。YIQ分量都是用线性变换从一幅图像的RGB分量得到的: [ Y I Q ] = [ 0.229 0.587 0.114 0.596 0.274 0.322 0.211 0.523 0.312 ] [ R G B ] \begin{bmatrix}Y\\I\\Q\end{bmatrix}=\begin{bmatrix}0.229&0.587&0.114\\0.596&-0.274&-0.322\\0.211&-0.523&0.312\end{bmatrix}\begin{bmatrix}R\\G\\B\end{bmatrix} 注意,第一行的各元素之和为1,而下两行元素的和为0。这和预想的一样,因为对于一幅灰度图像。所有的RGB分量都是相等的;所以对于这样的图像来说,I和Q分量应该是0。

>> yiq_image = rgb2ntsc(imread('raccoon.jpg'));
>> fY = yiq_image(:, :, 1);
>> fI = yiq_image(:, :, 2);
>> fQ = yiq_image(:, :, 3);
>> subplot(2,2,1),imshow(yiq_image),title('Original Image');
>> subplot(2,2,2),imshow(fY),title('Brightness');
>> subplot(2,2,3),imshow(fI),title('Tone');
>> subplot(2,2,4),imshow(fQ),title('Saturation');

在这里插入图片描述
输入输出的图像都是double类型。

2.2 YCbCr彩色空间

YCbCr彩色空间广泛用于数字视频。在这种格式中,亮度信息用单独的分量Y来表示,彩色信息是用两个色差分量Cb和Cr来存储的。分量Cb是蓝色分量与参考值的差,分量Cr是红色分量与参考值的差。工具箱采用的从RGB转换为YCbCr的变换是: [ Y C b C r ] = [ 16 128 128 ] + [ 65.481 128.553 24.966 37.797 74.203 112.000 112.000 93.786 18.214 ] [ R G B ] \begin{bmatrix}Y\\Cb \\Cr\end{bmatrix}=\begin{bmatrix}16\\128\\128\end{bmatrix}+\begin{bmatrix}65.481&128.553&24.966\\-37.797&-74.203&112.000\\112.000&-93.786&-18.214\end{bmatrix}\begin{bmatrix}R\\G\\B\end{bmatrix}

>> rgb_image = imread('raccoon.jpg');
>> ycbcr_image = rgb2ycbcr(rgb_image);
>> subplot(1,2,1),imshow(rgb_image),title('RGB Image');
>> subplot(1,2,2),imshow(ycbcr_image),title('YCbCr Image');

在这里插入图片描述

2.3 CMY和CMYK彩色空间

青色、紫红色和黄色是光的二次色,或者换一种说法,它们是颜料的原色。例如,当在表面涂上了青色颜料,再用白光照射时,没有红光从表面反射。也就是说,青色颜料从表面反射的光中减去了红光。大多数将颜料堆积于纸上的设备,比如彩色打印机和复印机,都需要CMY数据输入,或在内部将RGB转换为CMY,近似的转换可用下面的公式实现: [ C M Y ] = [ 1 1 1 ] [ R G B ] \begin{bmatrix}C\\M\\Y\end{bmatrix}=\begin{bmatrix}1\\1\\1\end{bmatrix}-\begin{bmatrix}R\\G\\B\end{bmatrix}

>> cmy_image = imcomplement(rgb_image);
>> subplot(1,2,1),imshow(rgb_image),title('RGB Image');
>> subplot(1,2,2),imshow(cmy_image),title('CMY Image');

0

2.4 HSI彩色空间

前面我们已经具体地介绍了HSI彩色空间,下面我们介绍RGB与HSI的彩色转换。
从RGB到HSI的彩色转换
给定一幅RGB彩色格式的图像,每个RGB像素的H(色调)分量可用下式得到: H = { θ , B G 360 θ , B > G H=\left\{\begin{matrix}\theta,B\leq G \\ 360-\theta,B>G \end{matrix}\right. 式中, θ = a r c c o s { 1 2 [ ( R G ) + ( R B ) ] [ ( R G ) 2 + ( R B ) ( G B ) ] 1 / 2 } \theta=arccos\{\frac{\frac{1}{2}[(R-G)+(R-B)]}{[(R-G)^2+(R-B)(G-B)]^{1/2}}\} 饱和度分量由下式给出: S = 1 3 ( R + G + B ) [ m i n ( R , G , B ) ] S=1-\frac{3}{(R+G+B)}[min(R,G,B)] 最后,强度分量由下式给出: I = 1 3 ( R + G + B ) I=\frac{1}{3}(R+G+B)
从HSI到RGB的彩色转换
对于[0,1]内的HSI值,现在我们想要在相同的志愿找到对应的RGB值。可用公式取决于H的值。在原色分隔中有3个相隔120度的扇区。我们从H乘以360度开始,这时的色调值回到原来的区间0度到360度内。
RG扇区(H在0度到120度之间): B = I ( 1 S ) R = I [ 1 + S cos H cos ( 6 0 H ) ] G = 3 I ( R + B ) B=I(1-S) \\ R=I[1+\frac{S\cos H}{\cos (60^{\circ}-H)}] \\ G = 3I-(R+B) GB扇区(H在120度到240度之间):如果给定的H值在该扇区中时,首先从H中减去120度,即: H = H 12 0 H = H - 120^{\circ} 则RGB分量为 R = I ( 1 S ) G = I [ 1 + S cos H cos ( 6 0 H ) ] B = 3 I ( R + B ) R=I(1-S) \\ G=I[1+\frac{S\cos H}{\cos (60^{\circ}-H)}] \\ B = 3I-(R+B) BR扇区(H在240度到360度之间):最后,如果H的值在该扇区中,则从H中减去240度,即: H = H 24 0 H = H-240^{\circ} 则RGB分量为 G = I ( 1 S ) B = I [ 1 + S cos H cos ( 6 0 H ) ] R = 3 I ( R + B ) G=I(1-S) \\ B=I[1+\frac{S\cos H}{\cos (60^{\circ}-H)}] \\ R = 3I-(R+B) 下面两个函数是用于RGB与HSI进行转换的M-函数

function hsi=rgb2hsi(rgb)

%提取图像的各个分量
rgb=im2double(rgb);%把rgb转化为双精度浮点类型
r=rgb(:,:,1);%获取图像第一个分量
g=rgb(:,:,2);%获取图像第二个分量
b=rgb(:,:,3);%获取图像第三个分量
%执行转换方程
num=0.5*((r-g)+(r-b));
den=sqrt((r-g).^2+(r-b).*(g-b));
theta=acos(num./(den+eps));%eps防止除数为0

H=theta;
H(b>g)=2*pi-H(b>g);
H=H/(2*pi);

num=min(min(r,g),b);
den=r+g+b;
den(den==0)=eps;%eps防止除数为0
S=1-3.*num./den;

H(S==0)=0;
I=(r+g+b)/3;
%3个分量联合成为一个HSI图像
hsi=cat(3,H,S,I);
function rgb=hsi2rgb(hsi)

%提取HSI的各个分量
hsi=im2double(hsi);%把hsi转化为双精度浮点类型
H=hsi(:,:,1)*2*pi;
S=hsi(:,:,2);
I=hsi(:,:,3);

%执行变换方程
R=zeros(size(hsi,1),size(hsi,2));
G=zeros(size(hsi,1),size(hsi,2));
B=zeros(size(hsi,1),size(hsi,2));

%RG区(0<=H<2*pi/3)
idx=find((0<=H) & (H<2*pi/3));%寻找0<=H<2*pi/3
B(idx)=I(idx).*(1-S(idx));
R(idx)=I(idx).*(1+S(idx).*cos(H(idx))./cos(pi/3-H(idx)));
G(idx)=3*I(idx)-(R(idx)+B(idx));

%BG区(2*pi/3<=H<4*pi/3)
idx=find((2*pi/3<=H) & (H<4*pi/3));%寻找2*pi/3<=H<4*pi/3
R(idx)=I(idx).*(1-S(idx));
G(idx)=I(idx).*(1+S(idx).*cos(H(idx)-2*pi/3)./cos(pi-H(idx)));
B(idx)=3*I(idx)-(R(idx)+G(idx));

%BR区(4*pi/3<=H<=2*pi)
idx=find((4*pi/3<=H) & (H<=2*pi));%寻找4*pi/3<=H<=2*pi
G(idx)=I(idx).*(1-S(idx));
B(idx)=I(idx).*(1+S(idx).*cos(H(idx)-4*pi/3)./cos(5*pi/3-H(idx)));
R(idx)=3*I(idx)-(G(idx)+B(idx));

%3个分量联合成为一个RGB图像
rgb=cat(3,R,G,B);
rgb=max(min(rgb,1),0);
>> rgb_image = imread('raccoon.jpg');
>> hsi_image = rgb2hsi(rgb_image);
>> j = hsi2rgb(hsi_image);
>> subplot(1,3,1),imshow(rgb_image,[]),title('RGB Image');
>> subplot(1,3,2),imshow(hsi_image,[]),title('RGB To Hsi Image');
>> subplot(1,3,3),imshow(j,[]),title('Hsi To RGB Image');

在这里插入图片描述
这里简单的转换看不出HSI模型的优势,下面我们在图像增强中表现出来:

>> I = imread('raccoon.jpg');
>> hsi_image = rgb2hsi(I);
>> hue = hsi_image(:,:,1);
>> sat = hsi_image(:,:,2);
>> int = hsi_image(:,:,3);
>> hue = hue + 1 / 360 * 5;
>> sat = sat + 0.01 * 5;
>> int = int + 0.01 * i;
>> int = hsi_image(:,:,3);
>> int = int + 0.01 * 5;
>> hue(hue>1)=1; hue(hue<0)=0;
>> sat(sat>1)=1; sat(sat<0)=0;
>> int(int>1)=1; int(int<0)=0;
>> hsi_image(:,:,1) = hue;
>> hsi_image(:,:,2) = sat;
>> hsi_image(:,:,3) = int;
>> rgb = hsi2rgb(hsi_image);
>> subplot(1,2,1),imshow(I),title('Original Image');
>> subplot(1,2,2),imshow(rgb),title('Transfer Image');

在这里插入图片描述
从上面这个简单的调整就可以看出来HSI模型是极其适合作为人调整图像的模型,我们无法很简单知道我们想要什么RGB值的图像,但我们纯粹想使图像“亮一点”,“鲜艳一点”使用HSI模型就很容易做到,同时也没有改变原图像中的颜色属性和种类,所以HSI 模型是开发基于彩色描述的图像处理算法的理想工具。

3 彩色图像处理的基础知识

彩色图像处理细分成3个主要领域:

(1)颜色变换(也叫彩色映射)
(2)单独彩色平面的空间处理
(3)颜色向量的处理

第一类处理每个彩色平面的像素,这类处理严格地以像素值为基础,而不是他们的空间坐标。第二类处理设计各个彩色平面的空间(邻域)滤波。第三类处理涉及以同时处理彩色图像的所有分量为基础的处理技术。实际上这三种领域主要的区别就是怎么看待彩色空间中的像素,由于每个像素点都是由多个值组合而成,但是我们不能把其看成组合,而是要将其看做向量,这样我们就可以推出同时处理图像公式。

令c代表RGB彩色空间中的任意向量: c = [ c R c G c B ] = [ R G B ] c=\begin{bmatrix}c_R \\ c_G \\ c_B\end{bmatrix}=\begin{bmatrix}R \\ G \\ B\end{bmatrix} 这个公式只出,c分量是一幅彩色图像在某个点的RGB分量。考虑彩色分量是坐标的函数这样的事实,用下边的符号表示: c ( x , y ) = [ c R ( x , y ) c G ( x , y ) c B ( x , y ) ] = [ R ( x , y ) G ( x , y ) B ( x , y ) ] c(x,y)=\begin{bmatrix}c_R (x,y)\\ c_G (x,y)\\ c_B(x,y)\end{bmatrix}=\begin{bmatrix}R(x,y) \\ G(x,y) \\ B(x,y)\end{bmatrix} 对于一幅大小为 M×N 的图像,有 MN 个这样的向量 c(x,y),其中,x=0,1,2…,M–1 且 y=0,1,2…,N–1。

在某些情况下,无论彩色图像每次处理一个平面,还是作为向量处理,都会得到相等的结果。然而,不会总是这样的情况。为了使两种方法都相同, 两个条件必须满足:首先,处理必须对向量和标量都可用。其次,针对向量的每个分量的操作必须与其他分量无关。

4 彩色变换

这里描述的是单一彩色模型情况下的技术,以处理彩色图像的彩色分量或单色图像的亮度分量为基础。对于彩色图像我们限定如下形式的变换: s i = T r ( r i ) i = 1 , 2 , . . . , n s_i=T_r(r_i)\quad i=1,2,...,n 这里,ri和si是输入和输出图像的彩色分量,n是ri时彩色空间的维数(或是彩色分量的数量),并且Ti是全彩色变换(或叫映射)函数。如果输入图像是单色的,公式将如下所示: s i = T i ( r ) i = 1 , 2 , . . . , n s_i=T_i(r)\quad i = 1,2,...,n 这里,r表示灰度级的值,si和Ti正如上文谈到的那样,并且n是在Si中彩色分量的数量。这个公式描述了灰度级对任意颜色的映射,这一处理在伪彩色变换或伪彩色映射中经常提到。注意,如果我们让r1=r2=r3=r,第一个公式可用来处理RGB中的单色图像。

三次样条内插用spline函数来实现:

>> x = 0:10;
>> y = sin(x);
>> subplot(1,2,1),plot(x,y,'+',x,y,'r'),title('Original');
>> xx = 0:.25:10;
>> yy = spline(x,y,xx);
>> subplot(1,2,2),plot(x,y,'o',xx,yy,'b'),title('Spline');

在这里插入图片描述
变换函数的说明可以用图形法操作控制点的方式交互地产生,那些控制点输入到 interpiq和spline函数并实时地显示将被处理的图像的结果。最后的结果是带有句柄的图像g,语法如下:

g = ice('property name', 'property value',) 

这里我没有找到ice函数的源码,感兴趣的同学自己试一下。

5 彩色图像的空间滤波

我们介绍的彩色图像的空间滤波集中在RGB图像上,但是对于其他彩色模型,基本概念也是可用的。我们用两个线性滤波的例子说明彩色图像的空间处理:图像平滑和图像锐化。

5.1 彩色图像的平滑处理

我们在之前的几章中讨论过,平滑单色图像的一种是定义相应的系数是1的模板,用空间模板的系数去乘所有像素的值,并用模板中的元素的总数去除。

令Sxy表示彩色图像中以(x,y)为中心的邻域的一组坐标。在该邻域中,RGB向量的平均值是: c ( x , y ) = 1 K ( x , y ) S x y c ( s , t ) \overline{c}(x,y)=\frac{1}{K}\sum_{(x,y)\in S_{xy}}c(s,t) 其中,K是邻域中像素点的数量。

>> rgb_image = imread('raccoon.jpg');
>> fR = rgb_image(:,:,1);
>> fG = rgb_image(:,:,2);
>> fB = rgb_image(:,:,3);
>> w = fspecial('average',25);
>> fR_filtered = imfilter(fR, w, 'replicate');
>> fG_filtered = imfilter(fG, w, 'replicate');
>> fB_filtered = imfilter(fB, w, 'replicate');
>> fc_filtered = cat(3,fR_filtered,fG_filtered,fB_filtered);
>> subplot(1,3,1),imshow(rgb_image),title('RGB Image');
>> subplot(1,3,2),imshow(fc_filtered,'Border','tight'),title('Smooth In RGB');
>> hsi_image = rgb2hsi(rgb_image);
>> H = hsi_image(:,:,1);
>> S = hsi_image(:,:,2);
>> I = hsi_image(:,:,3);
>> H_filtered = imfilter(H,w,'replicate');
>> S_filtered = imfilter(S,w,'replicate');
>> I_filtered = imfilter(I,w,'replicate');
>> h = cat(3,H_filtered,S_filtered,I_filtered);
>> f = hsi2rgb(h);
>> subplot(1,3,3),imshow(f),title('Smooth In HSI');

在这里插入图片描述
我们可以看到在RGB和HSI两个模型下平滑效果,RGB模型下的模糊就如之前灰度平滑图像一般变得模糊,在HSI模型下出现了很多边缘绿色细线,这是由于改变饱和度色调之间的相对关系,这样的平滑毫无意义,变模糊的同时改变了图像的属性。

5.2 彩色图像的锐化处理

用线性空间滤波锐化一幅RGB图像遵循与前面相同的步骤,但是应使用锐化滤波器,下面我们考虑使用拉普拉斯使图像锐化。

从向量分析中,我们知道向量定义为矢量,它们的分量等于输入向量的分量的拉普拉斯。在RGB彩色系统中,引入矢量c的拉普拉斯是: 2 [ c ( x , y ) ] = [ 2 R ( x , y ) 2 G ( x , y ) 2 B ( x , y ) ] \triangledown^2[c(x,y)]=\begin{bmatrix}\triangledown^2R(x,y) \\ \triangledown^2G(x,y) \\ \triangledown^2B(x,y)\end{bmatrix} 这说明,可以通过分别计算每个分量图像的拉普拉斯来计算全彩图像的拉普拉斯。

>> fb = imread('raccoon.jpg');
>> lapmask = [1 1 1; 1 -8 1; 1 1 1];
>> fb = tofloat(fb);
>> fen = fb - imfilter(fb, lapmask, 'replicate');
>> subplot(1,2,1),imshow(fb,[]),title('Original Image');
>> subplot(1,2,2),imshow(fen,[]),title('Enchance Image');

在这里插入图片描述
上图可见拉普拉斯作用于彩色图像效果还是很明显的,将浣熊的边缘与毛发都突出了出来。

6 直接在RGB矢量空间中处理

基于单独彩色平面的处理不等于直接在 RGB矢量空间中进行的计算。下面通过考虑彩色图像处理的两个重要应用来说明矢量处理:彩色边缘检测和区域分割。

6.1 使用梯度的彩色边缘检测

2D函数f(x,y)的梯度定义为如下矢量: f = [ g x g y ] = [ f x f y ] \triangledown f=\begin{bmatrix}g_x \\ g_y\end{bmatrix}=\begin{bmatrix}\frac{\partial f}{\partial x} \\ \frac{\partial f}{\partial y}\end{bmatrix} 这样的梯度定义可用于2D空间,但不能扩展到高维空间。将之运用到RGB图像的唯一方法是计算每个彩色图像分量的梯度,然后合并结果。遗憾的是,这与直接在RGB向量空间中计算边缘是不同的。

这里将梯度的概念延伸到向量函数。令r、g、b是RGB彩色空间沿R、G、B轴的单位矢量,定义矢量: u = R x r + G x g + B x b u = \frac{\partial R}{\partial x}r+\frac{\partial G}{\partial x}g+\frac{\partial B}{\partial x}b v = R y r + G y g + B y b v = \frac{\partial R}{\partial y}r+\frac{\partial G}{\partial y}g+\frac{\partial B}{\partial y}b 根据这些矢量的点积,定义gxx、gxy和gyy g x x = u u = u T u = R x 2 + G x 2 + B x 2 g_{xx}=u\cdot u=u^Tu=| \frac{\partial R}{\partial x}|^2+| \frac{\partial G}{\partial x}|^2+| \frac{\partial B}{\partial x}|^2 g y y = v v = v T v = R y 2 + G y 2 + B y 2 g_{yy}=v \cdot v=v^Tv=| \frac{\partial R}{\partial y}|^2+| \frac{\partial G}{\partial y}|^2+| \frac{\partial B}{\partial y}|^2 g x y = u v = u T v = R x R y + G x G y + B x B y g_{xy}=u\cdot v=u^Tv=\frac{\partial R}{\partial x}\frac{\partial R}{\partial y}+\frac{\partial G}{\partial x}\frac{\partial G}{\partial y}+\frac{\partial B}{\partial x}\frac{\partial B}{\partial y} 记住R、G和B,因而g是x和y的函数。使用这种符号,可以说明——c(x,y)的最大变换率方向将作为(x,y)函数由角度给出: θ ( x , y ) = 1 2 tan 1 [ 2 g x y g x x g y y ] \theta(x,y)=\frac{1}{2}\tan ^{-1}[\frac{2g_{xy}}{g_{xx}-g_{yy}}] 并且在该方向上,由θ(x,y)给出的变换率的值(例如梯度值)由下式给出: F θ ( x , y ) = { 1 2 [ ( g x x + g y y ) + ( g x x g y y ) cos 2 θ ( x , y ) + 2 g x y sin 2 θ ( x , y ) ] } 1 / 2 F_\theta (x,y)=\{ \frac{1}{2}[(g_{xx}+g_{yy})+(g_{xx}-g_{yy})\cos2\theta (x,y)+2g_{xy}\sin2\theta (x,y)]\}^{1/2} 数组θ(x,y)和Fθ(x,y)是与输入图像尺寸相同的图像。θ(x,y)的元素是用于计算梯度的每个点的角度,并且Fθ(x,y)是梯度图像。

>> fc = imread('raccoon.jpg');
>> [VG,A,PPG] = colorgrad(fc);
>> subplot(2,2,1),imshow(fc),title('Original Image');
>> subplot(2,2,2),imshow(VG),title('Gradient image in RGB');
>> subplot(2,2,3),imshow(PPG),title('Gradient Calculated In RGB');
>> subplot(2,2,4),imshow(abs(VG-PPG),[]),title('Difference Of Absolute Value');

在这里插入图片描述
从上面的结果可以看出来,使用在矢量中定义的梯度求法优于不同分量上梯度求和,可以显示出更多的细节。

6.2 在RGB向量空间中分割图像

分割的目的是对图像中的每个RGB像素进行分类,使之在指定范围内有或者没有一种颜色。为了执行这一比较,拥有相似性度量是必要的。最简单的度量之一是欧几里得距离。令z表示RGB空间的任意点。如果它们之间的距离小于指定的阈值T,那么z相似于m。z和m之间的欧几里德距离由下式给出: D ( z , m ) = z m = [ ( z m ) T ( z m ) ] 1 / 2 = [ ( z R m R ) 2 + ( z G m G ) 2 + ( z B m B ) 2 ] 1 / 2 D(z,m)=||z-m|| \\ =[(z-m)^T(z-m)]^{1/2} \\ =[(z_R-m_R)^2+(z_G-m_G)^2+(z_B-m_B)^2]^{1/2} 在这里,||·||是参数的范数,并且下表R、G、B表示向量m和z的RGB分量。点的轨迹D(z,m)≤T是半径为T的球。根据定义,包括在球的内部或表面的点满足特定的彩色准则,球外部的点则不满足。在图像中对这两组点编码,比如黑的白的,将会产生分割的二值图像。上述方程的有用归纳是距离度量形式: D ( z , m ) = [ ( z m ) T C 1 ( z m ) ] 1 / 2 D(z,m)=[(z-m)^TC^{-1}(z-m)]^{1/2} 在这里,C是我们要分割的有代表性的彩色样值的协方差矩阵。一般来说,这个距离以Mahalanobis距离为参考。D(z,m)≤T的轨迹描述了实的3D椭球体,它的重要特性是:主轴取向是在最大的数据分离方向上。当C=I时,同样的矩阵,Mahalanobis距离将至Euclidean距离。

下面先使用交互性的roipoly函数进行图像分割

>> f = imread('raccoon.jpg');
>> subplot(1,2,1),imshow(f),title('Original Image');
>> mask = roipoly(f);
>> red=immultiply(mask,f(:,:,1));
>> green=immultiply(mask,f(:,:,2));
>> blue=immultiply(mask,f(:,:,3));
>> g=cat(3,red,green,blue);
>> subplot(1,2,2),imshow(g),title('Selected Image');

在这里插入图片描述
下面用欧几里德距离和马氏距离分割图像:

>> [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);
>> E50 = colorseg('euclidean',f,50,m);
>> E100 = colorseg('euclidean',f,100,m);
>> subplot(1,3,1),imshow(f),title('Original Image');
>> subplot(1,3,2),imshow(E50),title('Division In Euclidean 1');
>> subplot(1,3,3),imshow(E100),title('Division In Euclidean 2');

在这里插入图片描述
这里先给出mahalanobis.m函数的源码

function D = mahalanobis( varargin )
param = varargin;
Y = param{1};
if length(param) == 2
    X = param{2};
    [Cx, mx] = covmatrix(X);
elseif length(param) == 3
    Cx = param{2};
    mx = param{3};
else 
    error('Wrong number of inputs')
end
mx = mx(:)';
Yc = bsxfun(@minus, Y, mx);
D = real(sum(Yc/Cx.*conj(Yc), 2));
end
>> M25=colorseg('mahalanobis',f,25,m,C);
>> M50=colorseg('mahalanobis',f,50,m,C);
>> subplot(1,3,1),imshow(f),title('Original Image');
>> subplot(1,3,2),imshow(M25),title('Division In Mahalanobis 1');
>> subplot(1,3,3),imshow(M50),title('Division In Mahalanobis 2');

在这里插入图片描述
从上面的结果可以看出在欧几里德距离分割图像的情况下是一种将所有像素点视为等价的同类,分割时给定不同的T值效果就不同,在实际情况下可能需要手动去调整T值完成实验,在马氏距离分割图像的情况下,明显可以看出马氏距离中的协方差矩阵明显平衡了不同像素之间的关系,不同阈值下分割的效果还是比较明显的,较好的将浣熊和绿叶分开了,这里我们仅仅初步了解图像分割,后面我们会有专门的一个章节认真学习图像分割。

猜你喜欢

转载自blog.csdn.net/weixin_42939683/article/details/106854862