计算边线斜率的有效方法

时间:2017-01-17 10:57:44

标签: python-2.7 opencv edge-detection derivative corner-detection

我对图像进行了边缘检测(使用Python 2-7和OpenCV 3.2),结果如下图所示,即一个像素宽的边缘不一定是封闭的(可以有#34;松散的末端") ,并有可能的漏洞:

enter image description here

现在我想获得"衍生物"这些边缘,意味着"斜坡"在每个点,如下图所示:

enter image description here

目前,我设法做到的唯一方法就是本地化。对于边缘的每个点(下一个是红色"缩放"图片),我在它周围创建一个圆圈(粉红色),用边缘遮住圆圈以获得红点的邻居,然后计算这两个邻居的斜率。

enter image description here

然而,如果边​​缘有孔(他们经常这样做)或接近其他边缘(它们经常是这样),它可能会非常混乱,并且掩盖所有点都是计算密集型的,所以我想知道是否有更好的方式。

我的第一个想法是样条插值,但你需要给出一个有序点的列表作为输入,除非你使用像素邻居跟踪算法,否则你不能为给定的边缘提供这些点。如果没有那么好的边缘,这也会变得非常混乱 我还想到了findContours,但它需要闭合边缘,否则它会产生一个像素宽边缘的轮廓,即边缘两侧的两条线,从边缘上的任意位置开始,简而言之,一团糟。

是否有比我实际方法更清洁,更有效的方法来达到我想要的效果? OpenCV是否有任何资源或在边缘检测后完成工作(我认为后者更有可能!)?

P.S。 :"我不认为有更好的方法"是我准备接受的答案!

1 个答案:

答案 0 :(得分:0)

所以,如果我理解正确的一切,你需要的是一个没有漏洞的点的有序列表,因为在那之后你似乎知道如何继续获得你的结果。 所以,你应该集中精力获得一个无序的无序列表。

FindContours会输出一个有序列表,但可能不是您需要的顺序。它使用TOP-DOWN / LEFT-RIGHT优先级对连接的像素进行分组。因此,它按顺序滑动每一行,当它击中白色像素时,它会找到第一个轮廓。因此,在您的图像中,它找到的第一个轮廓实际上是右侧的轮廓,因为它最接近0 Y值。

对于此特定图像,如果将其旋转90度,您将意识到它实际上会以您需要的方式对您的轮廓和点进行排序。但这总是如此吗?只有你可以告诉。如果有一个预处理方法应用于您的图像,这将保证findContours将以正确的方式订购您的像素,其余的将很容易。如果没有,我建议您创建自己的像素连接算法,该算法将根据您的需要运行,因为您的所有问题都取决于获取有序列表。

获得有序列表后,只需插入缺少的像素。

如果你有一组有序的像素,那么“缩小间隙”很容易,因为你只需要找到间隙并在它们之间进行插值,作为可能不会伤害算法的近似值。