数字图像处理第九章 形态学图像处理


“形态学”一次通常指的是生物学的某个分支,常用来处理动物和植物的形状和结构。在这里,我们在数学形态学中也同样用这个词,将之作为提取图像分量的一种工具,这些分量在表示和描述区域形状(比如边界、骨骼、凸壳)时是很有用的。我们还对形态学预处理和后处理技术很感兴趣,比如形态学滤波、细化、裁剪。本章从图像处理方法开始过渡,在这些方法中,输入和输出均为图像;过渡到图像分析方法,在这些方法中,输出试图以某种方法描述图像内容。形态学是数学工具集的基石,这个工具集用于从图像提取“内涵”。其他方法将在之后余下章节讨论和应用。

1 预备知识

1.1 集合理论中的基本概念

令Z为实整数集合。用于产生数字图像的抽样处理可以被看做把xy平面分隔成网格状,其中每个网格的中心坐标是来自笛卡尔乘积Z2中的一对元素。在集合理论的术语中。如果(x,y)是来自Z2的整数,f是分配给每个不同坐标对(x,y)的亮度值(属于实数集合R中的实数)的映射,那么函数f(x,y)被称为数字图像。如果R中的元素也是整数,那么这幅数字图像就变成了二维函数,它的坐标与幅值均为整数。

令A为Z2中的集合,A中的元素是坐标(x,y)处的像素。如果w=(x,y)是A中的元素,那么可以写为: w A w\in A 所有像素坐标的集合均不属于集合A,记为Ac,由下式给出: A c = { w w A } A^c=\{w|w\notin A\} 这个集合称为集合A的补集。除了集合的一般操作,形态学操作通常还需要两个算子,它们特别针对元素均为像素坐标的集合。集合B的反射B^定义为: B ^ = { w w = b , b B } \hat{B}=\{w|w=-b,b\in B\} 点z=(z1,z2)对集合A的平移表示为(A)z,定义为: ( A ) z = { c c = a + z , a A } (A)_z=\{c|c=a+z,a\in A\}

1.2 二值图像、集合及逻辑算子

数学形态学的语言和理论经常存在二值图像的两种(但是等价)观点。迄今为止,我们已经把二值图像看做x和y空间坐标的二值函数。形态学理论把二值图像看做前景(1值)像素的集合,集合的元素属于Z2。集合操作,比如集合的并集和交集,可以直接应用于二值图像集合,例如,如果A和B是二值图像,那么C=AUB仍是二值图像。这里,如果A和B中相应的像素不是前景像素就是背景像素,那么C中的这个像素就是前景像素。以第一种观点,函数C有下式给出: C ( x , y ) = { 1 A ( x , y ) B ( x , y ) 1 1 0 C(x,y)=\left\{\begin{matrix}1 \quad A(x,y)或B(x,y)为1,或者两者均为1 \\ 0 \quad 其他 \end{matrix}\right. 另一方面,运用集合的观点,C由下式给出: C = { ( x , y ) ( x , y ) A ( x , y ) B ( x , y ) ( A B ) } C=\{(x,y)|(x,y)\in A 或(x,y)\in B 或(x,y)\in (A和B)\}

2 膨胀和腐蚀

膨胀和腐蚀操作是形态学图像处理的基础。

2.1 膨胀

A和B是Z2中的集合,表示为A⊕B的B对A的膨胀定义为 A B = { z ( B ^ ) z A ϕ } A\oplus B=\{z|(\hat{B})_z\cap A \neq \phi\} 这个公式是以B关于它的原点的映像,并且以z对映像进行平移为基础。B对A的膨胀是所有位移z的集合,这样,B^和A至少有一个元素的重叠的。根据这种解释,上式可以等价地写为 A B = { z [ ( B ^ ) z A ] A } A\oplus B=\{z|[(\hat{B})_z\cap A]\subseteq A\} 这里我们假定B是一个结构元,A是被膨胀的集合(图像物体)。
在这里插入图片描述
膨胀的应用:

>> A = imread('Fig0907(a).tif');
>> B = [0 1 0; 1 1 1; 0 1 0];
>> D = imdilate(A, B);
>> subplot(1,2,1),imshow(A),title('Original Image');
>> subplot(1,2,2),imshow(D),title('Image After Dilate');

在这里插入图片描述
与腐蚀不同,膨胀是一种会“增长”或“粗化”二值图像中的物体,上面我们就可以看出膨胀可以较好的连接裂缝,下面我们会看到腐蚀则会收缩或细化二值图像中的物体。

2.2 腐蚀

作为Z2中的集合A和B,表示为A⊖B的B对A的腐蚀定义为 A B = { z ( B ) z A } A\ominus B=\{z|(B)_z\subseteq A\} 表面上,该式指出B对A的腐蚀是一个用z平移的B包含在A中的所有点z的集合。在下面的讨论中,假定集合B是一个结构元。因为B必须包含在A中的这一陈述等价于B不与背景共享任何公共元素,故可以将腐蚀表达为如下的等价形式: A B = { z ( B ) z A c = ϕ } A\ominus B=\{z|(B)_z \cap A^c= \phi\} 在这里插入图片描述
腐蚀的应用:

>> A = imread('Fig0905(a).tif');
>> se = strel('disk', 10);
>> E10 = imerode(A, se);
>> se2 = strel('disk', 5);
>> E5 = imerode(A, se2);
>> E20 = imerode(A, strel('disk', 20));
>> subplot(2,2,1),imshow(A),title('a) Original Image');
>> subplot(2,2,2),imshow(E10),title('b) Erode By Circle With Radius 10');
>> subplot(2,2,3),imshow(E5),title('c) Erode By Circle With Radius 5');
>> subplot(2,2,4),imshow(E20),title('d) Erode By Circle With Radius 20');

在这里插入图片描述
从结果我们可以看出来,在图B中我们成功去掉了模板中的细线,图C中有一些引线没有去掉,因为他们的宽度大于10像素,图D中选用了太大结构元,不仅将引线去掉了,边缘的引线也被去掉了,所以无论在腐蚀还是膨胀中,选取合适大小的结构元处理会对结果有很大的影响。

3 膨胀与腐蚀的结合

3.1 开操作和闭操作

如我们所见的那样,膨胀会扩大一幅图像的组成部分,而腐蚀则会缩小一幅图像中的组成部分。这一小节我们讨论另外两个重要的形态学操作:开操作和闭操作。开操作一般会平滑物体的轮廓、断开较窄的狭颈并消除较细的突出物。闭操作同样也会平滑轮廓的一部分,但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除较小的孔洞,填补轮廓线中的断裂。

A被B形态学开操作表示为A∘B,定义为A被B腐蚀,然后再用B膨胀腐蚀结果: A B = ( A B ) B A\circ B=(A\ominus B)\oplus B 与开操作等价的数学表达式为: A B = { ( B ) z ( B ) z A } A\circ B= \cup\{(B)_z|(B)_z \subseteq A\} 其中,∪{}表示花括号中所有集合的并集。这个公式有个简单的几何解释:A∘B是B在A中全匹配平移的并集。

A被B形态学闭操作表示为A∙B,指先膨胀再腐蚀: A B = ( A B ) B A \bullet B=(A\oplus B)\ominus B 几何上,A∙B执行所有不与A重叠的B平移的补。

开操作和闭操作用工具箱函数imopen和imclose实现:

>> f = imread('FigP0936.tif');
>> se = strel('disk',10);
>> fo = imopen(f, se);
>> fc = imclose(f, se);
>> foc = imclose(fo, se);
>> subplot(2,2,1), imshow(f), title('a)Original Image');
subplot(2,2,2), imshow(fo), title('b)Open Of A');
subplot(2,2,3), imshow(fc), title('c)Close Of A');
subplot(2,2,4), imshow(foc), title('d) Close Of B');

在这里插入图片描述
从两种结果上就可以看出我们之前提出开操作与闭操作的特点,两个操作在不同情况下可以发挥出特定作用,比如用来去除微小噪声达到一个滤波器的效果:

>> f = imread('Fig0911(a).tif');
>> se = strel('square', 3);
>> fo = imopen(f, se);
>> foc = imclose(fo, se);
>> subplot(1,3,1), imshow(f), title('a)Original Image');
subplot(1,3,2), imshow(fo), title('b)Open First');
subplot(1,3,3), imshow(foc), title('c)Close Second');

在这里插入图片描述
从结果可见噪声或斑点清楚得相当干净,但是这种方法由缺点,即有些指纹纹路未被完全修复,并还有间断。这种情况并非出乎意料,因为在保持连续性的过程中未设置任何条件。

3.2 击中或击不中变换

形态学击中或击不中变换是形状检测的基本工具,通常,能够匹配一幅图像中像素的特定结构是很有用的,比如鼓励的前景像素或是线段的端点像素。击中或击不中变换对这类应用非常实用。A被B击中或击不中变换比表示为AB。这里,不像以往那样单个的元素,B是结构元对,B=(B1,B2)。击中或击不中变换用两个结构元定义: A B = ( A B 1 ) ( A c B 2 ) A\otimes B=(A\ominus B_1)\cap(A^c\ominus B_2)

击中或击不中变换应用:

>> f = imread('FigP0918.tif');
>> B1 = strel([0 0 0; 0 1 1; 0 1 0]);
>> B2 = strel([1 1 1; 1 0 0; 1 0 0]);
>> g = bwhitmiss(f, B1, B2);
>> subplot(1,2,1),imshow(f), title('a)Original Image')
>> subplot(1,2,2),imshow(g), title('b) Result Of HMT')

在这里插入图片描述
从结果可以看到最后得到的点是孤立的像素,该像素点表示击中结构元的中心像素(一般在重心)位置,代表该位置击中了结构元。

4 标记连通分量

迄今为止,已经讨论过的概念是为了更适用于所有单个前景(或所有的背景)像素以及和它们紧靠的相邻像素。下面考虑单个前景像素和左右前景像素集合之间重要的“中间部分”。这就引入了连通分量的概念。

如果像素p和q之间存在一条4连接通路,就称这两个前景像素为4连接的,这里包括所有前景像素。如果它们之间还存在8连接通路,就成它们为8连接的。对于任意的前景像素P,与之相连接的所有前景像素的集合被称为包含p的连通分量。

工具箱函数bwlabel计算二值图像中所有的连通分量,应用一下计算和显示图像连通分量的质心:

f = imread('FigP0918.tif');
imshow(f);title('(a)Original Image');
[L,n]=bwlabel(f);        
[r,c]=find(L==3);         
rbar=mean(r);
cbar=mean(c);
figure,imshow(f);title('(b)Search Centroid');
hold on            
for k=1:n
   [r,c]=find(L==k);
   rbar=mean(r);
   cbar=mean(c);
   plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k',...
        'MarkerFaceColor','k','MarkerSize',10);
   plot(cbar,rbar,'Marker','*','MarkerFaceColor','w'); 
end

在这里插入图片描述
在这里插入图片描述

5 形态学重建

重建是一种形态学变换,包括两幅图像和一个结构元(代替单幅图像和一个结构元)。一幅图像是标记,是变换的开始点;一幅图像是模板,用于约束变换过程。结构元用来定义连通性,这里使用8连接(默认值),这意味着一下讨论的B是3×3的值为1的矩阵,中心坐标定义为(2,2)。在这一小节我们处理二值图像。

如果G是模板,F是标记,从F重建G记作RG(F),用以下迭代过程定义:
1)将标记图像F初始化为h1
2)建立结构元:B=ones(3)。
3)重复hk+1=(hk⊕B)∩G,直到hk+1=hk
标记F必须是G的子集,也就是F⊆G。

5.1 通过重建进行开操作

在形态学开操作中,腐蚀典型地去除小的物体,且随后的膨胀趋向于恢复保留的物体形状。 然而,这种恢复的精确度取决于形状和结构元之间的相似性。本节讨论的方法,通过重建进行开操作能准确地恢复腐蚀之后的物体形状。用结构元B对图像 G通过重建进行开操作可定义为 RG(G⊖B)。下面通过重建进行开操作:

f = imread('Fig0929.tif');
fe=imerode(f,ones(51,1));%竖线腐蚀
fc=imclearborder(f,8);%清除边界,28邻接
ff=imfill(f,'holes');%对f进行孔洞填充
fobr=imreconstruct(fe,f);%fe做标记
fo=imopen(f,ones(51,1));%竖线做开运算
subplot(3,2,1),imshow(f);title('(a)Original Image');
subplot(3,2,2),imshow(fe);title('(b)');
subplot(3,2,3),imshow(fo);title('(c)');
subplot(3,2,4),imshow(fobr);title('(d)');
subplot(3,2,5),imshow(ff);title('(e)');
subplot(3,2,6),imshow(fc);title('(f)');

在这里插入图片描述
图A是原始图像,图B用竖线腐蚀过的图像,图C用竖线进行开操作,图D用竖线通过重建进行的开操作,图E填充孔洞,图F清除边界的图像。

5.2 填充孔洞

形态学重建有很广的实际应用范围,每个应用的特点都取决于标记和模板图像的选择,例如,令I表示二值图像,假设我们选择标记图像F,除了图像边缘外,其余部分都为0,边缘部分设置为1-I: F ( x , y ) = { 1 I ( x , y ) ( x , y ) I 0 F(x,y)=\left\{\begin{matrix}1-I(x,y) \quad (x,y)是I的边缘 \\ 0 \quad \quad \quad 其他\end{matrix}\right. 然后 H = [ R I c ( F ) ] c H=[R_{I^c}(F)]^c 是一幅相当于I的填充了所有孔洞的二值图像。上面例子中工具箱函数imfill可以自动完成上述运算。

5.3 清楚边界物体

重建的另一种应用是清楚图像中与边缘相接触的物体。同样,关键人物仍然是选择合适的标记来达到希望的效果。假定定义标记图像F为: F ( x , y ) = { I ( x , y ) ( x , y ) I 0 F(x,y)=\left\{\begin{matrix}I(x,y) \quad (x,y)是I的边缘 \\ 0 \quad \quad \quad 其他\end{matrix}\right. 其中,I是原始图像,然后以I作为模板图像,重建 H = R I ( F ) H=R_I(F) 得到一幅图像H,其中仅包含与边界接触的物体。上面例子中工具箱函数imclearborder自动执行以上全过程。

6 灰度级形态学

本章之前讨论的所有二值形态学运算,除了击中或击不中变换,都可以自然地扩展到灰度图像。在本节中,正如二值图像那样,我们从膨胀和腐蚀开始,他们在灰度图像是以像素邻域的最大值和最小值来定义的。

6.1 膨胀和腐蚀

用结构元b对灰度图像f的灰度进行膨胀,表示为f⊕b,定义为: ( f b ) ( x , y ) = m a x { f ( x x , y y / ) + b ( x , y ) ( x , y ) D b } (f\oplus b)(x,y)=max\{f(x-x',y-y/)+b(x',y')|(x',y')\in D_b\} 其中,Db为b的域,f(x,y)假设在f域之外为负无穷。

用结构元b对f进行灰度级腐蚀,表示为f⊖b,定义为: ( f b ) ( x , y ) = m i n { f ( x + x , y + y ) b ( x , y ) ( x , y ) D b } (f\ominus b)(x,y)=min\{f(x+x',y+y')-b(x',y')|(x',y')\in D_b\} 其中,Db为b的域,f假设在f域之外为正无穷。

灰度图像的形态学梯度定义为膨胀运算与腐蚀运算的结果之间的差值。下面我们来看灰度值形态学的腐蚀和膨胀:

>> f = rgb2gray(imread('raccoon.jpg'));
se=strel('square',3); 
gd=imdilate(f,se);    
ge=imerode(f,se);    
morph_grad=imsubtract(gd,ge); 
>> subplot(2,2,1);imshow(f,[]);title('(a)Original Image');
>> subplot(2,2,2),imshow(gd,[]);title('(b)Dilate');
>> subplot(2,2,3),imshow(ge,[]);title('(c)Erode');
>> subplot(2,2,4),imshow(morph_grad,[]);title('(d)Gradient');

在这里插入图片描述
膨胀会丢失一些小的细节,图像会变的更加明亮,腐蚀得到图像变的更暗,尺寸更小。

6.2 开操作和闭操作

在灰度图像中,开操作和闭操作的表达式与二值图像拥有相同的形式。用结构元b对f进行开操作,可表示为f○b,定义为: f b = ( f b ) b f\circ b=(f\ominus b)\oplus b 其中,腐蚀和膨胀与上一小节定义相同。同样,b对f的闭操作,表示为f∙b,定义为先膨胀再腐蚀: f b = ( f b ) b f\bullet b=(f\oplus b)\ominus b 这两个操作都有简单的几何解释。假设图像函数f(x,y)用三维表面表示,也就是说,这幅图像的强度值是xy平面上的高度值。然后,b对f的开操作可以在几何上解释为推动结构元b,使之沿表面f的下沿平移,并移过整个f的域。开操作的结果是寻找结构元滑过的f下沿上所能达到的最高点。

开运算闭运算做形态学平滑:

>> f = imread('Fig0941.tif');
subplot(3,2,1),imshow(f),title('(a)Original Image');   
se=strel('disk',5);      
fo=imopen(f,se);          
subplot(3,2,2),imshow(f),title('(b)Open By Disk 5');   
foc=imclose(fo,se);  
subplot(3,2,3),imshow(foc),title('(c)Close B'); 
focd=imclose(f,se);  
subplot(3,2,4),imshow(focd),title('(d)Close A'); 
foce=imopen(focd,se);  
subplot(3,2,5),imshow(foce),title('(e)Open D'); 
fasf=f;  
for i=2:5  
    se=strel('disk',i);  
    fasf=imclose(imopen(fasf,se),se);  
end  
subplot(3,2,6),imshow(fasf),title('(f)Open Close Alternate Filtering');

在这里插入图片描述
图B显示了开操作的图像 fo, 在这里,我们看到,亮区域己经被调低了(平滑),木钉上的暗条文几乎没有受影响。图C显示了开操作的闭操作 foe。现在我们注意到,暗区域已经被平滑得很好了,结果是整个图像得到全部平滑。这种过程通常叫做开-闭滤波。先开运算后闭运算构成噪声滤波器,用来平滑图像并去除噪声。图D显示了原始图像的闭操作结果。木钉上的暗条文已经被平滑掉了,主要留下了亮的细节(注意背景中的亮条文)。图E显示了这些条文的平滑和木钉表面的进一步平滑效果。最终结果是原始图像得到全部平滑。图F是交替顺序滤波,交替顺序滤波的一种形式是用不断增大的一系列结构元执行开-闭滤波,刚开始用小的结构元,增加大小,直到与图B和C中结构元的大小相同为止。交替顺序滤波与单个开-闭滤波相比,处理图像更平滑一些。

6.3 重建

形态学上灰度级重建有几种:
1)h极小值变换:标记图像是由掩膜挑选ing减去常量所得。
2)开运算重建:先腐蚀后重建。
3)闭运算重建:对图像求补、计算其开操作重建并对结果求补。
用重建去移除复杂的背景:

f = imread('Fig0944.tif');
f_obr=imreconstruct(imerode(f,ones(1,71)),f);
f_o=imopen(f,ones(1,71));
f_thr=imsubtract(f,f_obr);
f_th=imsubtract(f,f_o);
g_obr=imreconstruct(imerode(f_thr,ones(1,11)),f_thr);
g_obrd=imdilate(g_obr,ones(1,2));
f2=imreconstruct(min(g_obrd,f_thr),f_thr);
subplot(3,3,1),imshow(f),title('(a)Original Image');
subplot(3,3,2),imshow(f_obr),title('(b)Open In Rebuild');
subplot(3,3,3),imshow(f_o),title('(c)Open A');
subplot(3,3,4),imshow(f_thr),title('(d)Top Cap Operation In Rebuild');
subplot(3,3,5),imshow(f_th),title('(e)Top Cap Operation');
subplot(3,3,6),imshow(g_obr),title('(f)Rebuild B By Level');
subplot(3,3,7),imshow(g_obrd),title('(g)Dilate By Level');
subplot(3,3,8),imshow(f2),title('(h)Result');

在这里插入图片描述
为了消除每个键盘上方的水平反射光,利用这些反射比图像中任何文本字符都要宽的这个事实。用长水平线的结构元执行重建的开操作,重建的开操作显示于图B中。为了进行对比,图C显示了标准的开操作 。重建的开操作在提取水平的相邻键之间的背景方面的确较好。从原始图像中减去重建的开操作被称为顶帽重建 , 结果示于图D中。消除图D中键右边的垂直反射光。这可以通过用短的水平线执行重建的开操作来完成,在这个结果中(见图F),垂直的反射光不见了。但是,包括字母的垂直的细笔画也不见了。我们利用了那些已被错误消除的字母非常接近第一次膨胀(见图G)后还存在的其他字符这一事实,以 f_thr 作为模板,以 min(g_obrd,f_thr) 作为标记,图H显示了最后的结果。注意,背景上键盘的阴影和反射光都成功去除了。

猜你喜欢

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