Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Moguta.CMS v.2.1.0 || PHP Автоматическое исправление неправильной раскладки строки >>>

Распознавание капчи php

31.12.2012
Распознавание капчи php

Здравствуйте, уважаемые читатели блога LifeExample, в данном посте я хочу показать как может выглядеть скрипт Pраспознавание капчи php.

Все мы привыкли ежедневно видеть, на самых разнообразных ресурсах интернета, картинки, надписи на которых нас просят вписать в специальное поле формы, перед каким либо действием, к примеру, перед скачиванием файлов или отправкой сообщений. Такие картинки называются капчами, подробнее о происхождении этого термина можно прочесть в моей статье "Капча на PHP".

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

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

Как действовать при распознавании капчи

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

Под примитивной капчей понимается картинка с монотонным фоном, на которой изображено трехзначное число. Число всегда выводится в одном шрифте и не имеет коэффициента искажения.

Пример примитивной капчи:

Примитивная капча

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

Как видите можно выделить ряд условий формирования этой картинки:

  • Шрифт всегда одинаковый.
  • Высота цифр одинаковая.
  • Между цифрами существует пустота минимум в 2 px.

Алгоритм распознавания такой капчи не требует знаний о нейронных сетях и может выглядеть так:

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

Распознавание цифр с картинки по шагам.

Переводим картинку в бинарную матрицу (1 шаг)

Капча в бинарном виде на php

Вычисляем интервалы содержащие цифры (2 шаг )

Складываем построчно все столбцы, получаем строку:

Вычисление интервалов

По полученной строке можно вычислить интервалы, задающие положение цифр.

Распознавание цифр с капчи

Теперь мы знаем, что столбцы матрицы с индексами в интервалах [1,15], [18,32], [35,49] содержат цифры.

Вычисляем количество пикселей для каждой цифры (шаг 3)

Складываем все единицы в найденных интервалах, получаем:

  • [1,15] = 215 единиц;
  • [18,32] = 213 единиц;
  • [35,49] = 184 единиц.

Подсчет количества пикселей для всех возможных цифр (шаг 4)

Скачиваем несколько вариаций капчи, которые содержат все цифры от 0 до 9.

Затем необходимо вычислить количество пикселей для каждой из цифр [1234567890].

Например, подсчитав пиксели в цифре восемь — получим 215 шт.

подсчет пикселей для скрипта распознавания капчи на php

Вычислив вручную или же с помощью скрипта пиксели, для каждой из цифр получим такую таблицу:

таблица соответствий количества пикселей к цифрам для капчи на php

Теперь зная сколько пикселей содержится в каждой из цифр, мы можем распознать капчу, и то что написано на картинке.

Распознали капчу с помощью php

В результате у меня получился скрипт который с 100% вероятностью распознает числа на картинках данной капчи:

Результат работы скрипта распознавания капчи

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

Скрипт "Распознавание капчи php" ( Скачали: 3681 чел. ) 

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Игорь

    Спасибо!

  • Саша

    спасибо за скрипт , он умеет рсзпознавать буквы или нет ? , вот
    мой скайп aleksandr01078

    • Нет, скрипт только цифры распознает, но по аналогии можно сделать и с буквами.

  • Максим

    Mark — нужна помощь ваша, у меня есть ява скрипт что распознаёт в одной игре буквы , счас туда ввели цифры нужно немного подправить его , скрипт и капчи скинуть могу , если сможете помочь напишите мне в скайп желательно tanchik2616 могу заплатить но немного .

  • А как перевести картинку в бинарную матрицу?

    • В коде есть функция для этого.

  • Павел

    Ты гений! Дружище! Если у меня когда-нибудь появится возможность выпить с тобой пива, я тебя обязательно угощу, большое спасибо! То что мне надо!

  • Vasil

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

  • у меня только разгадывает ваши картинки но не показывает бинарную матрицу

    • В скрипте есть метод для вывода матрицы.

  • Demon

    как вывести матрицу приведите пример

  • Lesha

    Извините за глупый вопрос, но как запустить этот скрипт на сайте?

  • Алексей

    а как сделать, чтобы он распознавал любую капчу из данных?
    чтобы каждый раз не переписывать скрипт

  • SunriZe

    Огроменнейшее спасибо! Вы грамотно придумали идею и грамотно все объяснили и ваш код отличная основа для дальнейшего развития парсера изображений.

  • Сергей

    Умеет ли скрипт определять координаты цифр на картинке?
    Например 126px по горизонтали 56px по вертикали от левого верхнего угла.
    Нужно расставить дивки над картинками, а именно над числами. В каждой картинке от 1 до 30 чисел.

  • Dddo

    Цифра 6 и цифра 9 имеют одинаковую бинарную матрицу, что с этим можно придумать?

  • Алексей

    А как сделать перевод картинки в бинарную матрицу на javascripte
    . В php я не очень шарю. Возможно есть модули на node js или легковесные програмки?

  • Оставить комментарий

    Подписаться на комментарии к этой статье по RSS

    Размещение статей и контекстных ссылок
    Яндекс.Метрика