Hough变换的替代方法,用于检测网格状结构


16

我有一个图像,该图像由形成网格形状的多个“角度”组成:

在此处输入图片说明

经过一番搜索后,霍夫似乎很合适,因为它不受换行的困扰。但是,我的问题是我的线条是'fat',并且我运行的任何边缘检测(在这种情况下为Canny)都选择了线条的边缘,而不是中间的边缘:

在此处输入图片说明

这意味着霍夫变换最终会选择网格线“边”中的一个(或两个),而不是中间。

在此处输入图片说明

鉴于我知道我要寻找的东西(这种网格形状,始终处于大致相同的方向),是否有更好的方法来执行“边缘检测”部分以给我中心线,还是应该寻找用完全不同的方法?


对于上下文,此网格将与标称网格进行比较以执行Tsai摄像机校准。
Benjol 2012年

“我运行的边缘检测,拾取线的边缘”是的,因为边缘检测会将边缘转换为山脊,并且您的图像已经是山脊。边缘是明暗之间的边界。
endlith 2012年

Answers:


10

在这种情况下,霍夫变换确实有助于拾起网格。要“细化”线条,您可能需要考虑骨架化的操作

那将产生这样的图像: 骨骼化输出

由于骨架化的工作方式,它仍然会产生一些与网格无关的线,但是这些朝向“错误”方向的线并不太多(至少在给定的图像中),这会混淆霍夫变换的线检测太多,它将清楚地沿不同方向选择两条主要线。(以下是HT输出的样子:) 在此处输入图片说明

如果您使用的是MATLAB,则可能需要查看此帮助页面


谢谢!这很有帮助。还没有获得我的MATLAB许可证,但是我使用AForge的SimpleSkeletonization进行了尝试,它的效果更好...虽然还不完美。稍后我将获得一些实际数据对其进行测试时,将重新讨论该主题。
Benjol 2012年

您可能想先尝试以某种阈值对原始图像进行阈值处理,该阈值似乎会产生“最佳”的胖网格线。我的意思是说,他们至少是相互联系的。这可以提高骨架化的性能,但是您将需要一个额外的参数来确定(阈值)。也许还值得研究如何改善图像采集。
2012年

是的,正如我说过的,当我有真实的数据要玩时,值得花时间调整系统。总的来说,我对霍夫的主要疑问是,θ的离散化将与我们所需的亚像素精度背道而驰。(那是我的观点,我并不完全相信镜头像差并不意味着线条可以弯曲,不能直线...)
Benjol 2012年

11

到霍夫备选变换将是Radon变换(12)。对检测网格状结构的算法的粗略描述如下所示:

1. Perform Radon Transform from 0 to 180 degrees.
2. Find the two highest maxima in the angle bins.
3. For the two angles with maximal amplitude find the local maxima within the bin.
4. You can use the constraint that the maxima should have even spacing to deal with outliers.

编辑

这是一个小的Matlab代码段,用于说明步骤1-3:

im = imread('grid.png');
[R, xp] = radon(im, 0:180);
imagesc(0:180, xp, R)

Radon转换的结果

plot(max(R)) % the two maxima are at 65 & 117 degrees

所有角度的千里马

plot(R(:, 65))

最大值为65度

plot(R(:,117))

最大值117度

从评论中回答您的问题:在您提供的一个示例图像中,对我来说,这种方法对于检测到的网格中的小缺陷更健壮。骨骼很少会产生直线,这可能对随后的霍夫变换不利。


谢谢,您能否用几句话告诉我,与霍夫变换相比,您希望Radon变换给我带来什么好处?
Benjol 2012年

@benjol,我更新了答案。
2012年

非常好,非常感谢。一旦IT给我访问Matlab的机会,我将尝试一下!
Benjol

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.