OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配项
使用形态学运算提取水平线和垂直线

前一个教程: 撞击或遗漏
下一个教程: 图像金字塔

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

目标

本教程,您将了解如何

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

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

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

理论

形态学运算

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

两种最基本的形态学运算为膨胀和腐蚀。膨胀在图像中对象的边界添加像素,而腐蚀则正好相反。添加或删除像素的数量分别取决于用于处理图像的结构元素的大小和形状。一般而言,这两种运算遵循的规则如下

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

形态元素

如上文以及一般形态学操作中所见,用来探测输入图像的形态元素是最重要的部分。

形态元素是一个矩阵,仅包含 0 和 1,它可以采用任意形状和大小。通常,它远小于要处理的图像,而值为 1 的像素定义邻域。形态元素的中心像素(称为原点)标识目标像素(即要处理的像素)。

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

菱形形态元素及其原点

形态元素可采用许多常见形状,例如直线、菱形、圆盘、周期线和圆。通常,你会选择与输入图像中要处理/提取的对象尺寸大小相同的形态元素。例如,若要查找图像中的线,则可以创建一个线性形态元素,如后面将看到的那样。

代码

此教程的代码显示在以下几行中。

解释 / 结果

此处 获取图像。

加载图像

灰度化

将灰度图像转换成二值图像

输出图像

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

结构元素

正如我们在理论部分中指定的那样,为了提取我们想要的物体,我们需要创建相应的结构元素。由于我们要提取水平线,所以用于此目的的相应结构元素将具有以下形状:

在源代码中,这是通过以下代码段表示的

垂直线也是如此,其相应的结构元素为:

同样,这表示为

优化边缘/结果

如您所见,我们几乎成功了。然而,此时您会注意到钞票边缘有点粗糙。因此我们需要优化边缘以获得更平滑的结果