48

我正在使用 python-tesseract 从图像中提取单词。这是一个 tesseract 的 Python 包装器,它是一个 OCR 代码。

我正在使用以下代码来获取单词:

import tesseract

api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyz")
api.SetPageSegMode(tesseract.PSM_AUTO)

mImgFile = "test.jpg"
mBuffer=open(mImgFile,"rb").read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result

这仅返回图像中的单词而不是它们的位置/大小/方向(或换句话说,包含它们的边界框)。我想知道是否有任何方法可以得到它

4

8 回答 8

102

利用pytesseract.image_to_data()

import pytesseract
from pytesseract import Output
import cv2
img = cv2.imread('image.jpg')

d = pytesseract.image_to_data(img, output_type=Output.DICT)
n_boxes = len(d['level'])
for i in range(n_boxes):
    (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow('img', img)
cv2.waitKey(0)

在返回的数据中pytesseract.image_to_data()

  • left是从边界框的左上角到图像左边界的距离。
  • top是从边界框的左上角到图像上边框的距离。
  • width是边界框的宽度和height高度。
  • conf是模型对该边界框中单词的预测的置信度。如果conf为 -1,则表示相应的边界框包含一个文本块,而不仅仅是一个单词。

pytesseract.image_to_boxes()附上字母返回的边界框,所以我相信pytesseract.image_to_data()这就是您要查找的内容。

于 2019-01-06T06:23:07.203 回答
17

tesseract.GetBoxText()方法返回数组中每个字符的确切位置。

此外,还有一个命令行选项tesseract test.jpg result hocr可以生成一个result.html文件,其中包含每个已识别单词的坐标。但我不确定它是否可以通过python脚本调用。

于 2013-12-30T02:18:22.593 回答
15

Python tesseract可以在不写入文件的情况下执行此操作,使用以下image_to_boxes函数:

import cv2
import pytesseract

filename = 'image.png'

# read the image and get the dimensions
img = cv2.imread(filename)
h, w, _ = img.shape # assumes color image

# run tesseract, returning the bounding boxes
boxes = pytesseract.image_to_boxes(img) # also include any config options you use

# draw the bounding boxes on the image
for b in boxes.splitlines():
    b = b.split(' ')
    img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2)

# show annotated image and wait for keypress
cv2.imshow(filename, img)
cv2.waitKey(0)
于 2018-04-20T12:16:29.977 回答
7

使用下面的代码,您可以获得与每个字符对应的边界框。

import csv
import cv2
from pytesseract import pytesseract as pt

pt.run_tesseract('bw.png', 'output', lang=None, boxes=True, config="hocr")

# To read the coordinates
boxes = []
with open('output.box', 'rb') as f:
    reader = csv.reader(f, delimiter = ' ')
    for row in reader:
        if(len(row)==6):
            boxes.append(row)

# Draw the bounding box
img = cv2.imread('bw.png')
h, w, _ = img.shape
for b in boxes:
    img = cv2.rectangle(img,(int(b[1]),h-int(b[2])),(int(b[3]),h-int(b[4])),(255,0,0),2)

cv2.imshow('output',img)
于 2017-07-13T11:45:50.803 回答
3

要获得单词的边界框:

import cv2
import pytesseract
img = cv2.imread('/home/gautam/Desktop/python/ocr/SEAGATE/SEAGATE-01.jpg')

from pytesseract import Output
d = pytesseract.image_to_data(img, output_type=Output.DICT)
n_boxes = len(d['level'])
for i in range(n_boxes):
    if(d['text'][i] != ""):
        (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imwrite('result.png', img)
于 2020-11-16T06:53:57.010 回答
2

上面回答了一些示例,可以与 pytesseract 一起使用,但是要使用 tesserocr python 库,您可以使用下面给出的代码来查找单个单词及其边界框:-

    with PyTessBaseAPI(psm=6, oem=1) as api:
            level = RIL.WORD
            api.SetImageFile(imagePath)
            api.Recognize()
            ri = api.GetIterator()
            while(ri.Next(level)):
                word = ri.GetUTF8Text(level)
                boxes = ri.BoundingBox(level)
                print(word,"word")
                print(boxes,"coords")
于 2020-05-05T12:56:10.763 回答
2

会在 lennon310 下发表评论,但没有足够的声誉发表评论......

tesseract test.jpg result hocr在 python 脚本中运行他的命令行命令:

from subprocess import check_call

tesseractParams = ['tesseract', 'test.jpg', 'result', 'hocr']
check_call(tesseractParams)
于 2018-10-18T18:21:04.627 回答
0

如前所述,您可以使用pytesseractimage_to_boxes. 您可以查看我的 Docker Hub 存储库https://hub.docker.com/r/milanhlinak/tesseract-image-to-boxes - 一个带有 Tesseract 5.0.0 的简单 Flask 应用程序。

于 2022-01-16T20:51:07.557 回答