【发布时间】:2017-06-01 09:48:39
【问题描述】:
我对图像进行了边缘检测(使用 Python 2-7 和 OpenCV 3.2),结果如下图所示,即一个像素宽的边缘不一定是闭合的(可能有“松散的末端”),并且可能有孔:
现在我想得到这些边的“导数”,即每个点的“斜率”,如下图所示:
目前,我设法做到这一点的唯一方法是非常本地化。对于边缘的每个点(下一张“放大”图片中的红色),我在它周围创建一个圆圈(粉红色),用边缘掩盖圆圈以获得红色点的邻居,然后计算这两个邻居的斜率。
但是,如果边缘有孔(它们经常这样做)或靠近其他边缘(它们经常存在)并且屏蔽所有点的计算量很大,那么它可能会非常混乱,所以我想知道是否有更好的方式。
我的第一个想法是样条插值,但您需要提供一个 有序 点列表作为输入,除非您使用可以如果边缘不太好,也会变得非常混乱。
我也想到了 findContours 但它需要封闭的边缘,否则它会产生一个像素宽的边缘的轮廓,即边缘两侧的两条线,从边缘的任意位置开始,简而言之就是一团糟。
有没有比我的实际方法更清洁、更有效的方法来实现我想要的? OpenCV 是否有任何资源,或者它的工作是在边缘检测之后完成的(我认为后者更有可能!)?
附: :“我认为没有更好的方法”是我准备接受的答案!
【问题讨论】:
-
最简单的方法是将您的对象表示为轮廓,但正如您所说,您的对象可能有孔并且可能很难将其表示为“连接”轮廓。
-
感谢您的回复。即使没有孔,我的对象也不一定是封闭的,它们大多是松散的边缘。因此 findContours() 没有帮助。我编辑了我的问题以考虑到这一点。
-
您仍然可以通过“轮廓”(沿曲线的点位置的有序列表)来表示您的曲线段,但您必须以不同的方式计算它们(而不是 findContours)。在那之后,计算斜率变得简单,并且可能总体上更有效。但是仍然存在将边缘分组为曲线段的问题......
-
是的,对于这个“将边缘分组为曲线”步骤,除了计算每个像素的相邻像素数量以找到极端,然后迭代地找到以下邻居......一种算法可能计算效率不高,并且当连接有点困难时容易出错
-
这是什么意思? “现在我想获得这些边的“导数”,即每个点的“斜率”,如下图所示”。每个点的斜率?线的每个“段”最多有一个斜率。
标签: python-2.7 opencv edge-detection derivative corner-detection