在OpenCv中扩展轮廓

4
我有几个轮廓,由图像中的黑色区域组成。与这些黑色区域直接相邻的是一些明亮区域,它们不属于我的轮廓。我想将这些较亮的区域添加到我的黑色区域中,并因此在OpenCv中扩展我的轮廓。
是否有一种方便的方法来扩展轮廓?我考虑查看由cv::Sobel创建的梯度图像的强度变化,并进行扩展,直到梯度再次改变,即像素的强度回到图像的非黑色或明亮区域。

谢谢!

以下是示例图像。第一张图片显示原始图像,第二张图片使用Canny & findContours提取轮廓,最后一张图片是同一区域的Sobel-Gradient强度图像。 我想将第一张图像中明亮的边界包含到轮廓中。

enter image description here enter image description here enter image description here

更新:现在我已经对Sobel梯度进行了一些形态学操作,并在它们周围添加了一个轮廓(见下面的图像)。下一步可能是找到紫色和红色轮廓的相邻对,但实际上搜索直接相邻的轮廓似乎非常浪费处理时间。有更好的想法吗?

enter image description here

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


请提供一个示例图像! - Abid Rahman K
好的,我在我的问题中添加了一些图片和澄清。 - moatilliatta
1个回答

3
你要做的是找到两个不同的特征并将它们合并。虽然不是非常困难,但你必须使用多份图像才能完成。
以下是步骤:
  1. 制作一份副本,并将其阈值设为较暗部分
  2. 再制作另一份副本,并将其阈值设为较亮部分
  3. 将两个阈值图像合并为一个新图像
  4. 应用形态学操作(如开运算或闭运算,具体取决于阈值设置),以连接附近组件
  5. 在结果图像中查找轮廓
  6. 将这些轮廓应用于原始图像。这将有效,因为所有图像都是相同大小且基于原始图像。

谢谢你的回答。是的,原帖中提到的方法并不是很有用,因为它不能处理大的明亮区域。你的方法与我的最终想法大致相同,而且也能正常工作。但我的方法是先找到暗部分,然后在其周围放置ROI,在明亮部分图像中搜索最适合的伴侣,然后合并它们。如果我在一个暗部分周围有几个明亮区域,你的方法可能会失败。 - moatilliatta
尽管如此,我会接受你的答案,因为对图像进行两次阈值处理的方法导致了我的最终解决方案... - moatilliatta
啊,我明白你的意思了。我没有意识到你可能有多个光部分候选项需要选择最好的一个。很高兴能帮上忙。 - Mike Sandford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接