使用OpenCV(或其他工具)检测网格节点

11

我有一些图片(它们是从相机中获取的)。在二值化之后,它们看起来像这样(红色是255,蓝色是0): grid

如何最好地检测这些图片上的网格节点(交叉点)? 注意:网格从单元格到单元格的失真是不均匀的。

更新:

一些不同网格及其二值化前的变形示例:

enter image description here

enter image description here

enter image description here


1
你尝试过使用hough变换来检测线条吗?(教程1教程2 - Tobias Hermann
1
你能发布非二进制图像吗? - Tobias Hermann
1
好的,对我来说,这些看起来比二值化版本更弯曲。这不是一项容易的任务,因为它们似乎以不同的颜色、分辨率和样式(实线、虚线)出现。甚至扭曲也不仅仅是透视变换,因为纸张弯曲或折叠。你尝试过用canny跟随这些线吗? - Tobias Hermann
1
如果我理解正确的话,您目前在二值化图像上使用哈里斯角检测器,这会给您带来次优的结果。也许使用更好的二值化图像可以得到更好的结果。 - Tobias Hermann
1
我对此一无所知,但是那个链接中提到的方向梯度直方图怎么样? - CinchBlue
显示剩余11条评论
3个回答

2
在这种情况下,我首先尝试找到最佳的起点。因此,首先对您的图像进行二值化处理(但我也可以将其骨架化,然后再进行阈值处理。但是这样会不可恢复地丢失一些数据): Imgur 然后,我尝试了很多工具来突出显示大部分突出的特征。最后,通过使用Gimp的G'MIC插件,我发现了这个: Imgur 基于上述内容,我准备了一个通用模式,看起来像这样: Imgur 然后我只是得到了这个图像的一部分: Imgur 为了帮助确定角度,我制作了局部傅里叶频率图-这样你就可以获得你的模式本地角度: Imgur 然后,您可以使用现代GPU快速执行简单的厚操作-像这样获取差异(错过的情况): Imgur 当有命中时,差异是最小的;我在谈论局部最大值时所考虑的更多或更少是指如何处理结果差异。由于尺度因素的敏感性,将模式圆形外的差异与内部权重相同并不明智。因此,在使用的算法中应更加权重带有十字架的内部。尽管如此,图案与图像的差异看起来像这样: Imgur 正如您所看到的,可以区分命中和未命中。关键是设置适当的容差并使用傅里叶频率来获得角度(对于阈值图像,傅里叶通常遵循分析的整体方向)。 上述方法以后可以通过Harris检测进行补充,或者可以使用上述模式修改Harris检测以区分两个至四个紧密放置的角落。不幸的是,在这种情况下,所有技术都依赖于比例,并且应该正确调整它们。 还有其他解决您问题的方法,例如通过首先进行分水岭处理,然后获取区域,然后忽略前景,然后简化曲线,然后检查它们的角是否形成连续等距模式。但是,根据我的经验,它不会产生正确的结果。 还有一件事-libgmic是G'MIC库,您可以通过其直接或通过绑定使用上面显示的转换。或者获取算法并在应用程序中重写它们。

谢谢您提供如此详细的答案。使用本地傅里叶是个好主意。但如果图案是一个十字架,而且十字线之间的角度不是90度,而是40度呢? - Max Tkachenko
1
这实际上使问题变得更加复杂。如果偏离90度的角度很小,那么可以通过容差来缓解问题。 - Hibryda
错过了编辑上面的时间 - 所以继续在这里... 对于更大的差异,可以应用多种方法。这完全取决于您想深入研究此问题的程度。实际上,最好的方法是应用带有步进角度的 Gabor 滤波器,将其转换为小线段(在限制噪声之前调整适当的容差),然后检查交点。 虽然最好,但这种方法需要一些自学算法和使用 OCR 优化方法。 - Hibryda

1
我认为这可能是一个潜在的答案(实际上在评论中提到):http://opencv.itseez.com/2.4/modules/imgproc/doc/feature_detection.html?highlight=hough#houghlinesp 还可以使用skimage工具进行特征检测的其他方法。
但实际上,我认为,与其使用霍夫变换导致巨大膨胀和缺乏精度(直线),我建议尝试哈里斯角检测 - http://docs.opencv.org/2.4/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html
这可以进一步调整(交叉角,因此局部最大值应取决于交叉分布),以适应您的特定问题。然后可以基于得到的点进行一些曲线近似。

谢谢!你能详细说说这个时刻:“本地最大值应该取决于交叉分布”吗? - Max Tkachenko
1
当您操作位图时,可以通过分析像素及其周围的情况来获得局部最大值。就像在FAST中一样-请参阅论文:http://lanl.arxiv.org/pdf/0810.2434。您的目标应该是找到一个旋转无关的十字形分布。这可以通过计算或迭代来完成。由于GPU函数现在很快,迭代方法已足够。但是,您必须考虑到区域大小应根据模式的比例进行调整。我将在下一条评论中尝试提供示例。 - Hibryda

0
也许你可以计算Hough Lines并确定交点。可以在这里找到OpenCV文档here

不幸的是,由于网格失真,它会带来很多错误的噪音线。 - Max Tkachenko
好的,我明白了。所以Harris 角点检测器也对你没有帮助? - L4CK4
没有帮助 :( - Max Tkachenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接