Мы легко понимаем текст на картинке, просто на неё взглянув. Однако, с компьютерам всё как‑то не так. Им нужна какая‑то мето́да или алгоритм. Здесь на помощь приходит Optical Character Recognition (OCR) или оптическое распознавание символов. Оптическое распознавание символовએ — это процесс обнаружения текстового содержимого на изображениях и преобразование его в машинно-кодированный текст, к которому мы можем получить доступ и манипулировать в Python (или любом другом языке программирования) как со строковой переменной. Для этого в нашем уроке мы будем использовать библиотеку .
Библиотека Tesseract содержит движок OCR и программу командной строки и она не имеет ничего общего с Python. Следуйте их , потому как это обязательный инструмент для наших упражнений.
Мы собираемся использовать для Python, который является оболочкой для движка Tesseract‑OCR, поэтому мы можем получить к нему доступ через Python. Самая последняя стабильная версия tesseract‑4, в которой используется новый механизм OCR на основе рекуррентной нейронной сети, recurrent neural network (LSTM), ориентированный на распознавание строк.
Приступим! Необходимо установить:
- Tesseract‑OCR Engine (следуйте для вашей операционной системы).
- Использующийся модуль оболочки pytesseract:
pip3 install pytesseract
- Другие служебные модули для нашего урока:
pip3 install numpy matplotlib opencv-python pillow
После того, как вы все установили на свой компьютер, откройте новый файл Python и запишите:
import pytesseract import cv2 import matplotlib.pyplot as plt from PIL import Image
В демонстрационных целях я буду использовать это изображение для распознавания:

Я назвал его «test.png» и поместил в текущий каталог, давайте загрузим это изображение:
# читать изображение с помощью OpenCV
image = cv2.imread("test.png")
# или вы можете использовать подушку
# image = Image.open("test.png")
Как вы могли заметить, загрузить изображение можно с помощью OpenCV или Pillow, я предпочитаю использовать OpenCV, поскольку он позволяет нам использовать живую камеру.
Давайте распознаем этот текст:
# получаем строку string = pytesseract.image_to_string(image) # печатаем print(string)
Примечание. Если приведенный выше код вызывает ошибку, рассмотрите возможность добавления двоичных файлов Tesseract‑OCR в переменные PATH. Прочтите их более внимательно.
Функция image_to_string() делает именно то, что вы ожидаете, она преобразует изображения, содержащие текст, в символы и давайте посмотрим на результат:
This is a lot of 12 point text to test the ocr code and see if it works on all types of file format. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox. The quick brown dog jumped over the lazy fox.
Отлично, есть еще одна функция image_to_data(), которая выводит больше информации, включая слова с соответствующими им шириной, высотой и координатами x, y, что позволит нам сделать много полезного. Например, найдем слова в документе и нарисуем ограничивающую рамку вокруг определенного слова по нашему выбору, приведенный ниже код делает это:
# чтобы нарисовать сделаем копию изображения image_copy = image.copy() # слово для поиска target_word = "dog" # получить все данные из изображения data = pytesseract.image_to_data(image, output_type=pytesseract.Output.DICT)
Итак, мы собираемся искать слово «dog» в текстовом документе и хотим, чтобы выходные данные были структурированными, а не «сырой» строкой. Поэтому я передал output_type в качестве словаря, чтобы мы могли легко получить данные каждого слова. (вы можете распечатать словарь данных, чтобы увидеть, как организован вывод).
Давайте найдём все случаи появления этого слова:
# получить все вхождения нужного слова word_occurences = [ i for i, word in enumerate(data["text"]) if word.lower() == target_word ]
Теперь нарисуем вокруг найденного слова рамку:
for occ in word_occurences:
# извлекаем ширину, высоту, верхнюю и левую позицию для обнаруженного слова
w = data["width"][occ]
h = data["height"][occ]
l = data["left"][occ]
t = data["top"][occ]
# определяем все точки окружающей рамки
p1 = (l, t)
p2 = (l + w, t)
p3 = (l + w, t + h)
p4 = (l, t + h)
# рисуем 4 линии (прямоугольник)
image_copy = cv2.line(image_copy, p1, p2, color=(255, 0, 0), thickness=2)
image_copy = cv2.line(image_copy, p2, p3, color=(255, 0, 0), thickness=2)
image_copy = cv2.line(image_copy, p3, p4, color=(255, 0, 0), thickness=2)
image_copy = cv2.line(image_copy, p4, p1, color=(255, 0, 0), thickness=2)
Сохраним и покажем полученное изображение:
plt.imsave("all_dog_words.png", image_copy)
plt.imshow(image_copy)
plt.show()
Удивительно, не правда ли? И это еще не все! Вы можете передать параметр lang функциям image_to_string() или image_to_data(), чтобы упростить распознавание текста на других языках, а не только на английском. Можно использовать функцию image_to_boxes(), которая распознает символы и границы их местоположения, пожалуйста, обратитесь к для получения дополнительной информации.
Обратите внимание: этот метод идеально подходит для распознавания текста в отсканированных документах и бумагах. Другие варианты использования OCR включают автоматизацию распознавания паспортов и извлечения из них информации, процессы ввода данных, обнаружение и распознавание автомобильных номеров и многое другое!
Кроме того, это не очень хорошо работает с рукописным текстом, сложными изображениями реального мира и нечеткими изображениями или изображениями, которые содержат не только текст.
Хорошо, но на сегодня это все. Подумайте, что вы можете сделать с помощью этой утилиты!
Проверено — мин нет
Как с помощью Python распознать текст в изображениях, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.
Респект и уважуха


