Python获取JPEG图像中黑色矩形左上角的(x,y)坐标

2 投票
1 回答
2225 浏览
提问于 2025-04-18 16:20

背景:我正在尝试创建一个软件,能够自动批改答卷。答卷的格式是固定的,如下所示:

在这里输入图片描述

问题:为了检测用户勾选的选框(A、B、C等),我需要根据四个黑色矩形框进行裁剪或透视变换。我该如何获取上面图片中四个黑色矩形框的坐标,最好是使用OpenCV

附加信息:一旦我能够裁剪出答题框的部分,如下所示:

在这里输入图片描述

因为我知道每个框的确切尺寸,所以我可以比较每个框(A、B、C)中的黑色像素数量,以检查用户勾选了哪个框。(假设用户不会勾选多个框)

欢迎任何建设性的建议。

1 个回答

1

看起来,你的黑色方块似乎是页面上唯一真正黑色的东西,其他的看起来都比较浅。而且,你“有点”知道它们的位置,或者至少知道大概在哪些区域:它们有自己的列,上下没有其他东西。所以,假设你的图像是“8位灰度”,我会这样做,而不使用任何形状识别模块:

  • 先对图像进行过滤,找出所有像素值低于某个值(比如5?10?50?)的部分,看看这样能不能把除了方块以外的东西都过滤掉。

  • 然后把图像的模式切换成黑白(没有灰色,只有1位图),并反转颜色(黑色变成白色,白色变成黑色)。

  • 接下来,我会从左到右扫描图像的每一列。对于每一列,计算该列所有像素的总和。只要结果是零,说明还没找到方块。当总和开始变成非零时,你就找到了一个方块。这个非零值在列中的位置对应着方块的一个角(你甚至可以判断是上面的角还是下面的角)。如果继续扫描,总和会增加。通过观察总和的变化,你应该能推测出每个方块角的位置,也就是说:每次总和变化就是一个新角。一个大步骤:所有方块完美对齐。四个小步骤:方块在对角线上。从几何角度看,除非纸张撕裂或折叠,否则方块的左上角会同时出现,或者按顺序出现(从上到下或从下到上)。然后再从右到左重复这个过程。

分析总和是最棘手的部分,不过快速看2到3个例子会给你一个大致的估计,可以用来处理其他的,比如:总和在600到800之间——这列只有一个方块,总和在1200到1600之间——这列有两个方块,等等。当然,使用模式识别可能会有更实用的解决方案,但那样就有点作弊了。

撰写回答