2012-11-06 153 views
4

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

谢谢!

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

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

更新:我现在已经使用了一些形态学操作上Sobelgradients并添加周围的轮廓(见下图)。下一步可能是找到相邻的一对红色轮廓,但看起来非常像浪费游戏时间,实际上不得不搜索直接相邻的轮廓。任何更好的想法?

enter image description here

更新2:我现在的解决办法是寻找仿型梯度(红色)轮廓围绕我(紫色)的轮廓边界框,并挑选一个正确方向&大小。这适用于梯形轮廓,其中形态操作关闭如图3所示的“上升”和“下降”梯度区域。但对于上图中点亮区域更宽的情况,这仍然是一个不好的解决方案。任何想法仍然非常感谢,谢谢!

+0

请提供样本图片! –

+0

好的,在我的问题中添加了一些图片和说明。 – moatilliatta

回答

3

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

  1. 制作一个拷贝,和阈值,它为暗部
  2. 使对于光部
  3. 另一个副本和阈值,它合并两个阈值化图像转换成一个新的图像
  4. 应用一个形态运算状开口或关闭(取决于您的阈值)这将连接附近的组件
  5. 在结果图像中查找轮廓
  6. 在原始图像上使用这些轮廓。这将起作用,因为所有图像都是相同的大小,并且都基于原始图像。
+0

感谢您的回答。是的,原帖中提到的方法并不是非常有用,因为它无法处理大型光照区域。你的方法大致是我最后提出的,它工作得很好。但我的方法是找到黑暗的部分,然后围绕它投入感兴趣区域,并在光照部分图像中搜索最合适的合作伙伴,然后合并它们。如果我在黑暗部分附近有几个浅色部分,你的方法可能会失败。 – moatilliatta

+0

不过,我会接受你的答案,因为两次限制图像的方法导致我的最终解决方案... – moatilliatta

+0

啊,我明白你的意思了。我没有意识到,你可能有多个轻的部分候选人,你需要选择最好的部分。很高兴我可以提供帮助。 –