【问题标题】:Extending a contour in OpenCv在 OpenCv 中扩展轮廓
【发布时间】:2012-10-26 06:06:09
【问题描述】:

我的图像中有几个由多个黑色区域组成的轮廓。与这些黑色区域直接相邻的是一些不属于我的轮廓的较亮区域。我想将这些较亮的区域添加到我的黑色区域,从而在 OpenCv 中扩展我的轮廓。
有没有一种方便的方法来扩展轮廓?我考虑查看使用cv::Sobel 创建的渐变图像的强度变化,并一直延伸到渐变再次发生变化,这意味着像素的强度将回到图像的既不是黑色区域也不是明亮区域。

谢谢!

这里是示例图片。第一张图片是原始图像,第二张是使用 Canny 和 findContours 提取的 Contour,最后一张是同一区域的 Sobel-Gradient 强度图像。 我想在轮廓的第一张图像中包含明亮的边界。

更新:现在我在 Sobelgradients 上使用了一些形态学运算,并在它们周围添加了一个轮廓(见下图)。下一步可能是找到相邻的一对紫色和红色轮廓,但实际上必须搜索直接相邻的轮廓似乎非常浪费时间。有更好的想法吗?

更新 2:我现在的解决方案是在我的(紫色)轮廓周围的边界框中搜索变形渐变(红色)轮廓,然后选择具有正确方向和大小的轮廓。这适用于梯度轮廓,其中形态学操作关闭了“上升”和“下降”梯度区域,如图 3 所示。但对于照明区域比上图中更宽的情况,它仍然是一个糟糕的解决方案。任何想法仍然非常感谢,谢谢!

【问题讨论】:

  • 请提供示例图片!!!
  • 好的,添加一些图片和澄清我的问题。

标签: c++ image-processing opencv


【解决方案1】:

您要做的是找到两个不同的功能并将它们合并。这并不难,但您必须使用图像的多个副本才能实现。

  1. 制作一份副本,并将其作为深色部分的阈值
  2. 制作另一个副本并为浅色部分设置阈值
  3. 将两个阈值图像合并为一个新图像
  4. 应用形态学操作,如打开或关闭(取决于您的阈值)这将连接附近的组件
  5. 在结果图像中查找轮廓
  6. 在原始图像上使用这些轮廓。这将起作用,因为所有图像的大小都相同,并且都基于原始图像。

【讨论】:

  • 感谢您的回答。是的,原帖中提到的方法不是很有用,因为它不能处理大的光区域。你的方法大致就是我最后想出的方法,效果很好。但我的方法是找到暗部分,然后在其周围放置一个 ROI,并在亮部分图像中搜索一个最合适的伙伴,然后将它们合并。如果我在黑暗部分周围有几个明亮的部分,你的方法可能会失败。
  • 不过我会接受你的回答,因为对图像进行两次阈值处理的方法导致了我的最终解决方案......
  • 啊,我明白你的意思了。我没有意识到您可能有多个轻量级候选者,您需要从中挑选出最好的一个。很高兴我能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 2021-09-07
  • 2020-06-14
  • 1970-01-01
相关资源
最近更新 更多