Получение ограничивающего прямоугольника распознанных слов с помощью 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.