python - 使用opencv python从表单中检测复选框

标签 python opencv image-processing information-retrieval opencv-python

给定一个 dentry 表格作为输入,需要使用图像处理找到表格中存在的所有复选框。我在下面回答了我目前的方法。是否有更好的方法来查找低质量文档的复选框?
样本输入:
masked input image

最佳答案

这是我们可以解决问题的一种方法,

import cv2
import numpy as np
image=cv2.imread('path/to/image.jpg')

### binarising image
gray_scale=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
th1,img_bin = cv2.threshold(gray_scale,150,225,cv2.THRESH_BINARY)
binary
定义垂直和水平内核
lineWidth = 7
lineMinWidth = 55
kernal1 = np.ones((lineWidth,lineWidth), np.uint8)
kernal1h = np.ones((1,lineWidth), np.uint8)
kernal1v = np.ones((lineWidth,1), np.uint8)

kernal6 = np.ones((lineMinWidth,lineMinWidth), np.uint8)
kernal6h = np.ones((1,lineMinWidth), np.uint8)
kernal6v = np.ones((lineMinWidth,1), np.uint8)
检测水平线
img_bin_h = cv2.morphologyEx(~img_bin, cv2.MORPH_CLOSE, kernal1h) # bridge small gap in horizonntal lines
img_bin_h = cv2.morphologyEx(img_bin_h, cv2.MORPH_OPEN, kernal6h) # kep ony horiz lines by eroding everything else in hor direction
horizontal
寻找垂直线
## detect vert lines
img_bin_v = cv2.morphologyEx(~img_bin, cv2.MORPH_CLOSE, kernal1v)  # bridge small gap in vert lines
img_bin_v = cv2.morphologyEx(img_bin_v, cv2.MORPH_OPEN, kernal6v)# kep ony vert lines by eroding everything else in vert direction
vertical image
合并垂直和水平线以获得块。添加一层扩张以消除小间隙
### function to fix image as binary
def fix(img):
    img[img>127]=255
    img[img<127]=0
    return img

img_bin_final = fix(fix(img_bin_h)|fix(img_bin_v))

finalKernel = np.ones((5,5), np.uint8)
img_bin_final=cv2.dilate(img_bin_final,finalKernel,iterations=1)
final binary
对二值图像应用连通分量分析以获得所需的块。
ret, labels, stats,centroids = cv2.connectedComponentsWithStats(~img_bin_final, connectivity=8, ltype=cv2.CV_32S)

### skipping first two stats as background
for x,y,w,h,area in stats[2:]:
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
final image

关于python - 使用opencv python从表单中检测复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62801070/

相关文章:

c++ - 使用 c++ api 访问 cv::Mat 中的元素 (x,y)

python - 使用opencv和python将图像转换为值(例如十六进制代码)

Python 数组不工作

python - Python 和 Julia 中的 OpenCV、DMatch 对象不匹配

python - 在Numpy和OpenCV2中替换3D子矩阵

python - 如何从立体声获取深度图-KITTI数据集

opencv - 如何细化或模糊或平滑边缘?

c - CUDA 中的图像序列处理

python - 在 Python 中实现基于策略的深度优先遍历

python - 将 xlwings 模块导入 python 3.4