我用 Python 编写了一个程序,可以自动读取像这样的评分表
目前我正在使用以下基本策略:
- 使用 ImageMagick 对图像进行校正
- 使用 PIL 读入 Python,将图像转换为黑白
- 计算行和列中像素的总和
- 在这些总和中找到峰值
- 检查这些峰隐含的交叉点以进行填充。
运行程序的结果如下图所示:
您可以在左上角图像的下方和右侧看到峰值图。左上图中的线条是列的位置,红点表示已识别的分数。右下角的直方图显示了每个圆圈的填充水平,以及分类线。
此方法的问题在于它需要仔细调整,并且对扫描设置的差异很敏感。是否有更强大的识别网格的方法,这将需要更少的先验信息(目前我正在使用关于有多少点的知识)并且对人们在纸上绘制其他形状更强大?我相信使用 2D 傅里叶变换可能是可行的,但我不确定如何实现。
我正在使用 EPD,所以我有很多库可供使用。
最佳答案
正确的做法是对图像使用连通分量分析,将其分割成“对象”。然后,您可以使用更高级别的算法(例如,组件质心上的霍夫变换)来检测网格,并通过查看每个单元格包含的事件像素数来确定它是否打开/关闭。
关于python - 图像中网格图案的鲁棒检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16579942/