OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
使用形态学运算提取水平和垂直线

上一教程: 击中或错过
下一教程: 图像金字塔

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

目标

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

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

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

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

理论

形态学运算

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

两个最基本的形态学操作是膨胀和腐蚀。膨胀向图像中对象的边界添加像素,而腐蚀则正好相反。添加或去除的像素数量分别取决于用于处理图像的结构元素的大小和形状。一般来说,这两个操作遵循以下规则:

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

结构元素

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

结构元素是一个仅由 0 和 1 组成的矩阵,它可以具有任何任意形状和大小。通常比被处理的图像小得多,而值为 1 的像素定义了邻域。结构元素的中心像素,称为原点,标识感兴趣的像素——正在处理的像素。

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

菱形结构元素及其原点

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

代码

本教程代码如下所示。

解释/结果

这里获取图像。

加载图像

灰度化

灰度图转二值图像

输出图像

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

结构元素

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

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

垂直线也适用相同的原理,其对应的结构元素为:

同样,它表示如下:

精细化边缘/结果

如你所见,我们快完成了。但是,你会注意到此时音符的边缘有点粗糙。因此,我们需要细化边缘以获得更平滑的结果。