使用OpenCV检测网格节点(或使用其他东西)

时间:2016-08-14 17:12:15

标签: python opencv pattern-recognition

我在照片上有一个网格(它们来自相机)。二值化后,它们看起来像这样(红色是255,蓝色是0): grid

检测这些图片上的网格节点(十字架)的最佳方法是什么? 注意:网格不一致地从一个单元到另一个单元失真。

更新

二值化之前不同网格和其他扭曲的一些示例: enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

在这种情况下,我首先尝试找到最佳起点。 所以,首先我对你的图像进行了阈值处理(但是我也可以对它进行概括,然后就是阈值。但是这样一些数据会无法恢复):

Imgur

然后,我尝试了大量工具来获得批量强调的最突出的功能。最后,玩Gimp的G'MIC插件我发现了这个:

Imgur

基于以上内容,我准备了一个如下所示的通用模式:

Imgur

然后我得到了这张图片的一部分:

Imgur

为帮助确定角度,我制作了局部傅立叶频率图 - 这样就可以获得图案局部角度:

Imgur

然后你可以制作一个在现代GPU上快速工作的简单厚度 - 得到这样的差异(错过的情况):

Imgur

当有击中时差异很小;我所记得的关于局部最大值的内容或多或少地指的是如何处理所产生的差异。由于比例因子灵敏度,在模式圆差异之外的重量与内部相同是不明智的。因此,在使用的算法中,应该对交叉内部进行加权。然而,与图像不同的模式看起来像这样:

Imgur

正如您所看到的那样,可以区分命中和未命中。重要的是设置适当的公差并使用傅里叶频率来获得角度(阈值图像傅立叶通常遵循分析的图像的整体方向)。 以上方式可以稍后通过Harris检测来补充,或者可以使用上述模式来修改Harris检测以区分两个到四个紧密放置的角。 不幸的是,在这种情况下,所有技术都依赖于规模,应该适当调整。 还有其他方法可以解决您的问题,例如首先进行分水岭,然后获取区域,然后忽略前景,然后简化曲线,然后检查它们的角是否形成连续的等距模式。但对我来说,它不会产生正确的结果。

还有一件事 - libgmic是G'MIC库,您可以直接或通过绑定使用上面显示的转换。或者获取算法并在您的应用中重写它们。

答案 1 :(得分: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

这可以针对您的具体问题进一步调整(交叉角,因此局部最大值应取决于交叉'分布)。然后可以根据得到的点进行一些曲线近似。