为啥 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)根本无法识别文本?