为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

SMILET 2021-03-17 14:11:01
我已经用Python编写了一个程序,该程序会自动读取像这样的评分表 目前,我正在使用以下基本策略:使用ImageMagick校正图像使用PIL读入Python,将图像转换为黑白计算计算行和列中像素的总和在这些总和中找到峰值检查这些峰所隐含的交叉点以进行填充。运行该程序的结果如下图所示:您可以在左上方显示的图像的右下方看到峰图。左上方图像中的线是列的位置,红点表示已识别的分数。直方图的右下角显示每个圆的填充水平和分类线。这种方法的问题在于它需要仔细调整,并且对扫描设置的差异很敏感。是否有一种更可靠的识别网格的方法,该方法将需要较少的先验信息(目前我正在使用有关有多少个点的知识),并且对人们在图纸上绘制其他形状更可靠?我相信使用2D傅里叶变换是可能的,但我不确定如何做。我正在使用EPD,所以我有很多图书馆可供使用。
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

首先,我发现您的初始方法相当不错,我可能会尝试相同的方式(我特别欣赏行/列投影以及直方图,这是一种被低估的方法,通常在实际应用中非常有效)。

但是,由于您希望采用更健壮的处理管道,因此以下建议可以完全自动化(同时通过ImageMagick消除去偏斜):

  1. 特征提取:通过广义霍夫变换提取圆。正如其他答案所建议的那样,您可以使用OpenCV的Python包装器。检测器可能会漏掉一些圆圈,但这并不重要。

  2. 使用圆心应用鲁棒的对准检测器。您可以使用此处所述的Desloneux无参数检测器。不用担心数学,该过程很容易实现(您可以在线找到示例实现)。

  3. 通过选择方向来消除对角线。

  4. 找到直线的交点以获得点。您可以通过假设这些相交的理想固定位置来将这些坐标用于偏斜校正。

该管道可能会占用一些CPU资源(尤其是步骤2,该过程将继续进行某种贪婪的搜索),但是它应该非常健壮和自动。


查看完整回答
反对 回复 2021-03-24
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

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


查看完整回答
反对 回复 2021-03-24
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

如果您将分量质心的位置视为输入到hough变换中的数据点(而不是单个像素)的位置,则会对单元格所在的行进行非常快速的“低分辨率”分析。这也可以删除需要预先校正。另一种选择是使用Ransac来确定网格的布置。从像素级升级到组件级后,事情将变得更加直观,您基本上可以轻松地提出强大的解决方案。

查看完整回答
反对 回复 2021-03-24
  • 3 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号