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



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



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



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

评论

对于上下文,此栅格将与名义栅格进行比较以执行Tsai摄像机校准。

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

#1 楼

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

,这样会产生如下图像:


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


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

评论


$ \ begingroup $
谢谢!这很有帮助。还没有获得我的MATLAB许可证,但是我使用AForge的SimpleSkeletonization进行了试用,它的效果更好...虽然还不完美。稍后,当我获得一些实际数据对其进行测试时,我将再次讨论该主题。
$ \ endgroup $
– Benjol
2012年5月21日14:03

$ \ begingroup $
您可能想先尝试以某种阈值对原始图像进行阈值处理,该阈值似乎会产生“最佳”的粗网格线。我的意思是说,他们至少是相互联系的。这样可以提高构图的性能,但是您需要确定一个额外的参数(阈值)。也许还值得研究如何改善图像采集。
$ \ endgroup $
– A_A
2012年5月21日下午14:11

$ \ begingroup $
是的,就像我说的那样,当我有真实的数据可以使用时,我将有时间微调系统。总的来说,我对霍夫的主要疑问是,θ的离散化将与我们所需的亚像素精度背道而驰。 (那,我并不完全相信镜头像差并不表示线条可以弯曲,不能直线...)
$ \ endgroup $
– Benjol
2012年5月22日下午5:57

#2 楼

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))




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

评论


$ \ begingroup $
谢谢,您能用几句话告诉我,与霍夫变换相比,您希望Radon变换给我带来什么好处吗?
$ \ endgroup $
– Benjol
2012年5月25日下午5:34

$ \ begingroup $
@benjol,我更新了答案。
$ \ endgroup $
–bjoernz
2012年5月25日在7:02

$ \ begingroup $
非常好,非常感谢。一旦IT给我访问Matlab的权限,我将尝试一下!
$ \ endgroup $
– Benjol
2012年5月25日晚上7:29

$ \ begingroup $
@Benjol:请参阅Hough变换和Radon变换之间有什么区别?
$ \ endgroup $
– Endolith
2012年10月5日17:42