OpenCV 4.13.0
开源计算机视觉库 (Open Source Computer Vision)
正在加载...
正在搜索...
未找到匹配项
使用距离变换和分水岭算法进行图像分割

上一篇教程: 点多边形测试 (Point Polygon Test)
下一篇教程: 失焦去模糊滤波器 (Out-of-focus Deblur Filter)

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

目标

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

  • 使用 OpenCV 函数 cv::filter2D 执行拉普拉斯滤波以进行图像锐化
  • 使用 OpenCV 函数 cv::distanceTransform 获取二值图像的派生表示,其中每个像素的值被替换为其到最近背景像素的距离
  • 使用 OpenCV 函数 cv::watershed 将图像中的对象从背景中隔离出来

原理

代码

说明 / 结果

  • 加载源图像,检查其是否加载无误,然后显示它
  • 然后,如果我们有一张白色背景的图像,最好将其转换为黑色。这将在我们应用距离变换时,帮助我们更容易地辨别前景对象
  • 随后,我们将锐化图像,以使前景对象的边缘更加尖锐。我们将应用一个相当强的拉普拉斯滤波器(二阶导数的近似)

  • 现在我们将新的锐化后的源图像分别转换为灰度图和二值图
  • 现在我们准备在二值图像上应用距离变换。此外,我们对输出图像进行归一化,以便能够可视化并对结果进行阈值处理
  • 我们对 dist 图像进行阈值处理,然后执行一些形态学操作(即膨胀),以便从上述图像中提取峰值
  • 然后,我们借助 cv::findContours 函数从每个连通区域(blob)中为分水岭算法创建一个种子/标记
  • 最后,我们可以应用分水岭算法,并可视化结果