实施脊检测

Jes*_*der 7 math image-processing edge-detection

我正在尝试编写脊检测算法,我发现的所有信号源似乎都将边缘检测与脊检测混为一谈.现在,我已经实现了Canny边缘检测算法,但它不是我想要的:例如,在图像中给定一条线,它将有效地将其转换为双线边缘(因为它将记录两边的边缘)这条线) - 我只想让它读一行.

关于山脊检测的维基百科文章有一堆数学,但这种情况对我作为一个程序员没有帮助(不是我不喜欢数学,但它不是我的领域,我不明白如何翻译他们的微分方程代码).实际实现这个有一个很好的来源吗?或者,就此而言,是否有一个良好的开源实现?

编辑:这是一个简单的例子.我们从一个简单的行开始:

http://img24.imageshack.us/img24/8112/linez.th.png

并运行Canny算法来获得:

http://img12.imageshack.us/img12/1317/canny.th.png

(你可以看到它在这里更厚 - 如果你点击图像,你会发现它实际上是两条相邻的线,中间有一个空白)

另外,我用C++编写,但这并不重要.但我想编写算法代码,而不仅仅是编写SomePackage::findRidges()并完成它.

Ian*_*son 5

也许您需要考虑清理已有的线,而不是类似Canny的边缘检测.感觉你应该能够对图像形态做一些事情,特别是我正在考虑骨架化和最终侵蚀点类型操作.如果使用得当,这些应该从您的图像中删除任何非"线条"的功能 - 我相信它们是在英特尔的OpenCV库中实现的.

您可以使用Canny过滤器使用一个扩张操作生成的双线恢复单行,然后进行3次侵蚀(我在ImageJ中尝试过) - 这也应该删除任何边缘.