为啥 tesseract 无法从这个简单的图像中读取文本?

Posted

技术标签:

【中文标题】为啥 tesseract 无法从这个简单的图像中读取文本?【英文标题】: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()

【问题讨论】:

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

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 函数。

以上是关于为啥 tesseract 无法从这个简单的图像中读取文本?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Tesseract OCR 库(iOS)根本无法识别文本?

带有 Tesseract OCR 的 EmguCV 甚至无法识别二进制黑白单字符图像

为啥 Tesseract 数字识别无法正常工作?

Tesseract 无法读取这个极其简单的数字字符串

无法识别 Tesseract 中的数字 - android

如何使用图像的 tesseract 输出从另一个图像创建可搜索的 pdf