Как улучшить распознавание текста с помощью распознавания текста Pytesseract? - PullRequest
4 голосов
/ 10 марта 2020

Привет! Я хочу улучшить свою производительность с помощью pytesseract при распознавании ди git.

Я беру свое необработанное изображение и делю его на части, которые выглядят так:

Image1

Размер может варьироваться.

К этому я применяю некоторые методы предварительной обработки, например

image = cv2.imread(im, cv2.IMREAD_GRAYSCALE)
image = cv2.GaussianBlur(image, (1, 1), 0)
kernel = np.ones((5, 5), np.uint8)
result_img = cv2.blur(img, (2, 2), 0)
result_img = cv2.dilate(result_img, kernel, iterations=1)
result_img = cv2.erode(result_img, kernel, iterations=1)

, и я получаю это

Image2

Затем я передаю это Pytesseract:

num = pytesseract.image_to_string(result_img, lang='eng',
                                     config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')

Однако это не достаточно хорошо для меня и часто ошибается цифрами.

Я ищу способы улучшения, Я пытался сохранить это минимальным и самодостаточным, но дайте мне знать, если я не был ясен, и я уточню.

Спасибо.

1 Ответ

1 голос
/ 11 марта 2020

Вы на правильном пути, пытаясь предварительно обработать изображение перед выполнением OCR, но используя неправильный подход. Нет причин расширять или разрушать изображение, поскольку эти операции в основном используются для удаления мелких шумовых частиц. Кроме того, ваш текущий вывод не является двоичным изображением. Может показаться, что он содержит только черные и белые пиксели, но на самом деле это 3-канальное изображение BGR, поэтому, вероятно, вы получаете неправильные результаты распознавания. Если вы посмотрите на Улучшение качества Tesseract , вы заметите, что для оптимального распознавания текста Pytesseract необходимо предварительно обработать, чтобы требуемый текст для обнаружения был черным, а фон - белым . Чтобы сделать это, мы можем выполнить порог Оцу , чтобы получить двоичное изображение, а затем инвертировать его, чтобы текст находился на переднем плане. Это приведет к нашему предварительно обработанному изображению, где мы можем выбросить его в image_to_string. Мы используем опцию конфигурации --psm 6, чтобы принять единый блок текста. Взгляните на опции конфигурации , чтобы узнать больше настроек. Вот результаты:

Входное изображение -> Двоичный -> Инвертировать

enter image description here enter image description here enter image description here

Результат от Pytesseract OCR

8

Код

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

# Load image, grayscale, Otsu's threshold, invert
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
invert = 255 - thresh

# OCR
data = pytesseract.image_to_string(invert, lang='eng', config='--psm 6')
print(data)

cv2.imshow('thresh', thresh)
cv2.imshow('invert', invert)
cv2.waitKey()
...