稳健检测图像中的网格图案

时间:2013-05-16 05:56:13

标签: python image-processing

我用Python编写了一个程序,它自动读取像这样的评分表 Sheet after deskewing

目前我正在使用以下基本策略:

  • 使用ImageMagick
  • 校正图像
  • 使用PIL读入Python,将图像转换为B& W
  • 计算计算行和列中像素的总和
  • 查找这些总和中的峰值
  • 检查这些峰所暗示的交叉点是否填充。

运行程序的结果如下图所示: Image after processing

您可以在左上方显示的图像下方和右侧看到峰值图。左上图中的线是列的位置,红点表示识别的分数。直方图右下方显示每个圆的填充水平和分类线。

此方法的问题在于需要仔细调整,并且对扫描设置的差异很敏感。是否有一种更健壮的识别网格的方法,这将需要较少的先验信息(目前我正在使用有关多少点的知识),并且对于在纸张上绘制其他形状的人更加健壮?我相信可能有可能使用2D傅里叶变换,但我不确定如何。

我正在使用EPD,因此我可以使用相当多的库。

2 个答案:

答案 0 :(得分:2)

执行此操作的正确方法是在图像上使用连接组件分析,将其分割为“对象”。然后,您可以使用更高级别的算法(例如,对组件质心进行霍夫变换)来检测网格,并通过查看其包含的活动像素数量来确定每个单元格是否打开/关闭。

答案 1 :(得分:2)

首先,我发现你的初始方法非常合理,我可能会尝试相同的方式(我特别欣赏行/列投影,然后是直方图,这是一种在实际应用中通常非常有效的低估方法)

但是,由于您希望获得更强大的处理管道,这里的提案可能完全自动化(同时通过ImageMagick删除纠偏):

  1. 特征提取:通过广义Hough变换提取圆。正如其他答案中所建议的那样,您可以使用OpenCV的Python包装器。探测器可能会错过一些圆圈,但这并不重要。
  2. 使用圆心设置应用强大的对齐检测器。您可以使用描述here的Desloneux无参数检测器。不要害怕数学,程序实现起来非常简单(你可以在网上找到示例实现)。
  3. 通过选择方向摆脱对角线。
  4. 找到线条的交点以获得点。您可以通过假设这些交叉点的​​理想固定位置来使用这些坐标进行偏移校正。
  5. 这个管道可能有点CPU密集型(特别是第2步将进行某种贪婪的搜索),但它应该非常强大且自动化。