我有一个由多个“角度”组成的图像,这些“角度”形成一个网格形状:
经过一番搜索,霍夫似乎很合适,因为它不受换行符的困扰。但是,我遇到的问题是我的线条很“胖”,并且我运行的任何边缘检测(在这种情况下为 Canny)都会挑选线条的边缘,而不是中间:
这意味着霍夫变换最终会挑选出我的网格线的一个(或两个)“边”,而不是中间。
鉴于我知道我在寻找什么(这种网格状的形状,总是在大致相同的方向),有没有更好的方法来执行“边缘检测”部分给我中心线,或者我应该寻找采用完全不同的方法?
我有一个由多个“角度”组成的图像,这些“角度”形成一个网格形状:
经过一番搜索,霍夫似乎很合适,因为它不受换行符的困扰。但是,我遇到的问题是我的线条很“胖”,并且我运行的任何边缘检测(在这种情况下为 Canny)都会挑选线条的边缘,而不是中间:
这意味着霍夫变换最终会挑选出我的网格线的一个(或两个)“边”,而不是中间。
鉴于我知道我在寻找什么(这种网格状的形状,总是在大致相同的方向),有没有更好的方法来执行“边缘检测”部分给我中心线,或者我应该寻找采用完全不同的方法?
Hough 变换的替代方案是 Radon 变换 ( 1 , 2 )。检测网格状结构的算法的粗略描述可能如下所示:
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)
plot(max(R)) % the two maxima are at 65 & 117 degrees
plot(R(:, 65))
plot(R(:,117))
从评论中回答您的问题:从您提供的一个示例图像中,在我看来,这种方法对于检测到的网格中的小缺陷更加稳健。骨架很少会产生直线,这可能对随后的霍夫变换不利。
在这种情况下,霍夫变换确实有助于拾取网格。要“细化”线条,您可能需要考虑Skeletonization的操作
这将产生一个像这样的图像:
由于骨架化的工作方式,它仍然会产生一些看起来与网格无关的线,但是这些朝向“错误”方向的线并不多(至少在给定的图像中)以混淆霍夫变换的线检测太多了,它会清楚地选择不同方向的两组主要线。(这是 HT 输出的样子:)
如果您使用的是 MATLAB,您可能需要查看此帮助页面