python - 使用 opencv - python 检测 W2 中的单个框

标签 python python-2.7 opencv computer-vision edge-detection

我进行了广泛的研究,但找不到能够实现我需要的技术组合。

我有一种情况需要对数百个 W2 执行 OCR 以提取数据以进行对帐。 W2 的质量很差,因为它们是打印出来的,随后又被扫描回计算机。上述过程不在我的控制范围内;不幸的是,我必须利用现有的资源。

我去年能够成功执行此过程,但由于及时性是一个主要问题,我不得不强行执行它。为此,我手动指示要从中提取数据的坐标,然后一次仅对这些片段执行 OCR。今年,我想提出一个更动态的情况,因为坐标可能会发生变化,格式可能会发生变化等。

我已经包含了一个样本,在下面擦洗了 W2。这个想法是让 W2 上的每个框都是它自己的矩形,并通过遍历所有矩形来提取数据。我已经尝试了几种边缘检测技术,但没有一种技术能够准确地提供所需要的。我相信我还没有找到所需的预处理的正确组合。我已尝试镜像一些数独谜题检测脚本。

Example W2

这是我迄今为止尝试的结果,以及 python 代码,无论是与 OpenCV 2 还是 3 一起使用:

Processed W2

import cv2
import numpy as np

img = cv2.imread(image_path_here)

newx,newy = img.shape[1]/2,img.shape[0]/2
img = cv2.resize(img,(newx,newy))
blur = cv2.GaussianBlur(img, (3,3),5)
ret,thresh1 = cv2.threshold(blur,225,255,cv2.THRESH_BINARY)

gray = cv2.cvtColor(thresh1,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,50,220,apertureSize = 3)

minLineLength = 20
maxLineGap = 50
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)

for x1,y1,x2,y2 in lines[0]:
    cv2.line(img,(x1,y1),(x2,y2),(255,0,255),2)

cv2.imshow('hough',img)
cv2.waitKey(0)

最佳答案

呵呵,边缘检测不是唯一的方法。由于边缘足够厚(每个地方至少有一个像素),二值化允许您分割框内的区域。

通过简单的标准,您可以摆脱困惑,仅边界框即可为您提供相当好的分割。

enter image description here

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

相关文章:

python - 从 Pandas 数据框中提取数据

python - 使用字典脚本导入 txt 文件并将其应用于数据框以替换单词

python-2.7 - Python 2 dis.dis() 无法解析包含 `for` 循环语法的字符串

android - 如何在图像中选择正确的矩形?

python - theano 给出 "...Waiting for existing lock by unknown process..."

python - 使用 pandas 选择多列并在多列中 fillna() 的另一种方法

python - 避免从计算字段更改类的状态 - Odoo v8

python - 使用 Python 2.7.x 连接到 Google Analytics 时出现 403 错误

python - 如何使用OpenCV对图像中的像素组进行分组和突出显示?

c++ - 卡片边缘检测 OpenCV