数字图像处理第十一章 表示和描述


上一章中讨论的方法将一幅图像分割成多个区域后,分割后的像素集经常以一种适合于计算机进一步处理的形式来表示和描述。基本上,表示一个区域涉及两种选择:1)我们可以根据其外部特征(其边界)来表示区域,或2)根据其内部特征(如组成该区域的像素)表示区域。当我们关注的重点是形状特征时,可选择一种外部表示;而关注的重点是内部属性如颜色和纹理时,可以选择一种内部表示。有时,需要同时使用这两种表示。无论哪种情形,选择用来作为描绘子的特征都应尽可能地对大小、平移和旋转不敏感。本章中讨论的多数描绘子满足一种或多种这样的特性。

1 表示

1.1 链码

链码被用来以顺序连接的具有指定长度的直线段来表示边界。通常,这种表示基于这些线段的4连接和8连接。每个线段的方向使用一个数字编号方案编码,如下图所示,以这种方向性数字序列表示的编码称为佛雷曼编码。
在这里插入图片描述
数字图像通常以网格形式来获取并处理,在这种网格形式中,x和y方向的间距相等,所以链码可以通过沿着顺时针方向,并对连接每对像素的线段赋予一个方向的方法产生。这种方法通常不可接受,原因有二:1)得到的链码往往太长,2)噪声或不完美分割沿边界引起的任何较小干扰都会导致编码的变化,而这种变化与边界的主要形状特征可能不是相关的。

经常用于解决这些问题的一个方法是,选取一个较大的网格间距来对边界重取样,如下图所示,然后在边界穿过网格时,将一个边界点赋给大网格的一个节点,具体取决于原始边界与该节点的接近程度,再后,按这种方法得到的重取样边界可由一个4链码或8链码表示。
在这里插入图片描述
边界的链码取决于起始点。然而,链码可以通过一个简单的过程关于起始点归一化,过程如下:我们简单地将链码视为方向号码的中一个循环序列,并重新定义起始点,以便得到号码序列的最小整数值。我们也可以通过使用链码的一次差分而非链码本身,来对旋转进行归一化。这个差分是通过计算链码中分隔两个相邻像素的方向变换数,下图中按逆时针方向得到的差分。
在这里插入图片描述
佛雷曼链码及其某些变体

f = imread('Fig1105(a).tif');
h = fspecial('average', 9);
g = imfilter(f, h,'replicate');
gB = im2bw(g, 0.5);
B = bwboundaries(gB,'noholes');
d = cellfun('length', B);
[max_d, k] = max(d);
b = B{k};
[M N] = size(g);
g1 = bound2im(b, M, N);
[s, su]=bsubsamp(b, 50);
g2 = bound2im(s, M, N);
cn = connectpoly(s(:, 1), s(:, 2));
g3 = bound2im(cn, M, N);
c = fchcode(su);
subplot(2,3,1);imshow(f);title('(a)Original Image');
subplot(2,3,2);imshow(g);title('(b)Smooth Image');
subplot(2,3,3);imshow(gB);title('(c)Image After Threshold processing');
subplot(2,3,4);imshow(g1);title('(d)Boundary Of Image');
subplot(2,3,5);imshow(g2);title('(e)Boundary of subsampling');
subplot(2,3,6);imshow(g3);title('(f)Connect the points in (E)');

在这里插入图片描述
图B显示了使用 9x9平均模板的处理结果 ,图C所示的二值图像是经阈值处理后获得的,使用大约等于图像宽度 10%的网格进行分离。结果点可以显示为一幅图像,如图E所示。或使之成为连接序列(见图F),与图D相反,通过比较两幅图,为链码采用这种表示方案的优点是很明显的。链码可以从标定过的序列 su 获得。

1.2 使用最小周长多边形的多边形近似

数字边界可以用多边形任意精度来近似。对于一条闭合边界,当多边形的边数等于边界上的点数时,这种近似会变得很精确,此时,每对相邻的点定义了多边形的一条边。多边形近似的目的是使用数量尽可能少的线段来获取给定边界的基本形状。通常,该问题并不容易求解,且求解过程会转化为耗时的迭代搜索。然而,适度复杂的多边形近似技术还是很适合于图像处理任务。在这些近似技术中,最有效的一种技术是使用最小周长多边形(MPP)来表示边界,下面我们会讨论其定义。

基础

产生MPP的算法的一种直观方法是,用下图那样一组连接单元的集合封装一条边界(图中灰色部分,扫描件有点不清晰)。我们可以将该边界想象为一个橡皮条。允许橡皮条收缩时,橡皮条会受到由这些单元定义的边界区域内、外墙的约束。最终,该收缩回产生一个(关于这种几何排列的)最小周长的多边形,它被限制在用单元条封闭的区域内。注意,在该图中,所有MPP的顶点与内墙或外墙的角点一致。
在这里插入图片描述
上面讨论的单元方法将由原始边界包围的物体的形状简化为上图中间图中由灰墙围城的区域。下图中将这一形状显示为暗灰色。我们看到,其边界由4连接的直线段组成。假设我们按顺时针方向追踪这条边界,追踪时遇到的每个转向要么是一个凸顶点,要么是一个凹顶点,其中顶点的角是4连接边界的内角。凸顶点和凹顶点在下图中分别显示为白点和黑点。注意,这些顶点是下图中间图中浅灰色边界区域的内墙的顶点,暗灰色区域中的每个凹顶点(黑点)在浅灰色墙中有一个对应的“镜像”顶点,镜像顶点位于这个凹顶点的对角处。下图最右边显示了所有凹顶点的镜像顶点,为了方便参考,图中叠加了上图中MPP。我们看到MPP的顶点要么与内墙中的凸顶点(白点)一致,要么与外墙中的凹顶点的镜像顶点(黑点)一致。稍加思考就会发现,只有内墙的凸顶点和外墙的凹顶点才能成为MPP的顶点。因此,我们下面学习的算法只需要关注这些顶点。
在这里插入图片描述
MPP算法

前一段描述的围成一条数字边界的单位集合称为单元组合体。我们假设所考虑的边界本身不相交,这将产生简单连接的单元组合体。基于这些假设,并令W(白)和B(黑)分别表示凸顶点和镜像凹顶点,我们将观察结果说明如下:

1)由简单连接的单位组合体为界的MPP是非自相交的。
2)MPP的每个凸顶点都是一个W顶点,但并非边界的每个W顶点都是MPP的一个顶点。
3)MPP的每个镜像凹顶点都是一个B顶点,但并非边界的每个B顶点都是MPP的一个顶点。
4)所有的B顶点要么在MPP上,要么在MPP外;所有的W顶点要么在MPP上,要么在MPP内。
5)单元组合体中包含的顶点序列的最左上角顶点,总是MPP的一个W顶点。

这些断言已被证实证明,在下面的讨论中,我们需要计算点的三元组的方向。考虑点的三元组(a,b,c),并令这些店的坐标为a=(x1,y1),b=(x2,y2)和c=(x3,y3)。如果我们以矩阵的行来安排这些点: A = [ x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 ] A=\left. \begin{bmatrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ x_3 & y_3 &1 \end{bmatrix}\right. 则由基本矩阵分析有: d e t ( A ) = { > 0 , ( a , b , c ) = 0 , 线 < 0 , ( a , b , c ) det(A)=\left\{\begin{matrix}>0,如果(a,b,c)是一个逆时针序列 \\ =0,\qquad \qquad \qquad如果点是共线的 \\ <0,如果(a,b,c)是一个顺时针序列 \end{matrix}\right. 其中det(A)是A的行列式。在描述算法时,定义 s g n ( a , b , c ) = d e t ( A ) sgn(a,b,c)=det(A) 为了给MPP算法准备数据,我们形成一个列表,该列表中的行是每个顶点的坐标和一个表示顶点是W顶点还是B顶点的附加元素。上一节最后一张图中,凹顶点被镜像为按顺序排序的顶点很重要,第一个顶点是左上角的顶点,由性质5可知它是MPP的W顶点。令V0表示这个顶点。我们假设顶点按逆时针方向排列。寻找MPP的算法使用两个“爬行”点:一个白色的爬行点(WC)和一个黑色的爬行点(BC)。WC沿凸顶点(W)爬行,BC沿镜像凹顶点(B)爬行。这两个爬行点、找到的最后一个MPP顶点和正被考察的顶点,都是实现该过程所必须的顶点。

算法首先令WC=BC=V0(回忆可知,V0是一个MPP顶点)。然后,在算法的任何步骤中,令VL表示找到的最后一个MPP顶点,令Vk表示正在考察的顶点。在VL,Vk和两个爬行点之间存在如下三个条件之一:

a)Vk位于通过(VL,WC)的直线的正侧,即sgn(VL,WC,Vk)>0。
b)Vk位于通过(VL,WC)的直线的负侧,或Vk与(VL,WC)共线,即sgn(VL,WC,Vk)≤0。同时Vk位于通过(VL,BC)的直线的正侧,或Vk与(VL,BC)共线,即sgn(VL,BC,Vk)≥0。
c)Vk位于通过(VL,BC)的直线的负侧,即sgn(VL,BC,Vk)<0。

如果条件A成立,则下一个MPP顶点为WC,并且我们令VL=WC;然后,我们令WC=BC=VL来重新初始化该算法,并在VL之后的下一个顶点继续执行算法。如果条件B成立,则Vk变成一个候选的MPP顶点。在这种种情况下,如果Vk是凸顶点(即一个W顶点),则令WC=Vk;否则,我们置BC=Vk。然后使用列表下一个顶点继续执行算法。如果条件C成立,则下一个MPP顶点是BC,并且令VL=BC;然后,我们令WC=BC=VL来重新初始化该算法,并用VL之后的下一个顶点继续执行算法。

再次到达第一个顶点时,算法结束,此时算法已处理了多边形中所有顶点。算法找到的VL顶点是MPP的顶点。Matlab中已有函数可以实现MPP算法,更重要是理解算法。下面例子图是上一小节最后一张图的最右边的图。
在这里插入图片描述

1.3 标记

标记是边界的一位函数表示,可以通过多种方法产生。其中最简单的方法之一就是作为角度的函数画出某个内点(例如质心)到边界的距离,极坐标就是一种最简单的标记。

函数signature可用于查找给定边界的标记,默认使用边界的质心坐标。

[st, angle, x0, y0] = signature(b, x0, y0)

使用函数 cart2pol 将笛卡儿坐标转换为极坐标。

[THETA, RHO] = cart2pol(X, Y)

X 和 Y 是包含笛卡尔坐标点的坐标向量。向量 THETA 和 RHO 包含对应的极坐标中的角度和长度。

函数 pol2cart将极坐标转换为笛卡儿坐标。

[THETA, RHO] = pol2cart(X, Y)

1.4 边界片段

将边界分解为片段降低了边界的复杂度,并且通常简化了描述过程。当边界包含一个或多个携带形状信息的重要凹面时,这种方法具有吸引力。在这种情况下,使用由边界包围的区域凸壳对于边界的鲁棒分解是一种有力的工具。

任意集合S的凸壳H时包含S的最小凸集。集合的差H-S被称作S的凸缺D。
在这里插入图片描述
为了弄明白这些概念是如何将边界分成有意义的片段的,上图中显示了物体(集合S)及其凸缺(绿色区域D)。区域边界可以通过沿S轮廓标出进入或离开凸缺组成部分时引起变化的点加以分割。MATLAB工具必须用这种方法寻找凸壳并执行边界分解,有很多工具类包含函数regionprops。

1.5 骨骼

表示平面区域内结构形状的一种重要方法是将它简化为图形。这种简化可以通过一种细化(也称为骨架化)算法得到该区域的骨架来实现。一个区域的骨架可以用Blum提出的中轴变换来定义。边界为B的区域R的MAT如下图所示。对R中的每个点p,我们在B中找到与其最接近的邻接。如果p有多个这样的邻点,则认为p属于R的中轴(骨架)。
在这里插入图片描述
区域的MAT有一个直观的定义,该定义基于所谓的“草原之火概念”。我们将一个图像区域想象为由干草组成的平坦大草原,且假设沿草原边界点火。火线以相同的速度向区域中心推进。区域的MAT是同一时间多个火线到达点的集合。

f = imread('Fig1043(a).tif');
f = im2double(f);
h = fspecial ('gaussian',25,15);
g1 = imfilter(f, h, 'replicate');
g = im2bw(g1, 1.5*graythresh(g1));
s = bwmorph(g, 'skel', Inf) ;
s1 = bwmorph(s, 'spur', 8);
s2 = bwmorph(s1, 'spur', 7);
subplot(2,3,1);imshow(f);title('(a)Original Image');
subplot(2,3,2);imshow(g1);title('(b) Smooth Image');
subplot(2,3,3);imshow(g);title('(c)Threshold Processing');
subplot(2,3,4);imshow(s);title('(d)Bones Of Image');
subplot(2,3,5);imshow(s1);title('(e)The Image After 8 Deburring ');
subplot(2,3,6);imshow(s2);title('(f)The Image After 15 Deburring');

在这里插入图片描述
这里我没有找到更适合骨骼处理的图片,如果换作更简单的图像骨骼处理会更明显。

2 边界描绘子

2.1 一些简单的描绘子

边界的长度:边界的长度是其最简单的描绘子。一条边界上的像素数量可以给出其长度的粗阔近似。

边界的直径 D i a m ( B ) = max i , j [ D ( p i , p j ) ] Diam(B)=\max_{i,j}[D(p_i,p_j)] 式中,D是一种距离测度,pi和pj是边界上的点。直径的值和连接组成该直径的两个端点的直线段(该直线称为边界的长轴)的方向是边界的有用描绘子。边界的短轴定义为与长轴垂直的直线。由边界与两个轴相交的4个外部点组成的方框这样的长度,可以完全包围该边界。刚刚描述的这个方框称为基本矩形,长轴与短轴之比称为边界的偏心率。偏心率也是一个有用的描绘子。

2.2 形状数

如上一小节中解释的那样,链码边界的一次差分取决于起始点。形状数的阶n定义为其表示的数字个数。此外,对于闭合边界,n为偶数,其值限制了不同形状的数量。下图显示了阶为4,6,8的所有形状,以及他们的链码表示、一次差分和相应的形状数。尽管链码的一次差分与旋转无关,但总体而言,已编码的边界取决于网格的方向。
在这里插入图片描述
从上图可以看出,形状数与方向是无关的。

2.3 傅里叶描绘子

下图显示了xy平面上的k点的数字边界。从任意点(x0,y0)开始,坐标对(x0,y0),(x1,y1),(x2,y2),…,(xk-1,yk-1)沿逆时针方向追踪遇到的边界点。
在这里插入图片描述
这些坐标可以表示成x(k)=xk,y(k)=yk。使用这种标记法,边缘本身就可表达为坐标序列s(k)=[x(k),y(k)],k=0,1,2,…,k-1。进而可将每个坐标对当做复数来处理,从而得出: s ( k ) = x ( k ) + j y ( k ) s(k)=x(k)+jy(k) 从频域处理一章可知,序列s(k)的离散傅里叶变换(DFT)可写为: a ( u ) = k = 0 K 1 s ( k ) e j 2 π u k / K a(u)=\sum^{K-1}_{k=0}s(k)e^{-j2\pi uk/K} 复系数a(u)被称为边界的傅里叶描绘子。这些系数通过傅里叶反变换可以重构s(k): s ( k ) = 1 K u = 0 K 1 a ( u ) e j 2 π u k / K s(k)=\frac{1}{K}\sum_{u=0}^{K-1}a(u)e^{j2\pi uk/K} 然而,假设在计算傅里叶反变换时,仅使用前p个傅里叶系数,而不是使用全部系数,这相当于令上面函数中的a(u)=0,u>p-1。结果得到s(k)的近似值: s ^ ( k ) = 1 P u = 0 P 1 a ( u ) e j 2 π u k / K \hat{s}(k)=\frac{1}{P}\sum_{u=0}^{P-1}a(u)e^{j2\pi uk/K} 虽然仅使用P个傅里叶系数便得到了s^(k)的每一个分量,回想我们之前在第三章中学过的,高频分量决定细节部分,低频分量决定总体形状。因此,随着p的减少,边界细节的丢失将增加。

2.4 统计矩

1)低阶矩描述图像的整体特征
2)零阶矩反应目标的面积
3)一阶矩反应目标的质心位置
4)二阶矩反应了目标的主轴、辅轴的长短和主轴的方向角。
5)高阶矩主要描述了图像的细节,如目标的扭曲度和峰态的分布等。

描述g(r)形状的一种方法是将g(r)归一化到单位面积内,并将之当作直方图对待。换句话说,g(ri)可以看做ri发生的概率。这种情况下,r是随机变量,矩为: μ n = i = 0 K 1 ( r i m ) n g ( r i ) \mu _n=\sum^{K-1}_{i=0}(r_i-m)^ng(r_i) 这里 m = i = 0 K 1 r i g ( r i ) m=\sum^{K-1}_{i=0}r_ig(r_i) m为Vi平均值,0矩阵为1,一矩阵为0,二阶矩度量曲线在均值附近的扩展程度,三阶矩度量曲线在均值附近的对称性。

3 区域描绘子

3.1 函数regionprops

工具箱函数regionprops是用于计算区域描绘子的主要工具。语法为:

D=regionprops(L,properties)

L是一个标记矩阵,D是长度max(L( : ))的一个结构。

3.2 纹理

描绘区域的一种重要方法是量化该区域的纹理内容。尽管不存在纹理的正式定义,但在直觉上,这种描绘子提供了诸如平滑度、粗糙度和规律性等特性的测度。图像处理中用于描述区域纹理的三种主要方法是统计学、结构法和频谱法。

统计法获得诸如平滑、粗糙、粒状等纹理特征。
结构法处理图像像元的排列,如基于规则间距平行线的纹理描述。
频谱法基于傅里叶频谱的特性,主要用于检测图像中的全局周期性,方法是识别频谱中的高能量的窄波峰。

3.3 不变矩

大小为M×N的数字图像f(x,y)的二维(p+q)阶矩定义为: m p q = x = 0 M 1 y = 0 N 1 x p y q f ( x , y ) m_{pq}=\sum^{M-1}_{x=0}\sum^{N-1}_{y=0}x^py^qf(x,y) 相应的(p+q)阶中心矩定义为: μ p q = x = 0 M 1 y = 0 N 1 ( x x ) p ( y y ) q f ( x , y ) \mu _{pq}=\sum^{M-1}_{x=0}\sum^{N-1}_{y=0}(x-\overline{x})^p(y-\overline{y})^qf(x,y) 其中 x = m 10 m 00 y = m 01 m 00 \overline{x}=\frac{m_{10}}{m_{00}}和\overline{y}=\frac{m_{01}}{m_{00}} 由ηpq表示的归一化中心距定义为: η p q = μ p q μ 00 γ \eta_{pq}=\frac{\mu _{pq}}{\mu _{00}^\gamma} 式中, γ = p + q 2 + 1 \gamma=\frac{p+q}{2}+1 其中p+q=2,3,…。

由二阶矩和三阶矩可推出如下7个不变矩组:
在这里插入图片描述
这些矩组对于平移、尺度变化、镜像(内部为负号)和旋转是不变的。

4 主成分分析

主成分分析适用于边界和区域。用在区域(图像)上可以抽取方差最大的分量(主分量),用在边界上可以对其做缩放、平移和旋转的归一化。主分量变换也叫做霍特林变换。主分量(PCA)一般用于数据降维,因为大特征值对应图像细节(高频)。

主分量的使用:

f1 = imread('Fig1138(a).tif');
f2 = imread('Fig1138(b).tif');
f3 = imread('Fig1138(c).tif');
f4 = imread('Fig1138(d).tif');
f5 = imread('Fig1138(e).tif');
f6 = imread('Fig1138(f).tif');
subplot(2,3,1);imshow(f1,[ ]);title('(a)Visible blue band');
subplot(2,3,2);imshow(f2,[ ]);title('(b)Visible green band');
subplot(2,3,3);imshow(f3,[ ]);title('(c)Visible red band');
subplot(2,3,4);imshow(f4,[ ]);title('(d)Near infrared band');
subplot(2,3,5);imshow(f5,[ ]);title('(e)Mid infrared band');
subplot(2,3,6);imshow(f6,[ ]);title('(f)Thermal infrared band');

在这里插入图片描述

s=cat(3,f1,f2,f3,f4,f5,f6);
[ X , R ] = imstack2vectors(s);
P = principalcomps(X, 6);
gl = P.Y(:, 1);
gl = reshape(gl, 512, 512); 
g2 = P.Y(:, 2);
g2 = reshape(g2, 512, 512); 
g3 = P.Y(:, 3);
g3 = reshape(g3, 512, 512); 
g4 = P.Y(:, 4);
g4 = reshape(g4, 512, 512); 
g5 = P.Y(:, 5);
g5 = reshape(g5, 512, 512); 
g6 = P.Y(:, 6);
g6 = reshape(g6, 512, 512); 
subplot(2,3,1);imshow(gl,[ ]);title('(a可见蓝光波段主分量图像');
subplot(2,3,2);imshow(g2,[ ]);title('(b)可见绿光波段主分量图像');
subplot(2,3,3);imshow(g3,[ ]);title('(c)可见红光波段主分量图像');
subplot(2,3,4);imshow(g4,[ ]);title('(d)近红外波段主分量图像');
subplot(2,3,5);imshow(g5,[ ]);title('(e)中红外波段主分量图像');
subplot(2,3,6);imshow(g6,[ ]);title('(f)热红外波段主分量图像');

在这里插入图片描述

猜你喜欢

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