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

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

原始作者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 个窗口)