我是图像处理的新手,这就是我面临的问题 - 假设我有一个申请表的图像,如下所示:

现在我想检测所有要输入数据的位置的位置。在这种情况下,将矩形划分为多个框,如下所示(并非所有字段都已标记):

我可以忍受照片盒也被检测到。我试过在 OpenCV 源代码中运行 squares.cpp 示例,这并不能完全满足我的要求。我还尝试了修改后的 here 版本 - 结果更糟(我的用例肯定与该问题中的 OP 非常不同)。

此外,霍夫变换来获得线条并没有真正使用/不使用模糊阈值,因为扫描图像中的噪声会导致多余的线条,而且,阈值处理会带走部分梳子(小方块),因此线路检测不达标。

请注意,此表单是 而非 打印表单的扫描副本,但实际输入很可能是打印表单的嘈杂扫描图像。

虽然我绝对确定这是可能的(至少允许有一定的容忍度)并且我正在努力寻求解决方案,但如果我从其他可能尝试过类似事情的人那里获得见解和想法,那将非常有帮助/享受对简历问题的黑客攻击。此外,如果答案解释了为什么要进行特定操作(例如,尝试填补阈值留下的任何漏洞等的扩张),那就太好了。

最佳答案

形式是否以任何方式一致?所有表格上的“此类盒子”大小相同吗?如果你可以依靠一致的大小,比如上面表格中的字符框,你可以使用模板匹配。

否则,问题似乎是:找到图像上的任何/所有矩形(使用后处理步骤过滤掉任何具有大量标记的矩形,或合并相邻矩形)。

您越能利用表单之间的一致性,问题就越容易。使用您可以获得的任何上下文。

编辑

使用梯度(通过在 x 和 y 方向使用 Sobel 核计算)可以消除大量噪声。

使用两者可以找到梯度的方向(可以在这里找到方程:en.wikipedia.org/wiki/Sobel_operator)。假设我们将框的判别特征定义为垂直或水平梯度。如果像素的渐变方向是水平直线或垂直直线,请保留它,将其他所有设置为白色。

为了使其对噪声更稳健,您可以使用滑动窗口 (3x3),在其中计算中值方向。如果窗口的中间(或平均)方向是垂直或水平的,则保持当前(窗口的中间)像素,否则将其设置为白色。

您可以使用 OpenCV 进行梯度计算,也可以使用方向/相位计算,但您可能需要编写代码来执行实际的滑动窗口代码。我对 OpenCV 不是很熟悉

关于image-processing - 在空白的扫描申请表中查找数据输入点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13322719/

10-11 22:05
查看更多