【问题标题】:tesseract for empty table cell空表单元格的 tesseract
【发布时间】:2018-09-17 16:01:16
【问题描述】:

我正在使用 tesseract 在 CentOS 实例上将图像转换为文本,但我无法处理空白单元格。

我从 tesseract 得到的输出:

法人 项目类别 Mon 08/ 20 Tue 08/ 21 Wed 08/ 22 Thu 08/23 周五 08/24 周六 08/25 周日 08/26 总计

测试开发改进 - 改进 8.00 8.00 8.00 8.00 8.00 40.00 H '9

请注意,在第二行中,最后 8 和 40 之前有空格(基本上 Sat/Sun 单元格是空的)

【问题讨论】:

    标签: image-processing ocr tesseract


    【解决方案1】:

    我会在执行 OCR 部分之前尝试定位包含文本的区域,使其成为我的 ROI。然后对于 OCR 部分,使用 ROIs 而不是整个图像。然后您可以搜索 ROI 是否包含轮廓,然后它应该执行 OCR 否则会产生空白。希望对您有所帮助,干杯!

    例子:

    import cv2
    import numpy as np
    
    img = cv2.imread('table_so.png')
    
    res = cv2.resize(img,None,fx=0.8, fy=0.8, interpolation = cv2.INTER_CUBIC)
    h,w,ch = res.shape
    cv2.rectangle(res, (0,0), (w,h), (0,0,0), 10)
    
    gray = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
    _, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
    sort_cnts = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[0] + cv2.boundingRect(ctr)[1] * res.shape[1] )
    
    ROIs = []
    
    for cnt in sort_cnts:
        x,y,w,h = cv2.boundingRect(cnt)
        if 2000 > w > 70 and h < 100:
            ROI = res[y:y+h, x:x+w]
            ROIs.append(ROI)
            cv2.rectangle(res, (x,y), (x+w,y+h), (0,255,0), 2)
    
    for i in ROIs:
        roi = i
        gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
        _, thresh = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
        _, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
        if len(contours) > 1:
            print('DO OCR HERE')
        else:
            print('BLANK SPACE')
        cv2.imshow('img', gray)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    cv2.imshow('img', res)
    

    结果:

    (绿色框为 ROI)

    • 在此处进行 OCR
    • 在此处进行 OCR
    • 在此处进行 OCR
    • 在此处进行 OCR
    • 在此处进行 OCR
    • 在此处进行 OCR
    • 在此处进行 OCR
    • 在此处进行 OCR
    • 在此处进行 OCR
    • 空白空间
    • 空白空间
    • 空白空间

    【讨论】:

    • 这可以通过 Javascript 和 laravel 来实现吗?
    • @Nuwan Withanage 我对网络技术没有太多经验,但是在谷歌搜索之后,我认为您可以通过在项目中实现 OpenCV.js 脚本来实现。这是官方 OpenCV.js 教程的链接:docs.opencv.org/master/d5/d10/tutorial_js_root.html
    • 我用 python 做了这个,你拯救了我的一天。现在我需要使用 ROI 从您的示例表中打印空单元格的地址,例如“第一行 - 第 9 列 - 空,第一行 - 第 10 列 - 空”,而不使用 OCR 功能,
    • 如果可以像使用 ROI 一样打印行明智的空单元格计数,例如 '1st row - 3, 2nd row - 1',非常感谢
    【解决方案2】:

    您可以训练 Tesseract 并使其识别空格(不推荐,因为它会弄乱您获得的 100% 输出),或者通过编码解决问题。不幸的是,没有办法按照你想要的方式训练 Tesseract。

    我在这里看到的最佳解决方案是在周六和周日显示 0 或类似的东西(任何你觉得舒服的角色),以便 Tesseract 可以看到它们并且你可以对此做出反应。

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2017-11-13
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多