我正在尝试在使用 Raspbian 的树莓派上使用 pytesseract 进行 OCR
我已经阅读了关于这个主题的几个问题,但找不到有效的答案,他们通常说用 pip 安装 pytesseract,我做到了。
我的代码很简单:
import pytesseract
from PIL import Image
print(pytesseract.image_to_string(Image.open('test.jpg')))
Run Code Online (Sandbox Code Playgroud)
但它返回错误消息:“ImportError: No module named 'pytesseract'。
我已经安装了 tesseract-ocr(whereis tesseract-ocr命令返回 /usr/share/tesseract-ocr)
我已经使用pip install tesseract安装了 pytesseract (它返回成功安装的 Pillow-4.3.0 olefile-0.44 pytesseract-0.1.7 ...但是whereis pytesseract命令没有返回任何东西 --> 一个问题?)。
你知道我遇到的问题吗?
我想从图像的特定区域提取文本,例如身份证中的名称和ID号。我要从中提取文本的ID卡是中文(中文ID卡)。我已经尝试过此代码,但是它只是提取了我不需要的地址和出生日期。我只需要姓名和身份证号码。
import cv2
from PIL import Image
import pytesseract
import argparse
import os
image = cv2.imread("E:/face.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
filename = "{}.png".format(os.getpid())
cv2.imwrite(filename,gray)
text = pytesseract.image_to_string(Image.open(filename), lang='chi_sim')
print(text)
os.remove(filename)
Run Code Online (Sandbox Code Playgroud)
显然,此图像非常清晰,因为它的清晰度很低并且不是真实的单词。但是,使用此代码,我无法检测到任何东西:
import pytesseract
from PIL import Image, ImageEnhance, ImageFilter
image_name = 'NedNoodleArms.jpg'
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.save(image_name)
text = pytesseract.image_to_string(Image.open(image_name))
print(text)
Run Code Online (Sandbox Code Playgroud)
输出
, Md?aod?amms
Run Code Online (Sandbox Code Playgroud)
这里有什么想法吗?我的对比功能生成的图像是:
哪个看起来不错?我没有大量的OCR经验。您会在这里建议什么预处理?我尝试过将图像调整为更大的尺寸,这有一点帮助,但还不够,还有一些来自PIL的不同滤镜。没什么特别接近的
python ocr image-recognition python-tesseract image-preprocessing
我正在努力处理一个项目,该项目从标签中获取非常清晰的字体图像,例如读取“文本区域”并使用 OCR tesseract 将其输出为字符串。
现在我在这件事上取得了相当大的进展,因为我添加了 varios 全局过滤器以获得非常清晰的结果,但我正在努力寻找仅过滤文本的方法,然后您必须考虑将其旋转为尽可能水平,然后简单的部分应该是裁剪它。
我是否可以在不使用训练数据和使系统罪过复杂化的情况下如何做到这一点,我只使用 rasdpberry pi 进行计算?
感谢您的帮助,这是我目前想到的:
原始图像(从 PiCamera 捕获):
去除阴影后的自适应阈值:
[![https://i.imgur.com/rqWoUsI.jpg[2]](https://i.imgur.com/rqWoUsI.jpg)
去除阴影后的 Glocad 残渣:
这是代码:
# import the necessary packages
from PIL import Image
import pytesseract
import argparse
import cv2
import os
import picamera
import time
import numpy as np
#preprocess = "tresh"
#Remaining textcorping and rotating:
import math
import json
from collections import defaultdict
from scipy.ndimage.filters import rank_filter
def dilate(ary, N, iterations):
"""Dilate using an NxN '+' sign shape. ary is np.uint8."""
kernel …Run Code Online (Sandbox Code Playgroud) 我只需要识别一个字母
但 OCR 无法识别它是否只是一个字母
在这种情况下,我试图识别字母 H 但没有显示任何内容
我该怎么做才能让它发挥作用?
from PIL import Image
from pytesseract import *
import cv2
img = cv2.imread('H.png',0)
edges = cv2.Canny(img,100,200)
img_new = Image.fromarray(edges)
text = pytesseract.image_to_string(img_new, lang='eng')
print (text)
Run Code Online (Sandbox Code Playgroud) 对于我当前的 ocr 项目,我尝试使用 tesserect 使用 python 封面 pytesseract 将图像转换为文本文件。到目前为止,我只是将非常直的图像传递到我的模块中,因为它能够正确地找出该图像中的文本。但是现在当我传递旋转的图像时,它甚至无法识别一个单词。所以为了获得好的结果,我只需要以正确的方向传递图像。现在我想知道有什么方法可以在将图像传递到 ocr 模块之前确定图像的方向。请让我知道我可以使用哪些方法来进行方向检查。
这是我用来进行转换的方法:
def images_to_text(testImg):
print('Reading images form the directory..........')
dataFile=[]
for filename in os.listdir(testImg):
os.chdir(testImg)
# Define config parameters.
# '-l eng' for using the English language
# '--oem 1' for using LSTM OCR Engine
config = ('-l eng --oem 1 --psm 3')
# Read image from disk
im = cv2.imread(str(filename), cv2.IMREAD_COLOR)
# Run tesseract OCR on image
text = pytesseract.image_to_string(im, config=config)
#basic preprocessing of the text
text = text.replace('\t',' …Run Code Online (Sandbox Code Playgroud) 我已经成功设置Tesseract并且可以将图像转换为文本...
text = pytesseract.image_to_string(Image.open(image))
Run Code Online (Sandbox Code Playgroud)
但是,我需要获得每一行的置信度值。我找不到使用pytesseract做到这一点的方法。有人知道怎么做吗?
我知道这可以使用PyTessBaseAPI,但我不能使用它,我花了几个小时试图设置它但没有运气,所以我需要一种使用pytesseract来做到这一点的方法。
我在 python 中使用以下代码:
我在字典中得到以下键值:
'block_num' 'conf' 'level' 'line_num' 'page_num' 'par_num', 'text', 'top', 'width', 'word_num', 'height, 'left'.
Run Code Online (Sandbox Code Playgroud)
这些关键值意味着什么
我试图在tesseract的官方文档中找到这些。如果您有一些解释相同的链接,请提供或解释它。
'block_num' 'conf' 'level' 'line_num' 'page_num' 'par_num', 'text', 'top', 'width', 'word_num', 'height, 'left'.
Run Code Online (Sandbox Code Playgroud) 上面是图片,我已经尝试了从 SO 或谷歌可以得到的一切,似乎没有任何效果。我无法获得图像中的确切值,我应该得到 2.10,但它总是得到 210。
并且不限于此图像,任何在数字 1 超正方体之前有小数的图像都会忽略小数值。
def returnAllowedAmount(self,imgpath):
th = 127
max_val = 255
img = cv2.imread(imgpath,0) #Load Image in Memory
img = cv2.resize(img, None, fx=2.5, fy=2.5, interpolation=cv2.INTER_CUBIC) #rescale Image
img = cv2.medianBlur(img, 1)
ret , img = cv2.threshold(img,th,max_val,cv2.THRESH_TOZERO)
self.showImage(img)
returnData = pytesseract.image_to_string(img,lang='eng',config='-psm 13 ' )
returnData = ''.join(p for p in returnData if p.isnumeric() or p == ".") # REMOVE $ SIGN
Run Code Online (Sandbox Code Playgroud) python opencv image-processing computer-vision python-tesseract
编辑:感谢 Nathancy,我忘记处理解决阅读问题的图像。仍然想知道是什么让 Tesseract 只读取未处理图像的顶部或底部线(相同的图像,两种不同的结果)
原始:
我有一个包含两行文本的图像:
pytesseract 的随机测试图像
当我使用 PIL Image 在 python (IDLE Python 3.6) 中打开图像并使用 pytesseract 提取字符串时,它只正确提取最后一行/底行。文本的上面一行是乱码。(参见下面的代码部分)
但是,当我使用 opencv 打开图像并使用 pytesseract 提取字符串时,它只正确提取顶部/上面的行,同时弄乱了第二个/文本的底行。(另请参见下面的代码部分)
这是代码:
>>> from PIL import Image, ImageFilter
>>> import pytesseract
>>> pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
>>> import cv2
>>> img = Image.open(r"C:\Users\user\MyImage.png")
>>> img2 = cv2.imread(r"C:\Users\user\MyImage.png", cv2.IMREAD_COLOR)
>>> print(pytesseract.image_to_string(img2))
Pet Sock has 448/600 HP left
A ae eee PER eats ae
>>> print(pytesseract.image_to_string(img))
Le TL
JHE has 329/350 HP left.
Run Code Online (Sandbox Code Playgroud)
pytesseract.image_to_boxes当我在两者上使用时img,img2 …
python-tesseract ×10
python ×7
tesseract ×6
opencv ×5
ocr ×4
python-3.x ×2
pytesser ×1
raspberry-pi ×1
text ×1