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