检测表单图像中选定的复选框

Pau*_*ine 5 python opencv

在巴西,有一种称为 DNV 的表格(在葡萄牙语中的“Born Alive Declaration”之后)。我在一家巴西政府机构工作,该机构每年从全州每家医院收到超过 50 万份此类药物。

我正在尝试检测复选框字段上的标记。我从“性别”字段开始,其中包含 M(男性)、F(女性)或 I(忽略)的复选框。

我已经能够使用 OpenCV 自信地找到字段和复选框:

在此处输入图片说明

我猜有更多暗像素的复选框区域是被标记的区域,即使图像质量非常低,它也能在 99% 的时间内工作。

if sum(checkbox1) < sum(checkbox2):
    return "M"
else:
    return "F"
Run Code Online (Sandbox Code Playgroud)

有时这会失败:一个人会告诉“女性”复选框被标记,但由于sum(checkbox1)是 577,065 和sum(checkbox1)605,880,计算机说它是一个男孩。

在此处输入图片说明

我已经尝试使用几种方法和值与形态变换相结合的阈值操作(在几种组合中侵蚀和扩张并使用许多内核形状和大小)并得到这个:

sex_field = cv2.fastNlMeansDenoising(cv2.blur(sex_field, (3, 3)), 30, 30, 15, 50)
_, sex_field = cv2.threshold(~sex_field, 127, 255, 0)
sex_field = ~cv2.morphologyEx(sex_field, cv2.MORPH_CLOSE, 
                              np.ones((3, 3), np.uint8), iterations=3)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

问题cv2.fastNlMeansDenoising是贵。是否有更轻量级的算法对这个用例有用?