【问题标题】:Python: removing black pixels from an image where the text to be extracted is blackPython:从要提取的文本为黑色的图像中删除黑色像素
【发布时间】:2023-02-02 22:34:30
【问题描述】:

我有以下代码从图像中提取文本

img = cv2.imread('download.jpg')
text = pytesseract.image_to_string(img, lang='lets', config='--psm 6 ')
solution = re.sub('[^0-9]','', text)

然而,使用如下所示的图片,上面写着1981,实际被拉回的文本是5139011

有什么建议么?

【问题讨论】:

    标签: python python-3.x tesseract python-tesseract


    【解决方案1】:

    最重要的部分是清除胡椒噪声。经过一些 opencv 操作(也许不是最好的操作)后,我得到了这个干净的图像:

    为了获得预期的文本提取,我使用了这个 tesseract 训练有素的字体: Trained data

    结果如下:

    这是代码:

    import cv2
    import numpy as np
    import pytesseract
    
    pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCR	esseract'
    img = cv2.imread('a.jpg')
    grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    (_, blackWhiteImage) = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)
    blackWhiteImage = cv2.copyMakeBorder(src=blackWhiteImage, top=50, bottom=50, left=50, right=50, borderType=cv2.BORDER_CONSTANT, value=(255,255,255))
    
    blackWhiteImage = cv2.dilate(blackWhiteImage, cv2.getStructuringElement(cv2.MORPH_RECT, (1,4)))
    blackWhiteImage = cv2.dilate(blackWhiteImage, cv2.getStructuringElement(cv2.MORPH_RECT, (4,1)))
    blackWhiteImage = cv2.morphologyEx(blackWhiteImage, cv2.MORPH_CLOSE, np.ones((3,3),np.uint8))
    blackWhiteImage = cv2.erode(blackWhiteImage,  np.ones((7,7),np.uint8))
    data = pytesseract.image_to_data(blackWhiteImage, lang="lets", config="-c tessedit_char_whitelist=0123456789 --psm 7")
    originalImage = cv2.cvtColor(blackWhiteImage, cv2.COLOR_GRAY2BGR)
    
    text = []
    for z, a in enumerate(data.splitlines()):
        if z != 0:
            a = a.split()
            if len(a) == 12:
                x, y = int(a[6]), int(a[7])
                w, h = int(a[8]), int(a[9])
                cv2.rectangle(originalImage, (x, y), (x + w, y + h), (0, 255, 0), 1)
                cv2.putText(originalImage, a[11], (x, y - 2), cv2.FONT_HERSHEY_DUPLEX, 0.5, (0, 0, 255), 1)
                text.append(a[11]);
    
    print("Text result: 
    ", text)
    cv2.imshow('Image result', originalImage)
    cv2.waitKey(0)
    

    【讨论】: