Как с помощью Python распознать текст в изображениях

Мы легко понимаем текст на картинке, просто на неё взглянув. Однако, с компьютерам всё как‑то не так. Им нужна какая‑то мето́да или алгоритм. Здесь на помощь приходит Optical Character Recognition (OCR) или оптическое распознавание символов. Оптическое распознавание символов — это процесс обнаружения текстового содержимого на изображениях и преобразование его в машинно-кодированный текст, к которому мы можем получить доступ и манипулировать в Python (или любом другом языке программирования) как со строковой переменной. Для этого в нашем уроке мы будем использовать библиотеку Tesseract.

Библиотека Tesseract содержит движок OCR и программу командной строки и она не имеет ничего общего с Python. Следуйте их официальному руководству по установке, потому как это обязательный инструмент для наших упражнений.

Мы собираемся использовать модуль pytesseract для Python, который является оболочкой для движка Tesseract‑OCR, поэтому мы можем получить к нему доступ через Python. Самая последняя стабильная версия tesseract‑4, в которой используется новый механизм OCR на основе рекуррентной нейронной сети, recurrent neural network (LSTM), ориентированный на распознавание строк.

Приступим! Необходимо установить:

  • Tesseract‑OCR Engine (следуйте руководству по Tesseract для вашей операционной системы).
  • Использующийся модуль оболочки 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 включают автоматизацию распознавания паспортов и извлечения из них информации, процессы ввода данных, обнаружение и распознавание автомобильных номеров и многое другое!

Кроме того, это не очень хорошо работает с рукописным текстом, сложными изображениями реального мира и нечеткими изображениями или изображениями, которые содержат не только текст.

Хорошо, но на сегодня это все. Подумайте, что вы можете сделать с помощью этой утилиты!

Проверено How to Recognize Optical Characters in Images in Python — мин нет

Print Friendly, PDF & Email

CC BY-NC 4.0 Как с помощью Python распознать текст в изображениях, опубликовано К ВВ, лицензия — Creative Commons Attribution-NonCommercial 4.0 International.


Респект и уважуха

Добавить комментарий