Обнаружение и извлечение текста из изображения с помощью Python

Из этой статьи вы узнаете о способах извлечения текста из цифровых изображений с использованием python и библиотеки pytesseract. Изображение должно иметь текст внутри, чтобы получить выходной текст.

Для извлечения текста с помощью pytesseract необходимо установить библиотеки в среду системы. Приведенные ниже команды помогут установить необходимые библиотеки в системе.

Команда для установки библиотеки OpenCV:

pip install opencv-python

Команда для установки библиотеки pytesseract-ocr:

pip install pytesseract

Необходимо также установить конфигурационный файл tesseract, чтобы получить файл tesseract.exe по следующей ссылке:

https://github.com/UB-Mannheim/tesseract/wiki

Скачайте вышеуказанный файл в соответствии с конфигурацией системы, затем установите его. Файл tesseract.exe будет располагаться по следующему пути:

C:\Program Files\Tesseract-OCR\tesseract.exe"

Посмотрим на входное изображение, из которого нужно извлечь текст:

Входное изображение. Картинка автора

На этом примере рассмотрим способ извлечения текста из полутонового изображения, а на следующем примере  —  из цветного изображения с ограничительной рамкой.

Извлечение текста из полутонового изображения

Для начала импортируем необходимые библиотеки:

from PIL import Image
from pytesseract import pytesseract

Теперь будем использовать библиотеку pillow для открытия/чтения изображения:

image = Image.open('ocr.png')
image = image.resize((400,200))
image.save('sample.png')

Примечания:

  1. Метод open используется для чтения изображения из рабочего каталога.
  2. Метод resize используется для изменения размера изображения.
  3. Метод save используется для сохранения изображения после изменения размера.

Определим путь к бинарному файлу tesseract, как показано ниже:

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

Пришло время использовать метод image_to_string класса tesseract для извлечения текста из изображения:

text = pytesseract.image_to_string(image)

#печать текста построчно
print(text[:-1])

Обнаружение и извлечение текста из цветного изображения

На этот раз будем извлекать текст из цветного изображения. Образец цветного изображения показан ниже.

Входное изображение. Картинка автора

В этом примере будем использовать ограничительную рамку и другие методы OpenCV.

Установите необходимые библиотеки:

import cv2
from pytesseract import pytesseract

Теперь определим путь к бинарному файлу tesseract, как показано ниже:

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

Чтение изображения с помощью метода OpenCV:

img = cv2.imread("color_ocr.png")

Преобразование цветного изображения в полутоновое для лучшей обработки текста:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Теперь преобразуем полутоновое изображение в бинарное, чтобы повысить вероятность извлечения текста:

ret, thresh1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU |
cv2.THRESH_BINARY_INV)
cv2.imwrite('threshold_image.jpg',thresh1)

Здесь метод imwrite используется для сохранения изображения в рабочем каталоге.

Бинарное изображение. Картинка автора

Чтобы задать размер предложений или даже слов изображения, понадобится метод структурных элементов в OpenCV с размером ядра в зависимости от площади текста:

rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (12, 12))

Следующий шаг — применение метода расширения двоичного изображения для получения границ текста:

dilation = cv2.dilate(thresh1, rect_kernel, iterations = 3)
cv2.imwrite('dilation_image.jpg',dilation)
Операция расширения изображения. Картинка автора

Можно увеличить число итераций в зависимости от пикселей переднего плана, т.е. белых пикселей, чтобы получить правильную форму ограничительной рамки.

Теперь воспользуемся методом find contour для получения площади белых пикселей.

contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)

Чтобы выполнить некоторые операции с изображением, скопируйте его в другую переменную:

im2 = img.copy()

Теперь пришло время магического преобразования изображения. Для этого получим координаты области белых пикселей и нарисуем вокруг нее ограничительную рамку, а также сохраним текст с изображением в текстовый файл:

for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)

# Рисуем ограничительную рамку на текстовой области
rect=cv2.rectangle(im2, (x, y), (x + w, y + h), (0, 255, 0), 2)

# Обрезаем область ограничительной рамки
cropped = im2[y:y + h, x:x + w]

cv2.imwrite('rectanglebox.jpg',rect)

# открываем текстовый файл
file = open("text_output2.txt", "a")

# Использование tesseract на обрезанной области изображения для
получения текста
text = pytesseract.image_to_string(cropped)

# Добавляем текст в файл
file.write(text)
file.write("\n")

# Закрываем файл
file.close

Вывод изображения с ограничительной рамкой.

Ограничительная рамка на тексте. Картинка автора

Результат работы с текстовым файлом.

Извлеченный текст в файле. Картинка автора

Учтите следующую закономерность: если число итераций равно 1, то текст не сохраняется в текстовом файле; результат получается после увеличения числа итераций до 3.

Если код работает правильно, но результат не выводится, проверьте или измените размер ядра и число итераций.

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

crop_number=0 
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)

# Рисуем ограничительную рамку на текстовой области
rect = cv2.rectangle(im2, (x, y), (x + w, y + h), (0, 255, 0), 2)

# Обрезаем область ограничительной рамки
cropped = im2[y:y + h, x:x + w]

cv2.imwrite("crop"+str(crop_number)+".jpeg",cropped)
crop_number+=1

cv2.imwrite('rectanglebox.jpg',rect)

# открываем текстовый файл
file = open("text_output2.txt", "a")

# Использование tesseract на обрезанной области изображения для
получения текста
text = pytesseract.image_to_string(cropped)

# Добавляем текст в файл
file.write(text)
file.write("\n")

# Закрываем файл
file.close
Извлечение многократного кадрирования изображения. Картинка автора

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Amit Chauhan, Text Detection and Extraction From Image with Python

Предыдущая статьяЧто такое React.memo и как он работает
Следующая статьяКак стать специалистом по обработке данных: 5 советов