Распознавание капчи (CAPTCHA)

Другое   27 Сентябрь 2010  Автор статьи: admin 

Сегодня речь пойдет о капчах. Капча на сегодняшний день — это достаточно привычный элемент интерфейса практически каждого сайта. Капчи обычно устанавливают при отправке какого-либо комментария, поста на форуме, или при регистрации. И служат они для предотвращения спама, т.к. предполагается, что ввести такую капчу может только человек. Но что делать, если нам необходимо программно выполнять какую-либо операцию на сайте большое количество раз и при этом вводя капчу? Конечно, можно сделать, чтобы человек вводил капчу, но ведь все-таки можно попробывать и автоматизировать распознавание капчи? Конечно, можно! Правда не все капчи поддаются распознаванию. Например такие:

И такие капчи сейчас действительно невозможно распознать, а вот попроще уже можно:

Именно такие капчи мы сейчас и научимся распознавать.

Давайте внимательно рассмотрим слабые места этой капчи:

  1. Решетка у этой капчи фиксированной формы и цвета
  2. На капче используются только цифры и они одинакового размера и шрифта
  3. Линии фиксированного цвета

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

Сначала отделим сетку. Т.к. сетка и линии (шум) оттенков серого цвета, то можно сказать что у такого пикселя R=G=B — это свойство серого цвета пикселя. Запуская двойной цикл for  с обходом от X,Y до X1, Y1 капчи и закрашивая белым цветом пиксели, у которых можно выявить равенство R=G=B мы получаем такое изображение:

Теперь мы видим, что у нас остались одиночные пиксели. В них не соблюдается правило R=G=B, т.к. они образовались в результате JPEG форматировнания. Их удалить просто: если соседние пиксели у данного пикселя белые, то и этот закрашиваем белым. В результате должно получиться:

Теперь можно перевести изображение в бинарный вид. Получится:

Теперь, зная что всего на капче 4 цифры, мы можем определить границы каждой цифры. Найти эти границы тоже просто: мы можем запустить цикл for и слева на право, отслеживая пробелы между цифрами. С этим проблем возникнуть не должно. Получение границ нужно для отделения каждой цифры из капчи в свой TBitmap. Схематично границы цифр должны получиться так:

Получив границы, можем приступить к сравнению по эталону. В папке с программой у нас будут храниться эталоны, подготовленные заранее. По этим эталонам мы будем сравнивать на соответствия пиксели каждой цифры (каждый TBitmap) со всеми десятью эталонами (0,1,2,3,4,5,6,7,8,9) и наиболее подхящий эталон будем присваивать. В результате мы получим каждую цифру, но уже в текстовом виде. Это и есть результат распознавания капчи. На сайте http://www.captcha.ru/breakings/ вы можете еще прочитать о способах распознавания 3 других видов капч. По принципу «отделение шума -> бинаризация -> сравнение с эталонами» устроены практически все алгоритмы распознавания капч. Надеюсь, урок оказался интересным и полезным! 😉

  • Александр

    А можно исходники?

    • http://cybern.ru/ Cyberexpert

      В рамках данной статьи описан лишь принцип распознавания.

  • Александр Герасименко

    а походу искодники могу дать стучи в скайп aleksandr01078 =))

Научиться программировать

  • на Delphi

  • на Java

  • на C++