【问题标题】:Extracting data from irregular form using openCV and OCR使用 openCV 和 OCR 从不规则形式中提取数据
【发布时间】:2016-11-30 12:54:55
【问题描述】:

我正在尝试从表单(表单的扫描图像)中提取信息并将该信息放入表格中。我已经使用 pytesseract 成功地对图像进行了 OCR,但输出的问题是 Tesseract 尝试逐行提取文本。

我的扫描表格如下所示:

表单(A、B、C)的每个窗口应该是表格中的不同行。我正在尝试使用 Open Computer Vision(在 python 中)来识别各个窗口,以 1)识别各个数据单元(A、B、C),2)裁剪每个单独的窗口,以及 3)使用 Tesseract 来 OCR单个窗口的图像,以将信息放在 SQL 表中需要的位置。

我的问题:如何识别每个单独的表格条目窗口的边界,并将图像裁剪到该边界的范围内(然后应用 OCR)?另外,是否可以使用角点检测来识别单个数据单元?

我主要将 python 与 OpenCV 结合使用,并且对文档非常熟悉,可以将 C#/++ OpenCV 解决方案应用于 python 脚本,因此我将不胜感激您提供的任何信息/替代解决方案。

【问题讨论】:

    标签: c# python c++ opencv


    【解决方案1】:

    可以单独使用轮廓和简单的轮廓属性将它们按部分分开。

    注意:这些程序仅适用于这种特殊形式。它不是各种不规则形式的通用解决方案。但是,您可以实现或调整某些方法以使其适用于您的表单

    先读取图片

    image=cv2.imread("TDtma.png")

    将其转换为灰度

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

    使用 Canny Edge 过滤器获取边缘 - 值 600,1000 是通过随机实验选择的。我选择了这个值,因为它可以正确删除背景伪影。您可能需要根据要输入的图像更改并选择正确的值。

    edges = cv2.Canny(gray,600,1000)

    使用模糊滤镜去除现实世界图像中可能出现的小瑕疵(例如手写等)

    edges = cv2.GaussianBlur(edges,(5,5),0) # To remove small artifacting if any

    接下来我们找到外部轮廓,因为这 3 个矩形(部分)明显分开,我们需要做的就是找到所有外部轮廓。请注意,此代码可能与 OpenCV 2.4.x 不同。

    (_,contours,_) = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    由于某种原因,轮廓是从下到上检测的。所以我们有一个字符 C 被递减为 A 只是为了标记我们感兴趣的区域。

    FormPart = ord('C')

    遍历每个轮廓,然后裁剪感兴趣的区域。

    我们检查每个轮廓是否具有正确的纵横比和面积,这些值(纵横比:2,面积:1000)是通过实验获得的,可能需要根据现实生活中的输入图像进行更改。 理想情况下,在我们的例子中,一个矩形的纵横比应该 >2(矩形的一侧总是比另一侧大,这个图像中的矩形的纵横比 >2)。我们检查面积是否大于 1000,以避免由于小伪影而检测到的任何类型的轮廓。同样,这些值可能需要相应地更改,以便正确处理真实世界的图像。

    即使不检查轮廓面积和纵横比,该给定图像也将得到正确处理,但由于小斑点可能会导致实际图像出现问题,因此为了避免它们,正在执行区域/纵横比检查.

    for contour in contours: x,y,w,h = cv2.boundingRect(contour) aspect_ratio = w / float(h) area = cv2.contourArea(contour) if aspect_ratio<2 or area >1000: # Just to check whether we have the right contour, if not we go to the next contour continue crop_img = image[y:y+h,x:x+w] #This is our region of interest cv2.imshow("Split Section "+chr(FormPart), crop_img) cv2.waitKey(0) FormPart=FormPart-1 if chr(FormPart) < ord('A'): # If there are more than 3 sections break

    最后,我们在这里有一个完整的程序,您可以复制和粘贴并在您的机器上运行。确保您有 Python >2.7.x 和 OpenCV 3。可能需要更改某些行以便与 OpenCV 2.4 一起使用 还要确保图像名为“TDtma.png”并且与 Python 程序位于同一目录中

    import cv2
    image=cv2.imread("TDtma.png")
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray,600,1000) # To remove the irrelevant edges and show the relevant ones
    cv2.imshow("Canny edge detection", edges)
    cv2.waitKey(0)
    
    
    edges = cv2.GaussianBlur(edges,(5,5),0) # To remove small artifacting if any
    
    (_,contours,_) = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Detecting external contours
    
    #If you are on opencv 2.4x use this
    #(contours,_)= cv2.findContours(edgescopy, cv2.RETR_EXTERNAL,  cv2.CHAIN_APPROX_SIMPLE)
    FormPart = ord('C')# Contour goes from bottom to top in this example
    for contour in contours:
        x,y,w,h = cv2.boundingRect(contour)
        aspect_ratio = w / float(h)
        area = cv2.contourArea(contour)
        if aspect_ratio<2 or area <1000:  #Go to next contour if this contour doesnt meet our specifications
            continue
        crop_img = image[y:y+h,x:x+w] #This is our region of interest
        cv2.imshow("Split Section "+chr(FormPart), crop_img)
        cv2.waitKey(0)
        FormPart=FormPart-1
        if chr(FormPart) < ord('A'): # If there are more than 3 sections
            break
    

    最后你应该有这样的东西

    也可以在文本字段中分隔这些单独的数据单元格。虽然它有点复杂,但可能不适用于真实世界的图像。如果你愿意我可以试试。有需要可以留言。

    希望我能帮上忙

    【讨论】:

    • 感谢@Titanoboa 的精彩演示。使用相同的方法(使用 cv2.RETR_TREE 而不是 cv2.RETR_EXTERNAL)我可以裁剪每个窗口和 OCR 以检索我需要的信息。
    【解决方案2】:

    在这种情况下,您应该看看OpenCV findContours。确保使用RETR_TREE 检索方法来获取轮廓层次结构。

    您的窗口应该是图像中最高级别的轮廓。请参阅我的回答 here 以了解如何导航 OpenCV 返回的层次结构。

    【讨论】:

    • 感谢您的意见@Sunreef!您的回答使我找到了有关轮廓层次结构的文档,这些文档帮助我想出了至少与@Titanoboa 略有不同的部分解决方案。
    猜你喜欢
    • 2019-12-22
    • 2021-03-25
    • 2017-03-08
    • 1970-01-01
    • 2012-09-01
    • 2020-12-08
    • 2022-09-26
    • 2017-02-05
    • 1970-01-01
    相关资源
    最近更新 更多