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

Why does tesseract fail to read text off this simple image?

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

图片如下:

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

要尝试的代码:

import pytesseract
from PIL import Image

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

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

有几个原因:

  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 想要什么

尝试

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')