【问题标题】:Pytesseract : Unable to extract date from imagePytesseract:无法从图像中提取日期
【发布时间】:2021-02-15 16:07:09
【问题描述】:

我正在尝试从图像image here 中提取日期。日期位于右下角,因此我也尝试先裁剪图像然后尝试提取日期,但它们似乎都不起作用。

import cv2
import pytesseract
import matplotlib.pyplot as plt

img = cv2.imread("datepic.jpg")
date = pytesseract.image_to_string(img,config='--psm 10 -c tessedit_char_whitelist=0123456789')
date

##cropping the image to get only the date part
from PIL import Image
img = Image.open("datepic.jpg")
left =320
right = 460
top = 330
bottom = 350
m1 = img.crop((left, top, right, bottom))
plt.imshow(m1)
date = pytesseract.image_to_string(m1, config='-psm 9 tessedit_char_whitelist=0123456789')
date

我也玩过 psm 值,但都没有得到想要的结果。

【问题讨论】:

    标签: ocr tesseract python-tesseract text-extraction


    【解决方案1】:

    使用日期位于右下角的信息,我们可以估计它的位置。接下来,我们可以对图像进行上采样并执行颜色分割以进行准确识别,以使数字对人眼和 tesseract 都更加可见。最后,我们应用自适应阈值来提取和 OCR 字母。

      1. 上采样和执行颜色分割:我们加载图像,通过估计其坐标来裁剪日期部分。对裁剪区域进行上采样(使用cv2.resize)以使其可见。要进行颜色分割,我们需要将裁剪区域转换为 HSV 格式,定义上下限范围并使用cv2.inRange 执行颜色分割以获得二进制掩码。
      1. 提取日期部分:获得二进制掩码后,我们将使用它来移除背景,并使用cv2.bitwise_and 将日期部分与图像的其余部分分开。算术运算and 对于在 hsv 彩色图像中定义 roi 非常有用。
      1. 应用自适应阈值 从图像中提取日期后,我们将看到一个密集的黄色区域,无法从 roi 中读取。因此simple-thresholding methods 没有用处。我们将使用cv2.adaptiveThreshold 使特征可以被 tesseract 检测到。请注意,blockSizeC 参数可能因图像而异。
      1. 执行 OCR:仅从 roi 中分离出特征后,我们不需要使用任何page-segmentation-mode。我们直接使用image_to_string,不做任何配置就可以得到结果。

    步骤

    • 估计日期位置:

      • 如果将宽度分成 5 个相等的部分,则需要最后两部分和图像的高度从底部稍微向上:

      • 如果我们对图像进行上采样:

      • 现在图像可读且清晰。然而,黄色密集区域是 OCR 的阻塞伪影。

      • img = cv2.imread("QqLso.jpg")
        (h, w) = img.shape[:2]
        crp = img[h-30:h, int((3*w)/5):w]
        crp = cv2.resize(crp, (0, 0), fx=5, fy=5)
        
    • 颜色分割生成的蒙版

      • 想法是删除不包含日期信息的区域。

      • hsv = cv2.cvtColor(crp, cv2.COLOR_BGR2HSV)
        lwr = np.array([0, 102, 0])
        upr = np.array([179, 255, 255])
        msk = cv2.inRange(hsv, lwr, upr)
        
    • 使用 bitwise_and 提取日期部分

      • 现在我们有了日期信息,其中包含阻止日期和月份数据的工件。

      • res = 255 - cv2.bitwise_and(crp, crp, mask=msk)
        
        
    • 应用自适应阈值

      • 工件部分消失,图像适合提取 OCR。

      • crp_img = cv2.cvtColor(res, cv2.COLOR_HSV2BGR)
        crp_gry = cv2.cvtColor(crp_img, cv2.COLOR_BGR2GRAY)
        thr = cv2.adaptiveThreshold(crp_gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                                    cv2.THRESH_BINARY_INV, 31, 9)
        
    • tesseract-ocr 的结果

      • 01/02/2021.14:213
        

    代码:


    import cv2
    import numpy as np
    import pytesseract
    
    # Estimate the position
    img = cv2.imread("QqLso.jpg")
    (h, w) = img.shape[:2]
    crp = img[h-30:h, int((3*w)/5):w]
    
    # Up-sample
    crp = cv2.resize(crp, (0, 0), fx=5, fy=5)
    
    # Create binary mask
    hsv = cv2.cvtColor(crp, cv2.COLOR_BGR2HSV)
    lwr = np.array([0, 102, 0])
    upr = np.array([179, 255, 255])
    msk = cv2.inRange(hsv, lwr, upr)
    
    # Remove background
    res = 255 - cv2.bitwise_and(crp, crp, mask=msk)
    
    # Adaptive-threshold
    crp_img = cv2.cvtColor(res, cv2.COLOR_HSV2BGR)
    crp_gry = cv2.cvtColor(crp_img, cv2.COLOR_BGR2GRAY)
    thr = cv2.adaptiveThreshold(crp_gry, 255, cv2.ADAPTIVE_THRESH_MEAN_C,
                                cv2.THRESH_BINARY_INV, 31, 9)
    
    # OCR
    txt = pytesseract.image_to_string(thr)
    print(txt)
    
    # display
    cv2.imshow("thr", thr)
    cv2.waitKey(0)
    

    要查找掩码的上下边界,您可能会发现有用:HSV-Threshold-script

    【讨论】:

    • 谢谢@Ahx。我得到了这个输出 ym 0110212021 14:21}。我可以处理这个来获取日期。在没有突出显示的部分的情况下,我们如何摆脱背景?我还注意到,tesseract 的输出对自适应阈值的最后两个参数非常敏感。有没有办法自动找出这些值(无需反复试验,因为这需要在多个图像上完成)
    • 你的 pytesseract 版本是什么?请确保它是当前版本。您对自适应阈值是正确的,但这是一种图像处理解决方案。如果你想自动查找,那么你应该使用深度学习ocr。
    • 获得所有图像后,我可以检查这种方法是否适用于所有图像。但是 pytesseract 也可以选择使用 LSTM。我想我需要的是自定义深度学习 OCR,如果这样不起作用。谢谢@Ahx
    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2020-04-01
    • 2022-10-13
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多