OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
图像腐蚀和膨胀

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

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

目标

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

  • 应用两个非常常见的形态学运算符:腐蚀和膨胀。为此,您将使用以下 OpenCV 函数
注意
下面的解释摘自 Bradski 和 Kaehler 的书 Learning OpenCV

形态学操作

  • 简而言之:一组基于形状处理图像的操作。形态学操作将一个结构元素应用于输入图像并生成输出图像。
  • 最基本的形态学操作是:腐蚀和膨胀。它们有广泛的用途,例如:
    • 去除噪声
    • 图像中单个元素的隔离和不同元素的连接。
    • 查找图像中的强度凸起或空洞
  • 我们将简要解释膨胀和腐蚀,以下图为例

膨胀

  • 此操作包括将图像 \(A\) 与某个内核 ( \(B\)) 进行卷积,该内核可以具有任何形状或大小,通常是正方形或圆形。
  • 内核 \(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)。

例如,使用此图像

我们得到以下结果。改变跟踪条中的索引自然会产生不同的输出图像。尝试一下!您甚至可以尝试添加第三个跟踪条来控制迭代次数。

(根据编程语言,输出可能略有不同或只有 1 个窗口)