图像网格中的鲁棒模式检测

2024-10-01 11:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

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

这种方法的问题是需要仔细调整,并且对扫描设置的差异很敏感。有没有一种更可靠的方法来识别网格,它需要较少的先验信息(目前我使用的是关于有多少个点的知识),并且对于在纸上绘制其他形状的人来说更可靠?我相信用二维傅里叶变换是可能的,但我不知道怎么做。在

我正在使用EPD,所以我有很多库可以使用。在


Tags: 方法图像程序pil像素直方图级别策略
2条回答

首先,我发现你最初的方法很好,我可能也会尝试同样的方法(我特别欣赏行/列投影后再进行直方图,这是一种被低估的方法,在实际应用中通常是相当有效的)。在

但是,由于您希望获得更可靠的处理管道,下面是一个可能完全自动化的建议(同时也可以通过ImageMagick删除倾斜):

  1. 特征提取:通过广义Hough变换提取圆。正如其他答案中建议的那样,您可以使用OpenCV的Python包装器。探测器可能会漏掉一些圆圈,但这并不重要。在
  2. 利用圆应用一个稳健的对准检测器中心。你可以使用Desloneux无参数检测器描述here。不要害怕数学,这个过程很容易实现(你可以在网上找到示例实现)。在
  3. 通过选择方向来去除对角线。在
  4. 找出线的交点来得到点。通过为这些交点假定理想的固定位置,可以使用这些坐标进行斜交。在

这个管道可能有点CPU密集型(特别是第2步,它将进行某种贪婪的搜索),但它应该是非常健壮和自动的。在

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

相关问题 更多 >