我对图像进行了边缘检测(使用Python2-7和OpenCV 3.2),其结果类似于以下图片,即不一定封闭的一个像素宽的边缘(可以有“松散的末端”),并且可能存在漏洞:

现在我想得到这些边的“导数”,意思是每一点的“斜率”,如下所示:

就目前而言,我唯一能做到的就是在当地。对于边缘的每个点(在下一个“放大”图片中是红色的),我在它周围创建一个圆(粉红色),用边遮住这个圆,得到红色点的邻域,然后计算这两个邻居的斜率。

然而,如果边有洞(通常是这样)或接近其他边(通常是这样),并且掩盖所有的点在计算上是相当密集的,那么它可能会很混乱,所以我想知道是否有更好的方法。
我的第一个想法是样条插值,但是你需要给出一个有序的点列表,除非你使用像素邻域跟踪算法,否则如果没有好的边缘,它也会变得很混乱。
我也想到了findContours,但它需要封闭的边缘,否则它会产生一个像素宽的边缘的轮廓,也就是边缘两侧的两条线,开始于边缘的任意位置,简而言之,就是一团糟。
是否有比我的实际方法更清洁、更有效的方法来实现我想要的?OpenCV是否有任何资源,或者它的工作是在边缘检测之后完成的(我认为后者更有可能!)
P.S.:“我不认为有更好的方法”是我准备接受的答案!
发布于 2017-01-17 16:55:44
所以,如果我正确理解了每件事,你需要的是一个有序的列表,列出你的分数,没有洞,因为在那之后,你似乎知道如何继续取得你的结果。因此,您应该集中精力获得一个有序的无堵塞列表..
FindContours确实输出了一个有序列表,但可能不是按照您需要的顺序。它以自上而下/左-右的优先级对连接的像素进行分组。因此,它按顺序滑动每一行,当它碰到一个白色像素时,就会找到第一个轮廓线。所以,在你的图像中,它找到的第一个轮廓实际上是右边的,因为它的值最接近0Y值。
对于这个特定的图像,,如果你把它旋转90度,你会意识到它实际上会按照你需要的方式排列你的轮廓和点。但情况会一直如此吗?只有你能看出来。如果有一个预处理方法应用于您的图像,这将保证findContours将您的像素以正确的方式排序,其余的将是容易的。如果没有,我建议您创建自己的像素连接算法,该算法将根据您的需要工作,因为您的所有问题都取决于获得一个有序列表。
得到有序列表后,只需插入丢失的像素。。。
如果您有一组有序的像素,“关闭空白”很容易,因为您只需要找到空白,并将它们之间的插值作为一个近似,可能不会损害您的算法。
https://stackoverflow.com/questions/41695316
复制相似问题