понедельник, 10 февраля 2014 г.

Распознаем текст на Python

Несколько дней назад ко мне обратился мой друг с просьбой помочь в решении проблемы возникшей у него на работе. Друг работает на крупном промышленном предприятии в отделе автоматизации. Одна из систем находящаяся в ведении ихнего отдела занимается сбором статистики после чего формирует ежедневные отчеты в виде бинарного файла или jpeg-изображения подготовленного к распечатке. Для того чтобы получить эти данные в удобоваримом для обработки виде, предприятие-поставщик предлагает приобрести лицензию на отдельную утилиту для извлечения данных из бинарного файла за неприемлемо-большую сумму. Естественно этого делать никто не стал. Моему товарищу как самому молодому хотели вменить в обязанность ежедневно перенабирать данные с изображения. Но зачем делать руками то что можно автоматизировать.

Рассмотрев подробнее оба варианта входных данных я решил что реализовать распознавание изображение отчета будет и проще и быстрее. Ниже приведен фрагмент изображения требующий распознания.

Пример изображения которое должно быть распознано

На изображении использован моноширинный шрифт, посему было принято решение произвести простое распознавание по образцу. Для сличения была подготовлена база глифов.

Глифы


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


Пример изображения после коррекции

Далее зная размер глифов мы производим сличение простым перебором в цикле и конкатенируя полученные символы получаем искомый текст. Полный исходный код можно посмотреть в моем репозитории на github:

Dummy OCR

2 комментария:

  1. Вам нужны перцептивные хеши, в питоне они реализуются библиотекой imagehash.

    ОтветитьУдалить
    Ответы
    1. Можно было и функцию свертки использовать, она тоже достаточно проста. Но нужно было сделать быстро, и я решил не заморачиватся а использовать решение "в лоб" раз оно применимо здесь.

      Удалить