Получение ограничивающего прямоугольника распознанных слов с помощью python-tesseract

Я использую python-tesseract для извлечения слов из изображения. Это оболочка Python для tesseract, которая представляет собой код 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

Это возвращает только слова, а не их местоположение / размер / ориентацию (или, другими словами, ограничивающий прямоугольник, содержащий их) на изображении. Мне было интересно, есть ли способ получить это также

8 ответов

Решение

tesseract.GetBoxText() Метод возвращает точную позицию каждого символа в массиве.

Кроме того, есть опция командной строки tesseract test.jpg result hocr это будет генерировать result.html файл с координатами каждого распознанного слова в нем. Но я не уверен, что это можно вызвать через скрипт Python.

Использование 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() это то, что вы ищете.

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)

Используя приведенный ниже код, вы можете получить ограничивающий прямоугольник, соответствующий каждому символу.

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)

Чтобы ограничить слова рамками:

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)

Будет комментировать под lennon310, но не хватает репутации, чтобы комментировать...

Чтобы запустить его команду командной строки tesseract test.jpg result hocr в скрипте Python:

from subprocess import check_call

tesseractParams = ['tesseract', 'test.jpg', 'result', 'hocr']
check_call(tesseractParams)

На некоторые примеры даны ответы, которые можно использовать с pytesseract, однако для использования библиотеки python tesserocr вы можете использовать приведенный ниже код для поиска отдельных слов и их ограничивающих рамок:-

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

Как уже упоминалось, вы можете использовать pytesseractimage_to_boxes. Вы можете проверить мой репозиторий Docker Hub https://hub.docker.com/r/milanhlinak/tesseract-image-to-boxes — простое приложение Flask с Tesseract 5.0.0.

Другие вопросы по тегам