【问题标题】:Why does tesseract fail to read text off this simple image?为什么 tesseract 无法从这个简单的图像中读取文本?
【发布时间】:2019-06-13 03:33:28
【问题描述】:

我已经阅读了大量关于 pytesseract 的帖子,但我无法让它从一个死的简单图像中读取文本;它返回一个空字符串。

图片如下:

我尝试过对其进行缩放、灰度化以及调整对比度、阈值化、模糊化以及其他帖子中所说的所有内容,但我的问题是我不知道 OCR 想要更好地工作什么。它想要模糊的文字吗?高对比度?

要尝试的代码:

import pytesseract
from PIL import Image

print pytesseract.image_to_string(Image.open(IMAGE FILE))

正如您在我的代码中看到的那样,图像本地存储在我的计算机上,因此Image.open()

【问题讨论】:

  • 是的,这仍然对我不起作用
  • 根据新的事实(meta.stackoverflow.com/questions/379138/…) ,这个问题应该被编辑或关闭,因为提问者需要将他的原始图像存储在他的计算机上的解决方案。但是,我们不知道原始图像的外观如何,并且 Questionar 不接受他在原始问题中发布的图像的解决方案。因此,从逻辑的角度来看,这个问题是无法解决的。
  • @Martin 好吧,那是错误的。 OP显示了有问题的图片和相关代码。 OP 还显示了图像的打开——文件名无关紧要;都是本地的。这应该给你主要的指针:“我想使用本地图像” - 再次,它是问题中的图像,但它存储在本地,并且只是为了minimal reproducible example
  • 你的建议也是错误的。就像其他人一样,我提供了对上传图像的图像处理,因为那是您可以使用的绝对点。因为答案需要图像处理,所以我需要知道我的起始图像是什么,并且我不知道他的本地图像是原始形式还是经过他“尝试”的一切。如果不能确定起始图像,则无法解决

标签: python python-tesseract


【解决方案1】:

尝试一些类似的东西

import pytesseract 
from PIL import Image 
import requests 
import io

response = requests.get('https://i.stack.imgur.com/J2ojU.png') 
img = Image.open(io.BytesIO(response.content))
text = pytesseract.image_to_string(img, lang='eng', config='--psm 7')

print(text)

--psm 值等于或大于 6 确实为我生成了“Gm”。

如果图像存储在本地(并且在您的工作目录中),只需删除 response 变量并使用行更改 text 的定义

image_name = "J2ojU.png" # or whatever appropriate
text = pytesseract.image_to_string(Image.open(image_name), lang='eng', config='--psm 7')

【讨论】:

    【解决方案2】:

    有几个原因:

    1. 边缘不锋利且不连续(我所说的锋利是指光滑,而不是带齿)

    2. 图片太小,需要调整大小

    3. 字体丢失(不是强制性的,但经过训练的字体极大地提高了识别的可能性)

    基于第 1) 和 2) 点,我能够识别文本。

    1) 我将图像大小调整为 3 倍,2) 我对图像进行了模糊处理以使边缘平滑

    import pytesseract
    import cv2
    import numpy as np
    import urllib
    import requests
    pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract'
    from PIL import Image
    
    def url_to_image(url):
        resp = urllib.request.urlopen(url)
        image = np.asarray(bytearray(resp.read()), dtype="uint8")
        image = cv2.imdecode(image, cv2.IMREAD_COLOR)
        return image
    
    url = 'https://i.stack.imgur.com/J2ojU.png'
    
    img = url_to_image(url)
    
    
    
    retval, img = cv2.threshold(img,200,255, cv2.THRESH_BINARY)
    img = cv2.resize(img,(0,0),fx=3,fy=3)
    img = cv2.GaussianBlur(img,(11,11),0)
    img = cv2.medianBlur(img,9)
    cv2.imshow('asd',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    txt = pytesseract.image_to_string(img)
    print('recognition:', txt)
    >> recognition: Gm
    

    注意:

    此脚本适用于测试网络上的任何图像

    注2:

    所有处理均基于您发布的图片

    注3:

    文本识别并不容易。每次识别都需要特殊处理。如果您使用不同的图像尝试此步骤,它可能根本不起作用。重要的是尝试对图像进行大量识别,以便了解 tesseract 想要什么

    【讨论】:

    • 我将如何对存储在我计算机上的图像执行此操作?
    • 很抱歉,但目前这对我不起作用,因为文件在我的电脑上;在它起作用之前,我不会接受答案。感谢您对我的帮助,但感觉就像您试图用有效的答案换取声誉。
    • 你可以用 img = cv2.imread('image.jpg', cv2.IMREAD_COLOR) 而不是 img= Image.open('image.jpg') ...继续使用 cv2 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多