我用 Python 编写了一个程序,它会自动读取像这样的成绩单
目前我正在使用以下基本策略:
- 使用 ImageMagick 歪斜图像
- 使用 PIL 读入 Python,将图像转换为黑白
- 计算计算行和列中像素的总和
- 在这些总和中找到峰值
- 检查这些峰所暗示的交叉点是否填充。
运行程序的结果如下图所示:
您可以在左上方显示的图像下方和右侧看到峰值图。左上图中的线条是列的位置,红点表示已识别的分数。右下角的直方图显示了每个圆圈的填充水平和分类线。
这种方法的问题在于它需要仔细调整,并且对扫描设置的差异很敏感。是否有一种更稳健的方式来识别网格,这将需要更少的先验信息(目前我正在使用关于有多少点的知识)并且对于人们在图纸上绘制其他形状更稳健?我相信使用 2D Fourier Transform 可能是可能的,但我不确定如何。
我正在使用环保署,所以我有很多图书馆可供我使用。