2

我们打印了 500 个气泡调查表,取回它们,然后大批量扫描它们,为我们提供 500 个 PNG 图像。

每个图像的对齐方式略有不同,但大小和分辨率相同。我们需要注册图像,以便它们完全对齐。(下一步是对气泡进行半自动评分)。

如果这些是 3D-MRI 图像,我可以使用单个命令行实用程序完成此操作;但我没有看到任何此类用于对齐扫描文本文档的工具。

我已经按照Image Alignment (Feature Based) using OpenCV中的描述玩过 opencv ,它在工作时会产生炸药结果,但它经常失败。这种方法正在寻找隐藏在自然场景中的文档,这比我们的图像只是以 2D 而非 3 维旋转和平移的情况要困难得多。

我还探索了imreg_dft,它运行一致但效果很差——大概 dft 方法在照片上比在文本文档上更好。

是否已经存在用于扫描表格图像注册的解决方案?如果没有,正确的方法是什么?Opencv,imreg_dft,还是别的什么?

类似的先前问题: 如何在扫描的文档图像上找到空白字段

4

1 回答 1

2

您可以尝试使用答案框的红色轮廓创建一个遮罩,您可以在其中选择轮廓。我在下面创建了一个示例。您还可以通过为字母创建蒙版、反转它,然后将其作为蒙版应用来删除蓝色字母。我没有这样做,因为他的出版商形象是低分辨率的,这会引起问题。我希望您的扫描表现更好。

当您拥有盒子的轮廓时,您可以单独转换/比较它们(因为盒子有不同的大小)。或者您可以使用最大的轮廓为整个文档创建一个变换。

然后,您可以使用minAreaRect找到轮廓的角点。阈值轮廓区域以排除噪声/非答案区域。

在此处输入图像描述

import cv2
import numpy as np
# load image
img = cv2.imread('Untitled.png')
# convert to hsv colorspace
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# define range of image bachground in HSV
lower_val = np.array([0,0,0])
upper_val = np.array([179,255,237])

# Threshold the HSV image 
mask = cv2.inRange(hsv, lower_val, upper_val)

# find external contours in the mask
contours, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# draw contours
for cnt in contours:
    cv2.drawContours(img,[cnt],0,(0,255,0),3)

# display image
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows() 
于 2019-07-28T12:59:32.873 回答