【问题标题】:Pytesseract read coloured textPytesseract 读取彩色文本
【发布时间】:2021-01-27 14:32:17
【问题描述】:

我正在尝试使用Pytesseract 阅读彩色(红色和橙色)文本。 我试图不对图像进行灰度化,但这也不起作用。

图像,它可以读取

无法读取的图像

我当前的代码是:

        tesstr = pytesseract.image_to_string(
                    cv2.cvtColor(nm.array(cap), cv2.COLOR_BGR2GRAY),
                    config="--psm 7")

【问题讨论】:

  • 如果您的背景始终相同,请先尝试background subtraction,然后再尝试OCR
  • tesseract 提高识别率的快速护目镜提供了许多有用的指导资源,您无需在此处提问即可找到。

标签: python ocr python-tesseract


【解决方案1】:

这个小功能(如下)适用于任何颜色

ec9Ut.png

阈值结果

x18MN.png

阈值结果

SFr48.png

阈值结果

import cv2
from pytesseract import image_to_string

def getText(filename):
    img = cv2.imread(filename)
    HSV_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    h,s,v = cv2.split(HSV_img)
    thresh = cv2.threshold(v, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    txt = image_to_string(thresh, config="--psm 6 digits")
    return txt
    

text = getText('ec9Ut.png')
print(text)
text = getText('x18MN.png')
print(text)
text = getText('SFr48.png')
print(text)

输出

46
31
53

【讨论】:

    【解决方案2】:

    你可以申请:


      1. 侵蚀
      1. 自适应阈值

    侵蚀会降低图像的厚度,例如:

    Original Image Erosion

    当我们对 53 和 31 图像应用侵蚀时

    Original Image Erosion

    • 对于adaptive-threshold

      • blockSize= 27

        • Erosion Threshold
      • blockSize= 11

        • Erosion  Threshold

    对于每张图片,我们需要应用不同的阈值

    代码:


    import cv2
    from pytesseract import image_to_string
    
    img_lst = ["fifty_three.png", "thirty_one.png"]
    
    for img_pth in img_lst:
        img = cv2.imread(img_pth)
        (h, w) = img.shape[:2]
        img = cv2.resize(img, (w*2, h*2))
        gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        erd = cv2.erode(gry, None, iterations=2)
        if img_pth == "fifty_three.png":
            thr = cv2.adaptiveThreshold(erd, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 27, 5)
        else:
            thr = cv2.adaptiveThreshold(erd, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 5)
        txt = image_to_string(thr, config="--psm 6 digits")
        print(txt)
        cv2.imshow("thr", thr)
        cv2.waitKey(0)
    

    结果:

    53
    
    31
    

    可能的问题1:为什么有两个不同的块大小参数?

    嗯,每个图像的厚度都不同。所以文本识别需要两个不同的参数。


    可能的问题2:为什么None定义为erode方法的内核?

    不幸的是,我找不到适合腐蚀的内核。因此我设置为无。


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      相关资源
      最近更新 更多