Нужен несложный OCR

Discussion in 'PHP' started by 4upakabr0, 23 Oct 2013.

  1. 4upakabr0

    4upakabr0 Member

    Joined:
    14 May 2008
    Messages:
    124
    Likes Received:
    23
    Reputations:
    0
    Привет, ачат!

    Кто-нибудь занимался распознованием текста с картинки?

    желательно Perl или PHP

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

    вот такое мне нужно распознать [​IMG]
     
  2. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    http://antigate.com/
     
  3. 4upakabr0

    4upakabr0 Member

    Joined:
    14 May 2008
    Messages:
    124
    Likes Received:
    23
    Reputations:
    0
    спасибо, но это проблему не решает - нужно гадать много и оффлайново
     
  4. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    как-то так:
    1) Чистим картинку
    Убираем шум. фоновый паттерн и прочую ерунду, чтоб не путалось под ногами. Подходов много (в одном Фотошопе фильтров штук десять наберется). многое, зависит от конкретики. Один из простейших подходов - медианный фильтр. То есть берем данный пиксел + его соседей и проводим "голосование" - светлые пиксели это голос за "белых". темные - за "черных" Кто победил, того цвет и ставим. В приведенном пример должно покатить;

    2) Нарезание на символы
    Разделяем картинку на отдельные картинки для каждой буквы. Это ключевой шаг - если тут ошибиться, то все. К сожалению задача эта сложная, как рекапчу нарезать . скажем. знают только гугль и [strike]русская радистка[/strike] хрумер. но тут задача попроще: находим вертикакльные пробелы (те полностью белые колонки пикселов), режем по ним, потом отрезаем белое пространство сверху и снизу.
    Нарезаные буквы растягиваем/искажаем так, чтоб они точно помещались в прямоугольник фиксировнного размера - это будет матрица с которой рабоатет собственно распознаватель. Чем больше матрица тем больше вычислений, чем меньше - тем меньше полезной информации, надо подобрать золотую середину

    3) Разпознавание образов. Опять таки для этого есть масса алгоритмов - сабж бескрайний. Важно очень собрать достаточную базу примеров, по которой настраивать алгоритм, с большой базой даже хреновый метод может взлететь, а без настройки даже лучшему ocr непонятно что делать
    Один довольно простой метод (тн Бейесовские веса):
    сначала смотрим сколько черных пикселей в каждой колонке и каждом столбце (напоминаю, что мы работаем с картинкой фиксированного размера). Получается две гистограммы.
    Заранее подсчитываем на тестовых примерах таблицу статсов для каждой колонки, столбца и возможного символа: "если в колонке X b черных пикселей, то в N случаях у нас "
    теперь при распознавании лезем в нашу таблицу и смотрим: в колонке 1 у нас набралось 5 черных пикселей, что в 140 тренировочеых примерах соответсвовало цифре 1, в 281 примерах - цифре 2 итп
    для каждой цифры берем "вес" = log(количества примеров). складываем вес по каждой цифре и по всем колонкам/строкам - выбираем победителя

    Тема широкая, по ней целые институтцкие курсы читают. Для затравки, конечно советую вики проштудировать, посмотреть на продукты типа
    https://code.google.com/p/tesseract-ocr/
    http://jocr.sourceforge.net/
    http://www.dc949.org/projects/stiltwalker/
    http://www.karlgroves.com/2013/02/09/list-of-resources-breaking-captcha/
    а дальше по обстоятельствам
     
    2 people like this.