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

问题描述 投票:1回答:2

我已经阅读了有关pytesseract的大量文章,但我无法从一幅简陋的简单图像中读取文字;它返回一个空字符串。

这里是图像:

TestImage

我已经尝试过缩放,灰度缩放,以及调整对比度,阈值化,模糊化,以及其他文章中所说的一切,但是我的问题是我不知道OCR想要更好地工作。是否需要文字模糊?高对比度?

尝试代码:

import pytesseract
from PIL import Image

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

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

python python-tesseract
2个回答
17
投票

尝试类似的方法

import pytesseract 
from PIL import Image 
import requests 
import io

response = requests.get('https://i.stack.imgur.com/J2ojU.png') 
text = pytesseract.image_to_string(Image.open(io.BytesIO(response.content)), 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')

17
投票

有几个原因:

  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想要的内容

© www.soinside.com 2019 - 2024. All rights reserved.