OpenCV  4.10.0
开源计算机视觉
加载...
搜索...
无匹配项
腐蚀和膨胀

上一个教程: 图像平滑
下一个教程: 更多形态学变换

原作者Ana Huamán
兼容性OpenCV >=3.0

目标

在本教程中,你将学习如何

  • 应用两种非常常见的形态学运算符:腐蚀和膨胀。为此,你将使用以下 OpenCV 函数
注意
以下说明属于 Bradski 和 Kaehler 合著的《OpenCV 学习指南》一书。

形态学操作

  • 简而言之:根据形状处理图像的一系列操作。形态学操作将结构元素应用于输入图像并生成输出图像。
  • 最基本的形态学操作是:腐蚀和膨胀。它们有着广泛的应用,例如:
    • 除去噪点
    • 分离图像中的单个元素,并连接各个元素。
    • 查找图像中的强度凸起或孔洞
  • 我们将通过以下图像作为示例,简要解释膨胀和腐蚀

膨胀

  • 此运算包括使用某种内核(\(B\))对图像 \(A\) 进行卷积,该内核可以具有任意形状或大小,通常是正方形或圆形。
  • 内核 \(B\) 有一个确定的锚点,通常是内核的中心。
  • 随着内核 \(B\) 在图像上进行扫描,我们计算由 \(B\) 重叠的最大像素值,并将锚点位置处的图像像素替换为该最大值。如你所知,这个最大化操作导致图像内明亮区域“增长”(因此得名膨胀)。
  • 膨胀操作为:\(\texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\)
  • 以上述图像为例。应用膨胀后,我们可以得到
  • 字母的明亮区域在背景的黑色区域周围膨胀。

腐蚀

  • 此操作是膨胀的姊妹操作。它通过给定内核的区域计算一个局部最小值。
  • 随着内核 \(B\) 在图像上进行扫描,我们计算被 \(B\) 覆盖的最小像素值,并用该最小值替换锚点下的图像像素。
  • 腐蚀操作为:\(\texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')\)
  • 类似于膨胀的示例,我们可以将腐蚀算子应用于原始图像(上面已显示)。您可以在下面的结果中看到,图像的亮区变薄,而暗区变大。

代码

解释

注意
此外,还有其他参数允许您一次执行多个腐蚀/膨胀(迭代),还可以设置边界类型和值。但是,我们在本简单教程中没有用到这些参数。您可以查看参考了解详情。

结果

编译上述代码并使用图像作为参数执行代码(如果使用 python 则运行脚本)。如果不提供图像作为参数,则将使用默认示例图像 (LinuxLogo.jpg)。

例如,使用此图像

将获得以下结果。自然地,在轨道中改变索引值会产生不同的输出图像。不妨试一试!您甚至还可以尝试添加第三个轨道来控制迭代次数。

(取决于编程语言,输出可能略有不同,或者只有一个窗口)