数字图像处理——形态学操作(二值图像篇)

内容简介

  本篇博客介绍的形态学图像处理操作。形态学在数学语言里是集合论。在图像处理中,形态学是很重要的分支,但是它又不像傅里叶变换等内容,包含详细的公式推导。通常形态学操作的数学表达都比较抽象,不太容易理解。因此,本篇博客打算以文字与实践相结合的方式进行阐述。
  本篇文章内容中,所有具有处理结果图像的形态学操作均是本人根据教材自己编写的代码,由于代码较多,之后会放在个人github中,如在公布之前有需要的读者,可以留言说明。
  本篇内容主要知识和相关操作图片来自冈萨雷斯第三版的《数字图像处理》,如对细节内容感兴趣的读者可以查阅相关书籍进行参考。本篇博文的内容与原书内容的顺序有所出入,如有不足欢迎留言指正,谢谢。

1. 预备知识——结构元

  其实结构元(SE,Structure Element)最直接的理解就是卷积操作中的卷积核,或者是空间域滤波中提到的滤波器。虽然形态学操作中结构元的形状可以是任意的,但是由于在图像操作中,为了方便计算,通常要求结构元是矩形的阵列,对于任意形状的结构元,如果不满足矩形的要求,则用0将其填充为矩形即可。
  另外,结构元内部的有效元素不像滤波器那样有权值,通常结构元中只分为两种元素,就是0和1,不会出现其他数值的系数。(当然对有些算法来说也有例外)。结构元对图像进行的操作也和卷积非常类似,就是由结构元的中心依次滑过图像,然后进行设计好的操作即可。接下来就开始介绍图像处理中常见的形态学操作。

2. 形态学基本操作

  形态学基本操作是形态学最重要的基础,几乎所有复杂的形态学操作都由基本形态学操作组合而成。在本章节中,主要介绍的是二值图像的形态学操作,因此本章中默认图像都是二值图像,且由0表示背景像素,1表示前景像素。
  下面结合集合论的数学表达以及实际使用案例对各种操作进行介绍。

2.1 腐蚀和膨胀

  1).腐蚀(erode)
A ⊖ B = { z ∣ ( B ) z ⊆ A } ⇔ A ⊖ B = { z ∣ ( B ) z ∩ A c = ∅ } A\ominus B=\{z|(B)_z\subseteq A\} \Leftrightarrow A\ominus B=\{z|(B)_z\cap A^c=\empty\} AB={ z(B)zA}AB={ z(B)zAc=}
  其中, A c A^c Ac是图像A的补集,即1-A。上式表达的意思就是,在z的移动下,如果结构元B能够完全包含在图像A中(完全包含意味着结构元B中的有效元素对应于图像A中的位置全都是前景像素。z的移动就是针对于图像A的所有像素范围的移动。
在这里插入图片描述
  上图中,左边实线围住的9x9方格就是结构元B,红色代表其有效区域,白色代表其无效区域(0填充)。右侧实现代表图像A,浅蓝色部分代表A的前景像素,白色代表背景像素。当结构元滑动到1区域时,所有有效区域对应的像素都是前景像素(紫色区域,红+蓝),因此称此时 B ⊆ A B\subseteq A BA,此时,1号位置在结果图像中应该置1。反之,如果只有部分区域重合,如结构元处于2号位置,那么说明此时的2号点不满足腐蚀条件,应该在结果图像中置0。
  下面是腐蚀操作对实际图像的处理效果。

  • 第一张为原图。
  • 第二张为用11x11的全1模板作结构元进行的腐蚀,可以看到,由于细线的宽度小于11像素,所以细线不可能完全包含SE,因此细线部分被“腐蚀”。
  • 第三张图和第二张一样,只是使用的是opencv自带的cv2.erode函数,可以看到,和自己编写的代码结果优点区别,图像边界的轮廓并不是全黑的,因为我自己写的腐蚀操作是带padding的,也就是会根据SE的尺寸对图像周边填0,而教材中和opencv中的腐蚀函数是不对图像进行填充的,它们直接忽略了会使SE越出图像的像素点,因此那些点的像素值保留不变。
  • 第四张图结构元尺寸为15x15,可以看到,连最粗的线都被腐蚀了。
  • 第五张SE尺寸为45x45,就可以将除了中心方块以外的所有元素腐蚀掉。
    在这里插入图片描述   在这里插入图片描述   在这里插入图片描述  在这里插入图片描述   在这里插入图片描述

  2).膨胀(dilate)
A ⊕ B = { z ∣ ( B ^ ) z ∩ A ≠ ∅ } ⇔ A ⊕ B = { z ∣ [ ( B ^ ) z ∩ A ] ⊆ A } A\oplus B=\{z|(\hat B)_z\cap A\ne\empty\} \Leftrightarrow A\oplus B=\{z|[(\hat B)_z\cap A]\subseteq A\} AB={ z(B^)zA=}AB={ z[(B^)zA]A}
  其中, B ^ \hat B B^称为结构元B的反射,指的是,结构元B绕结构元的中心(通常设置在SE矩阵中心)旋转180°后的新结构元。对于对称的结构元,就有 B = B ^ B=\hat B B=B^
  膨胀的集合含义就是,SE和图像的前景像素至少有一个交点,那么当前移动到的像素就置1,否则置0。在膨胀的条件下,之前图示中的1,2号区域均会被置1。(腐蚀时,2号区域是被置0的)。
  下面是膨胀操作对实际图像的处理效果。

  • 第一张图是原图,可以看到原图中的字母多数都有断裂现象,这里需要着重观察右下角的“year"单词;
  • 第二张图是opencv自带的cv2.dilate函数,用SE尺寸3x3的核得到的结果。可以看到,膨胀后,所有字母都变粗了(膨胀了),大部分断裂的区域都连接上了。但是这和教材中的处理结果略有不同,因为opencv提供的膨胀操作,不支持自定义结构元,其结构元是3x3的全一矩阵。而教材中使用的SE是3x3的四个角为无效元素的十字型结构元。
  • 第三张图是自己编写的dilate函数,结构元也使用和教材中一模一样,因此结果是和教材里一样的。注意观察可以发现,图3相比于图2膨胀程度更高,因此,"year"字母中的"ea"的断裂修复效果也比图2更好。
    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

  3).腐蚀和膨胀的对偶性

  • ( A ⊖ B ) c = A c ⊕ B ^ (A\ominus B)^c=A^c \oplus \hat B (AB)c=AcB^
  • ( A ⊕ B ) c = A c ⊖ B ^ (A\oplus B)^c=A^c \ominus \hat B (AB)c=AcB^

2.2 开操作与闭操作

  开操作和闭操作都是基于腐蚀和膨胀操作的。
  1).开操作(opening)
A ∘ B = ( A ⊖ B ) ⊕ B A\circ B=(A\ominus B)\oplus B A

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值