首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >边缘线斜率的有效计算方法

边缘线斜率的有效计算方法
EN

Stack Overflow用户
提问于 2017-01-17 10:57:43
回答 1查看 898关注 0票数 3

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

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

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

然而,如果边有洞(通常是这样)或接近其他边(通常是这样),并且掩盖所有的点在计算上是相当密集的,那么它可能会很混乱,所以我想知道是否有更好的方法。

我的第一个想法是样条插值,但是你需要给出一个有序的点列表,除非你使用像素邻域跟踪算法,否则如果没有好的边缘,它也会变得很混乱。

我也想到了findContours,但它需要封闭的边缘,否则它会产生一个像素宽的边缘的轮廓,也就是边缘两侧的两条线,开始于边缘的任意位置,简而言之,就是一团糟。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-17 16:55:44

所以,如果我正确理解了每件事,你需要的是一个有序的列表,列出你的分数,没有洞,因为在那之后,你似乎知道如何继续取得你的结果。因此,您应该集中精力获得一个有序的无堵塞列表..

FindContours确实输出了一个有序列表,但可能不是按照您需要的顺序。它以自上而下/左-右的优先级对连接的像素进行分组。因此,它按顺序滑动每一行,当它碰到一个白色像素时,就会找到第一个轮廓线。所以,在你的图像中,它找到的第一个轮廓实际上是右边的,因为它的值最接近0Y值。

对于这个特定的图像,,如果你把它旋转90度,你会意识到它实际上会按照你需要的方式排列你的轮廓和点。但情况会一直如此吗?只有你能看出来。如果有一个预处理方法应用于您的图像,这将保证findContours将您的像素以正确的方式排序,其余的将是容易的。如果没有,我建议您创建自己的像素连接算法,该算法将根据您的需要工作,因为您的所有问题都取决于获得一个有序列表。

得到有序列表后,只需插入丢失的像素。

如果您有一组有序的像素,“关闭空白”很容易,因为您只需要找到空白,并将它们之间的插值作为一个近似,可能不会损害您的算法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41695316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档