OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
使用形态学操作提取水平和垂直线

上一个教程: 击中或击不中变换
下一个教程: 图像金字塔

原始作者Theodore Tsesmelis
兼容性OpenCV >= 3.0

目标

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

  • 应用两种非常常见的形态学运算符(即膨胀和腐蚀),并创建自定义核,以提取水平和垂直轴上的直线。为此,您将使用以下OpenCV函数

    • erode()
    • dilate()
    • getStructuringElement()

    在一个示例中,您的目标是从乐谱中提取音符。

理论

形态学操作

形态学是一组图像处理操作,它基于预定义的结构元素(也称为核)处理图像。输出图像中每个像素的值是基于输入图像中相应像素与其邻域的比较。通过选择核的大小和形状,您可以构建对输入图像中特定形状敏感的形态学操作。

最基本的两种形态学操作是膨胀和腐蚀。膨胀在图像中对象的边界上添加像素,而腐蚀则恰好相反。添加或移除的像素数量分别取决于用于处理图像的结构元素的大小和形状。通常,这两种操作遵循的规则如下:

  • 膨胀:输出像素的值是落入结构元素大小和形状范围内的所有像素的最大值。例如,在二值图像中,如果落入核范围内的任何输入图像像素被设置为值1,则输出图像的相应像素也将被设置为1。后者适用于任何类型的图像(例如灰度、BGR等)。
二值图像上的膨胀
灰度图像上的膨胀
  • 腐蚀:腐蚀操作则相反。输出像素的值是落入结构元素大小和形状范围内的所有像素的最小值。请看下面的示例图:
二值图像上的腐蚀
灰度图像上的腐蚀

结构元素

如上所示,通常在任何形态学操作中,用于探测输入图像的结构元素是最重要的部分。

结构元素是一个只包含0和1的矩阵,它可以是任意形状和大小。通常它比被处理的图像小得多,而值为1的像素定义了邻域。结构元素的中心像素,称为原点,标识了目标像素——即正在处理的像素。

例如,下图展示了一个7x7大小的菱形结构元素。

一个菱形结构元素及其原点

结构元素可以有许多常见的形状和大小,例如线形、菱形、圆盘形、周期线形和圆形。您通常会选择与输入图像中要处理/提取的对象具有相同大小和形状的结构元素。例如,要在图像中查找线条,可以创建一个线性结构元素,稍后您将看到。

代码

本教程的代码如下所示。

解释 / 结果

此处获取图像。

加载图像

灰度化

灰度到二值图像

输出图像

现在我们准备应用形态学操作,以提取水平和垂直线,从而将音符从乐谱中分离出来,但首先让我们初始化为此目的将使用的输出图像。

结构元素

正如我们在理论部分所阐述的,为了提取我们想要的对象,我们需要创建相应的结构元素。由于我们要提取水平线,为此目的的相应结构元素将具有以下形状:

在源代码中,这由以下代码片段表示:

对于垂直线,同样适用,其相应的结构元素为:

同样,这表示如下:

边缘细化 / 结果

如您所见,我们已经接近目标了。然而,此时您会注意到音符的边缘有些粗糙。因此,我们需要对边缘进行细化以获得更平滑的结果。