Bootstrap

【数字图像处理第9章——形态学图像处理】

9.形态学图像处理

9.1 概述

什么是形态学

形态学:生物学中研究动植物结构的一个分支

数学形态学(也称图像代数):以形态为基础对图像进行处理(分析)的数学工具

形态学图像处理的作用

可以简化图像数据,去除图像中不重要的结构,仅保持图像的基本形状特性

请添加图片描述

基本思想

使用具有一定形态的结构元素度量和提取图像中的对应形状,以达到对图像进行处理和分析的目的

数学基础与基本操作

形态学图像处理的数学基础和所用语言是集合论

形态学图像处理的基本运算有4个:膨胀腐蚀开启闭合

集合的反射

一个集合B的反射定义如下:
B ^ = { w ∣ w = − b , b ∈ B } 集合 B 及其反射关于原集合原点对称,即相对于原点旋转 180 ° \hat B=\{w|w=-b,b\in B\}\\ 集合B及其反射关于原集合原点对称,即相对于原点旋转180° B^={ww=b,bB}集合B及其反射关于原集合原点对称,即相对于原点旋转180°

集合的平移

一个集合B的平移定义如下:
( B ) z = { c ∣ c = b + z , b ∈ B } z = ( z 1 , z 2 ) (B)_z=\{c|c=b+z,b\in B\}\\ z=(z_1,z_2) (B)z={cc=b+z,bB}z=(z1,z2)

9.2 二值图像形态学处理的基本概念

  • 二值图像形态学处理的运算对象是集合
    • 设A为像素集合,B为结构元素(本身也是一个像素集合,其成员是感兴趣目标的像素),其处理过程是用B对A进行操作
  • B对A的具体操作
    • 通过让B在A上平移,以便B的原点访问A的每一个元素,以此得到一个新的像素集合
  • 结构元素必须指定一个原点
    • 结构元素的原点是形态学运算的参考点(当结构元素对称且未显示原点时,通常假定原点位于对称中心处)
    • 注意,原点可以包含在结构元素中,也可以不包含在结构元素中(结构元麦原卢的位智不同.运算结果也不相同)
  • 当对图像操作时,要求结构元素是矩形阵列(通过添加最小可能数量的背景元素形成一个矩形阵列来实现)

请添加图片描述

注意 : 在实际处理中,只考虑图像和结构元素中有效像素点,也即只考虑感兴趣前景部分 . 背景部分不予老虑 \color{red}{注意:在实际处理中,只考虑图像和结构元素中有效像素点,也即只考虑感兴趣前景部分.背景部分不予老虑} 注意:在实际处理中,只考虑图像和结构元素中有效像素点,也即只考虑感兴趣前景部分.背景部分不予老虑

9.3 膨胀(加深前景像素点)

效果:扩大图像中的物体(背景像素点变为前景像素点)

定义:设A为原始二值图像,B是结构元素,则A被B膨胀定义为:

A ⨁ B = { z ∣ ( B ^ ) z ∩ A ≠ ∅ } 对结构元素 B 做反射,反射后再做平移,平移后的图像与原始图像 A 交集不为空,就在位置 z 输出一个前景值 A\bigoplus B =\{z|(\hat B)_z \cap A ≠ \emptyset \}\\ 对结构元素B做反射,反射后再做平移,平移后的图像与原始图像A交集不为空,就在位置z输出一个前景值 AB={z(B^)zA=}对结构元素B做反射,反射后再做平移,平移后的图像与原始图像A交集不为空,就在位置z输出一个前景值

又定义为:
A ⨁ B = { z ∣ [ ( B ^ ) z ∩ A ] ≠ ⊆ A } A\bigoplus B =\{z|[(\hat B)_z \cap A] ≠ \subseteq A \} AB={z[(B^)zA]=A}
即,A被B膨胀的结果是满足上式的所有位移z的点(前景像素点)的集合

请添加图片描述

A=imread('图片路径');
subplot(1,2,1);
imshow(A);
B=[0 1 0;1 1 1;0 1 0];
result=imdilate(A,B);
subplot(1,2,2);
imshow(result);

请添加图片描述

9.4 腐蚀(细化前景像素点)

效果:缩小图像中的物体(前景像素点变为背景像素点)

定义:设A为原始二值图像,B是结构元素,则A被B腐蚀定义为:

A ㊀ B = { z ∣ ( B ) z ⊆ A } 结构元素完全包含在原始图像的前景目标中 A㊀B=\{z|(B)_z\subseteq A\}\\ 结构元素完全包含在原始图像的前景目标中 AB={z(B)zA}结构元素完全包含在原始图像的前景目标中

即,将结构元素B相对于集合A进行平移,只要平移后结构元素都包含在集合A中,则这些位移的点(前景像素点)的集合即为腐蚀结果。

请添加图片描述

腐蚀在数学形态学运算中的作用

如果结构元素取3×3的方块,腐蚀将使物体的边界沿周边减少一个像素

腐蚀可以去除小于结构元素的物体(如:毛刺、小凸起等)。选取不同大小的结构元素,可以在原图像中去掉不同大小的物体

如果两个物体之间有细小的连通,那么当结构元素足够大时,通过腐蚀运算可以将两个物体分开

A=imread('图片路径');
subplot(2,3,2);
imshow(A);
title('原始图像');
B=strel('square',11);
result=imerode(A,B);
subplot(2,3,4);
imshow(result);
title('边长为11的方形结构元素腐蚀后的图像');
B=strel('square',15);
result=imerode(A,B);
subplot(2,3,5);
imshow(result);
title('边长为15的方形结构元素腐蚀后的图像');
B=strel('square',45);
result=imerode(A,B);
subplot(2,3,6);
imshow(result);
title('边长为45的方形结构元素腐蚀后的图像');

请添加图片描述

A=imread('图片路径');
subplot(1,3,1);
imshow(A);
title('原始图像');
B=strel('square',13);
%先腐蚀
result1=imerode(A,B);
subplot(1,3,2);
imshow(result1);
title('先使用13*13像素大小的方形结构元素腐蚀后的图像');
%后膨胀
result2=imdilate(result1,B);
subplot(1,3,3);
imshow(result2);
title('再用使用13*13像素大小的方形结构元素膨胀后的图像');

请添加图片描述

9.5 开操作

效果:断开较窄的狭颈、消除细的突出物,使图像的轮廓变得光滑

定义:设A为原始二值图像,B是结构元素,则使用结构元素B对集合A进行开启操作,定义为:
A ∘ B = ( A ㊀ B ) ⨁ B A\circ B=(A㊀B)\bigoplus B AB=(AB)B
即,先用B对A 腐蚀,然后用B对腐蚀结果进行膨胀。

  • 性质

    • A ∘ B 是 A 的子集 A\circ B是A的子集 ABA的子集

    • 如果 C 是 D 的子集,并采用结构元素 B 对 C 和 D 进行开启运算 , 结果还是保持原来的关系( C 是 D 的子集) 即 C ∘ B 是 D ∘ B 的子集 如果C是D的子集,并采用结构元素B对C和D进行开启运算,结果还是保持原来的关系(C是D的子集)\\ 即C\circ B是D\circ B的子集 如果CD的子集,并采用结构元素BCD进行开启运算,结果还是保持原来的关系(CD的子集)CBDB的子集

    • ( A ∘ B ) ∘ B = A ∘ B , 即多次开启的运算结果和一次开启的运算结果一致 (A\circ B)\circ B=A\circ B,\\ 即多次开启的运算结果和一次开启的运算结果一致 (AB)B=AB,即多次开启的运算结果和一次开启的运算结果一致

9.6 闭操作

效果:填补狭窄的间断、小的孔洞,使图像的轮廓变得光滑

定义:设A为原始二值图像,B是结构元素,则使用结构元素B对集合A进行闭合操作,定义为:
A ⋅ B = ( A ⨁ B ) ㊀ B A\cdot B=(A\bigoplus B)㊀B AB=(AB)B
即,先用B对A膨胀,然后用B对结果进行腐蚀

  • 性质

    • A ⋅ B 是 A 的子集 A\cdot B是A的子集 ABA的子集

    • 如果 C 是 D 的子集,并采用结构元素 B 对 C 和 D 进行开启运算 , 结果还是保持原来的关系( C 是 D 的子集) 即 C ⋅ B 是 D ⋅ B 的子集 如果C是D的子集,并采用结构元素B对C和D进行开启运算,结果还是保持原来的关系(C是D的子集)\\ 即C\cdot B是D\cdot B的子集 如果CD的子集,并采用结构元素BCD进行开启运算,结果还是保持原来的关系(CD的子集)CBDB的子集

    • ( A ⋅ B ) ⋅ B = A ⋅ B , 即多次闭合的运算结果和一次闭合的运算结果一致 (A\cdot B)\cdot B=A\cdot B,\\ 即多次闭合的运算结果和一次闭合的运算结果一致 (AB)B=AB,即多次闭合的运算结果和一次闭合的运算结果一致

请添加图片描述

A=imread('图片路径');
subplot(2,2,1);
imshow(A);
title('(a) 原二值图A');
B=strel('square',20);% 通过strel函数生成具有一定形状的结构元素
result_open=imopen(A,B);
subplot(2,2,2);
imshow(result_open);
title('(b) 开启运算的结果图');
result_close=imclose(A,B);
subplot(2,2,3);
imshow(result_close);
title('(c) 闭合运算的结果图');
result_open_close=imclose(result_open,B);
subplot(2,2,4);
imshow(result_open_close);
title('(d) 图像(b)经闭合运算后的结果');

请添加图片描述

A=imread('图片路径');
subplot(1,3,1);
imshow(A);
title('(a) 带有杂散点的指纹图像','FontSize',15);
B=strel('square',3);
result_open=imopen(A,B);
subplot(1,3,2);
imshow(result_open);
title({'(b) 开启运算的结果图';'(消除了杂散点但在纹脊上产生了许多缺口)'},'FontSize',15); 
result_open_close=imclose(result_open,B);
subplot(1,3,3);
imshow(result_open_close);
title({'(c) 对(b)图进行闭合运算的结果图';'(填充了纹脊上的缺口)'},'FontSize',15); 

请添加图片描述

形态学的主要应用

边界提取

图像A的边界b(A)定义为:
b ( A ) = A − ( A ㊀ B ) B 是适当的结构元素 b(A)=A-(A㊀B)\\ B是适当的结构元素 b(A)=A(AB)B是适当的结构元素
即,先用B对A腐蚀,然后用A减去腐蚀得到的结果

尽管图示中的结构元素是最常用的,但并不是唯一的。例如,使用5×5的结构元素,将得到2个像素宽的边界

A=imread('图片路径');
subplot(3,2,3);
imshow(A);
title('(a)一幅简单的二值图像 ','FontSize',15); 
B=strel('square',3);
result=A-imerode(A,B);
subplot(3,2,2);
imshow(result);
title('(b)使用3*3白色方形结构元素提取的边界','FontSize',15); 
B=strel('square',5);
result=A-imerode(A,B);
subplot(3,2,6);
imshow(result);
title('(c)使用5*5白色方形结构元素提取的边界','FontSize',15); 

请添加图片描述

孔洞填充

  • 定义

    • 一个孔洞可被定义为由前景像素相连接的边界所包围的一个背景区域
  • 实现

    • 令A表示一个集合:其元素是8连通的边界,且每个边界包围一个孔洞

    • 令X_0表示一个与包含A的相同大小的阵列,其初始状态为:

      • 包含每个孔洞中的一个指定位置处的前景像素点
      • 除了上述的前景像素点之外,其余元素均为背景像素点
    • 在给定A和X_0的前提下,采用前景像素填充A的所有孔洞的过程如下:

      • 其中,B是对称结构元素,如下:

      • [ 0 1 0 1 1 1 0 1 0 ] \begin{bmatrix} 0 & 1 & 0 \\ 1 & 1 & 1 \\0 & 1 & 0 \end{bmatrix} 010111010

      • 在算法执行过程中,如果 X k = X k − 1 ,则算法在迭代的第 k 步结束 在算法执行过程中,如果X_k=X_{k-1},则算法在迭代的第k步结束 在算法执行过程中,如果Xk=Xk1,则算法在迭代的第k步结束

      • 集合 X k 包含所有被填充的孔洞, X k 和 A 的并集则包含被填充的孔洞及其边界 集合X_k包含所有被填充的孔洞,X_k和A的并集则包含被填充的孔洞及其边界 集合Xk包含所有被填充的孔洞,XkA的并集则包含被填充的孔洞及其边界

X k = ( X k − 1 ⨁ B ) ∩ A c , k = 1 , 2 , 3... A c 为 A 的补集 X_k=(X_{k-1}\bigoplus B)\cap A^c,k=1,2,3...\\ A^c为A的补集 Xk=(Xk1B)Ac,k=1,2,3...AcA的补集

注意:在每一步运算中,膨胀结果与 A c 的交集操作实现了将膨胀结果限制在 感兴趣区域内,即条件膨胀 ( 否则,上述公式的膨胀将填充整个区域 ) \color{red}{注意:在每一步运算中,膨胀结果与A^c的交集操作实现了将膨胀结果限制在}\\ \color{red}{感兴趣区域内,即条件膨胀(否则,上述公式的膨胀将填充整个区域)} 注意:在每一步运算中,膨胀结果与Ac的交集操作实现了将膨胀结果限制在感兴趣区域内,即条件膨胀(否则,上述公式的膨胀将填充整个区域)

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

骨架抽取

  • 骨架的概念
    • 图像的一种细化结构(图像中物体的骨骼部分)),由物体的若干条细化的中轴线组成,描述了图像中物体的形状和方向信息
  • 骨架的作用
    • 通过骨架抽取可以简化图像中物体的信息而保留其同伦结构(结构、形状和笔画等并没有发生变化)
    • 有助于突出形状特点和减少冗余信息量
    • 在图像工程领域有着广泛的应用(如形状分析、模式识别、数据压缩)

请添加图片描述

  • 骨架的定义(最大内切圆盘概念)
    • 物体A的骨架由A内部所有的最大内切圆盘的圆心组成,骨架的每个点都对应一个相应的最大内切圆盘。
    • 其中,最大内切圆盘不是其它任何完全属于A的圆盘的子集并且至少两点与集合A的边界轮廓相切。

请添加图片描述

  • 骨架抽取的实现
    • 对于集合A,一般用S(A)表示其骨架,可以使用腐蚀和开启操作来实现骨架的抽取,如下:

S ( A ) = ∪ k = 0 K S k ( A ) 其中 , S k ( A ) = ( A ㊀ k B ) − [ ( A ㊀ k B ) ] ∘ B , S k ( A ) 为骨架子集, B 是一个结构元素,而 ( A ㊀ k B ) 表示对 A 的连续 k 次腐蚀。 ( A ㊀ k B ) = ( ( . . . ( A ㊀ B ) ㊀ B ) ㊀ . . . ) ㊀ B ) , K 是 A 被腐蚀为空集前的最后一次迭代步骤,即: K = m a x { k ∣ ( A ㊀ k B ) ≠ ∅ } S(A)=\cup_{k=0}^KS_k(A)\\ 其中,S_k(A)=(A㊀kB)-[(A㊀kB)]\circ B,S_k(A)为骨架子集,\\ B是一个结构元素,而(A㊀kB)表示对A的连续k次腐蚀。\\ (A㊀kB)=((...(A㊀B)㊀B)㊀...)㊀B),\\ K是A被腐蚀为空集前的最后一次迭代步骤,即: K=max\{k|(A㊀kB)\neq \emptyset\} S(A)=k=0KSk(A)其中,Sk(A)=(AkB)[(AkB)]BSk(A)为骨架子集,B是一个结构元素,而(AkB)表示对A的连续k次腐蚀。(AkB)=((...(AB)B)㊀...)B),KA被腐蚀为空集前的最后一次迭代步骤,即:K=max{k(AkB)=}

骨架要求最大限度的细化、连通,且受到的腐蚀最小 \color{red}{骨架要求最大限度的细化、连通,且受到的腐蚀最小} 骨架要求最大限度的细化、连通,且受到的腐蚀最小

请添加图片描述

A=imread('图片路径');
subplot(1,2,1);
imshow(A);
title('(a) 骨头的二值图像A','FontSize',15); 
subplot(1,2,2);
bwmorph(A,'skel',Inf);
title('(b) 原图的骨架图像','FontSize',15); 

请添加图片描述

连通分量的提取

  • 从二值图像中提取连通分量(连通组元)是许多自动图像分析应用的核心

  • 令A表示包含一个或多个连通分量的集合

  • X_0表示一个与包含A的相同大小的阵列,其初始状态如下:

    • 包含每个连通分量中的一个指定位置处的前景像素点
    • 除了上述的前景像素点之外,其余元素均为背景像素点
  • 在给定A和X_0的前提下,提取图像中所有由前景像素所构成的连通分量的过程如下:

    • X k = ( X k − 1 ⨁ B ) ∩ A , k = 1 , 2 , 3 , . . . X_k=(X_{k-1}\bigoplus B)\cap A ,k=1,2,3,... Xk=(Xk1B)A,k=1,2,3,...

    • 其中B是对称结构元素
      [ 1 1 1 1 1 1 1 1 1 ] \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\1 & 1 & 1 \end{bmatrix} 111111111

  • 在算法执行过程中,如果 X k = X k − 1 ,则算法在迭代的第 k 步结束 在算法执行过程中,如果X_k=X_{k-1},则算法在迭代的第k步结束 在算法执行过程中,如果Xk=Xk1,则算法在迭代的第k步结束

  • 集合 X k 包含原始图像中的所有连通分量 集合X_k包含原始图像中的所有连通分量 集合Xk包含原始图像中的所有连通分量

请添加图片描述
请添加图片描述
请添加图片描述请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

请添加图片描述

连通分量提取实例(使用连通分量检测包装食品中的外来物)

  • 步骤1,将碎骨从背景中提取出来:对(a)图进行阈值化处理,得到如图(b)所示二值图像,在该图像中保留下来的点聚集为目标〈骨头),而不是彼此孤立的毫无关系的点

  • 步骤2,消除细节,保留大尺寸目标:使用元素为1(白色)大小为5×5的结构元素对(b)图进行腐蚀,得到图©所示的结果图像,在该图像中仅保留了“有效”尺寸的大目标

  • 步骤3,提取连通分量,识别大尺寸目标:使用公式
    X k = ( X k − 1 ⨁ B ) ∩ A X_k=(X_{k-1}\bigoplus B)\cap A Xk=(Xk1B)A
    提取©图中的各个连通分量,从中识别对应大尺寸目标的连通分量,如图(d)所示,共有15个连通分量,其中4个尺寸较大(足以确定包含在原图像中的大尺寸目标)

;