我需要在从相机检索到的图像中找到所有轮廓。因此,我首先使用Canny边缘检测器找到边缘,然后找到轮廓。非常简单。

但是,我的轮廓被“合并”了。例如,在下面的图像中,我显然有4个不同的对象。不过,在某些点上,边缘略有接触,所以我得到了一个大轮廓,而不是四个单独的轮廓。我尝试更改阈值,侵蚀,形态学操作和类似操作,但是边缘保持轻微接触。有没有人对如何在类似于以下图像的图像中获得单独的轮廓有任何建议? (下面的图像显然只是一个例子,我的实际图像要复杂得多,但是具有相同的基本问题)。



评论

分水岭分割可以工作。

因此,您还应该考虑接触是一条线而不仅仅是一个点的情况(接触但不重叠)

#1 楼

检测不同的组件:
如果要检测不同的组件,除了检测轮廓之外,可能还有其他方法可以做到。这是Mathematica中的示例。在检测之前,先进行腐蚀然后再进行扩张以缩小第二个组件中的间隙(如果不这样做,它将无法检测到它)。
img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]

左下图,显示不完美的对象检测(没有缩小间隙),而右边显示正确的检测(运行上面的代码)。

检测不同的轮廓:只想分离轮廓,这是一个例子。像以前一样执行腐蚀和膨胀以缩小间隙,然后将所得图像通过Canny边缘检测器。我已经明确了默认选项,以便您可以看到正在使用的内容。
宽度大于1。由于性能下降,我想让它变薄没有太多运气(对于其他图像可能有所不同)。内部轮廓就是您想要的轮廓,外部轮廓只是所有4个组件的组合轮廓。现在,我们需要做的就是将最外面的一个放到下面:换句话说,它仅拾取那些被至少一个其他轮廓包围的轮廓,这将自动取消最外面的轮廓的资格。我不知道这些命令/操作在openCV中的等效功能。它在我的屏幕上看起来不是这样。

#2 楼

尝试使用形态学滤镜(例如腐蚀)对图像进行预处理。这将使触摸轮廓分离。检测到轮廓后,可以执行膨胀操作以完成晶格。

评论


$ \ begingroup $
我尝试过,但是结果没有改善。
$ \ endgroup $
–法哈德
2011年12月3日在22:12

$ \ begingroup $
您可以显示真实的示例图片吗?
$ \ endgroup $
– fmorency
2011年12月4日,0:07

#3 楼

这不是您问题的答案,但是轮廓分析容易出错。您对此无能为力,它只能在非常简单的情况下使用。

如果您在使用它时遇到麻烦,则应该寻找一种完全不同的算法。有更复杂,更强大的解决方法,但这取决于您要实现的目标(对象检测,跟踪等)。

评论


$ \ begingroup $
谢谢。我的程序用于手部检测,因此我认为它与对象检测非常相似。您对更复杂,更强大的算法有何建议?我无法执行Haar功能,SURF和类似的机器学习算法。
$ \ endgroup $
–法哈德
2011-12-04 20:58

$ \ begingroup $
您是否看过这些资源? paginas.fe.up.pt/~hgc2011它们主要是数据库/结果,但我希望您能够在这里找到一些不错的论文。
$ \ endgroup $
–易变
2011-12-5 8:29

#4 楼

轮廓不一定开放,因为您已经使用canny来检测它们。 Canny的问题已在此处讨论。关于canny的讨论为您提供了基本的思想,即在canny之上仍需要进行诸如闭合和膨胀之类的操作才能评估闭合轮廓。

这还取决于我们要寻找轮廓还是分割(Canny与Graphcuts之类的方法)。因此,我想寻找可靠的解决方案取决于您的最终应用。