Распознавания элементарных CAPTCHA часть I I.Что такое CAPTCHA II.Элементарная CAPTCHA ( beeline.ua ) Анализ Элементарные преобразования III.GD модуль ( Perl ) Установка, описание IV.Реализация ( Perl ) I.Что такое CAPTCHA Очень кратко: CAPTCHA (от англ. «Completely Automated Public Turing test to tell Computers and Humans Apart» — полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей) — торговая марка Университет Карнеги — Меллона, компьютерный тест, используемый для того чтобы определить, человек ли использует систему. Термин появился в 2000 году. Основная идея теста: предложить пользователю такую задачу, которую легко решает человек, но которую невозможно (или крайне трудно) научить решать компьютер. В основном это задачи на узнавание образов. wiki(c) http://ru.wikipedia.org/wiki/CAPTCHA II.Элементарная CAPTCHA ( beeline.ua ) Анализ 'Введите код, указанный на рисунке слева'.Слева указан рисунок с оранжевым фоном и фиксированным размером 50x20. Это значит что высота картинки 20 пикселей, а ширина 50 пикселей. Пиксель (англ. pixel, сокр. от англ. PICture'S ELement, элемент изображения)— мельчайшая единица цифрового изображения в растровой графике. Он представляет собой неделимый объект прямоугольной (обычно квадратной) формы, обладающий определённым цветом. Любое растровое компьютерное изображение состоит из пикселей, расположенных по строкам и столбцам. Если изображение увеличить, вы увидите ряды пикселей. wiki(c)http://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D0%BA%D1%81%D0%B5%D0%BB Code: '------> Red [COLOR=Red]■[/COLOR] | 1 pixel +------> Green [COLOR=Green]■[/COLOR] | .------> Blue [COLOR=Blue]■[/COLOR] Три основных цвета, комбинация которых даёт цвет одного пикселя Рассмотрим, как будет выглядеть попиксельно 3-ка: Code: 0 x +-------------------► | | 0 1 2 3 4 5 6 7 ^ | 0 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ | | 1 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ | | 2 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] | | 3 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ | | 4 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 10 pxl | 5 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ | | 6 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] | | 7 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] | | 8 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] ■ | | 9 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ v | y ▼ <---- 8 pxl --- > оси x и у больше рисовать не буду, они были указаны для дальнейшей ориентации. 3-ка имеет формат 10 пикселей x 8 пикселей . Все остальные цифры имеют точно такой же формат (10х8) Схематически картинка целиком будет выглядеть так: Code: 8 pxl 1 pxl <---> <-> | | | | ^-- .---------------------------. | | .---. .---. .---. .---. | -- ^ 20 pxl | | | A | | B | | C | | D | | | 10 pxl | | | | | | | | | | | | | | '---' '---' '---' '---' | -- v v-- '---------------------------' | 50 xpl | <---------------------------> где A,B,C,D области в которых находятся цифры Элементарные преобразования Рассмотрим всё цифры от 0-9 Code: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 0 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 0 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 0 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 0 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 1 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 1 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 1 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 1 [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 1 ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 2 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 2 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 2 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 2 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 2 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 3 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 3 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 3 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 3 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 4 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 4 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 4 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 4 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 4 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 5 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 5 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 5 ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 5 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 5 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 6 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 6 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 6 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 6 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 7 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 7 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 7 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 7 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 8 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 8 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 8 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ 8 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 8 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] м ■ 9 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 9 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 9 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 9 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 9 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 0 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 0 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 0 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 0 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 1 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ 1 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 1 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 1 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 1 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 2 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ 2 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] ■ 2 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 2 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 2 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 3 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 3 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 3 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 3 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 4 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 4 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 4 ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 4 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 4 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 5 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 5 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 5 ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ 5 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 5 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 6 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 6 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 6 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ 6 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 6 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 7 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 7 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 7 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ 7 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 7 ■ [COLOR=Green]■[/COLOR] ■ ■ ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] 8 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 8 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 8 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ 8 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 8 ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ 9 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 9 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 9 [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ 9 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ 9 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ Посчитаем суммарное количество активных пикселей: *под активными пикселями подразумевается пиксели, попадающие в объем цифры. Code: [SIZE=4][B]q[/B][/SIZE][SIZE=1]0[/SIZE] = 36 [SIZE=4][B]q[/B][/SIZE][SIZE=1]1[/SIZE] = 27 [SIZE=4][B]q[/B][/SIZE][SIZE=1]2[/SIZE] = 32 [SIZE=4][B]q[/B][/SIZE][SIZE=1]3[/SIZE] = 31 [SIZE=4][B]q[/B][/SIZE][SIZE=1]4[/SIZE] = 35 [SIZE=4][B]q[/B][/SIZE][SIZE=1]5[/SIZE] = 37 [SIZE=4][B]q[/B][/SIZE][SIZE=1]6[/SIZE] = 39 [SIZE=4][B]q[/B][/SIZE][SIZE=1]7[/SIZE] = 26 [SIZE=4][B]q[/B][/SIZE][SIZE=1]8[/SIZE] = 40 [SIZE=4][B]q[/B][/SIZE][SIZE=1]9[/SIZE] = 39 Суммарное количество активных пикселей: [SIZE=1]9[/SIZE] [SIZE=5][B]∑[/B][/SIZE] qi = [U]742[/U] [SIZE=1]i=0[/SIZE] Пример: на изображении число 1000 ,посчитаем, сколько итераций нам понадобиться для распознавания этого изображения. *Под итерацией будем понимать один шаг цикла. Code: [SIZE=4][B]q[/B][/SIZE][SIZE=1]1[/SIZE] + [SIZE=4][B]q[/B][/SIZE][SIZE=1]0[/SIZE] + [SIZE=4][B]q[/B][/SIZE][SIZE=1]0[/SIZE] +[SIZE=4][B]q[/B][/SIZE][SIZE=1]0[/SIZE] = 27 + 36 + 36 + 36 = [U]135[/U] Для распознавание числа 1000 на изображение понадобиться 135 итераций Важно: В данном случае нету никаких помех, позиции цифр неизменны. Поэтому можно выделить характерные активные пиксели для каждой цифры. *под характерными активными пикселями подразумевается наличие 1-го или двух пикселей в объеме цифры . В итого анализа стало известно, что каждую цифру можно описать 1-м или 2-мя пикселями: Code: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 ■ ■ ■ ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ ■ ■ ■ 1 ■ ■ ■ ■ ■ ■ ■ ■ 1 ■ ■ ■ ■ ■ ■ ■ ■ 1 ■ ■ ■ ■ ■ ■ ■ ■ 1 [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ ■ 1 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 4 [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] 4 ■ ■ ■ ■ ■ ■ ■ ■ 4 ■ ■ ■ ■ ■ ■ ■ ■ 4 ■ ■ ■ ■ ■ ■ ■ ■ 4 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 8 ■ ■ ■ ■ ■ ■ ■ ■ 8 ■ ■ ■ ■ ■ ■ ■ ■ 8 ■ ■ ■ ■ ■ ■ ■ ■ 8 [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ ■ 8 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] 9 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] ■ 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] 0 ■ ■ ■ ■ ■ ■ ■ ■ 0 ■ ■ ■ ■ ■ ■ ■ ■ 1 [COLOR=Green]■[/COLOR] ■ ■ ■ ■ ■ ■ ■ 1 ■ ■ ■ ■ ■ ■ ■ ■ 1 ■ ■ ■ ■ ■ ■ ■ ■ 1 ■ ■ ■ ■ ■ ■ ■ ■ 1 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ ■ ■ ■ 2 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 3 ■ ■ ■ ■ ■ ■ ■ ■ 4 ■ ■ ■ ■ ■ ■ ■ ■ 4 [COLOR=Green]■[/COLOR] ■ ■ [COLOR=Green]■[/COLOR] ■ ■ ■ ■ 4 ■ ■ ■ ■ ■ ■ ■ ■ 4 ■ ■ [COLOR=Green]■[/COLOR] [COLOR=Green]■[/COLOR] ■ ■ ■ ■ 4 ■ ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] 5 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 5 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 6 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ ■ 7 ■ ■ ■ ■ ■ ■ ■ [COLOR=Green]■[/COLOR] 8 ■ ■ ■ ■ ■ ■ ■ ■ 8 ■ ■ ■ ■ ■ ■ ■ ■ 8 ■ ■ ■ ■ ■ ■ ■ ■ 8 ■ ■ ■ ■ ■ ■ ■ ■ 8 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ ■ ■ 9 ■ ■ ■ ■ ■ ■ ■ ■ Снова посчитаем суммарное количество характерных активных пикселей: Code: [SIZE=4][B]q[/B][/SIZE][SIZE=1]0[/SIZE] = [SIZE=4][B]q[/B][/SIZE][SIZE=1]1[/SIZE] = [SIZE=4][B]q[/B][/SIZE][SIZE=1]4[/SIZE] = [SIZE=4][B]q[/B][/SIZE][SIZE=1]5[/SIZE] = [SIZE=4][B]q[/B][/SIZE][SIZE=1]6[/SIZE] = [SIZE=4][B]q[/B][/SIZE][SIZE=1]8[/SIZE] = [SIZE=4][B]q[/B][/SIZE][SIZE=1]9[/SIZE] = 2 [SIZE=4][B]q[/B][/SIZE][SIZE=1]2[/SIZE] = [SIZE=4][B]q[/B][/SIZE][SIZE=1]7[/SIZE] = 1 Суммарное количество активных пикселей: [SIZE=1]9[/SIZE] [SIZE=5][B]∑[/B][/SIZE] qi = [U]16[/U] [SIZE=1]i=0[/SIZE] ~ 46 раз меньше чем было. Снова берём картинку с числом 1000 и считаем итерации: Code: [SIZE=4][B]q[/B][/SIZE][SIZE=1]1[/SIZE] + [SIZE=4][B]q[/B][/SIZE][SIZE=1]0[/SIZE] + [SIZE=4][B]q[/B][/SIZE][SIZE=1]0[/SIZE] +[SIZE=4][B]q[/B][/SIZE][SIZE=1]0[/SIZE] = 2 + 2 + 2 + 2 = [U]8[/U] ~ 16 раз меньше чем было.
III.GD модуль ( Perl ) Установка, описание GD — Библиотека для работы с графикой. для ознакомления можно почитать _http://ru.wikipedia.org/wiki/GD и _http://search.cpan.org/dist/GD/GD.pm Установка Для Active Perl : Code: C:\>ppm help NAME ppm - Perl Package Manager, version 4.01 SYNOPSIS Invoke the graphical user interface: ppm ppm gui Install, upgrade and remove packages: ppm install [--area <area>] [--force] <pkg> ...................... C:\>[COLOR=White]ppm gui[/COLOR] В графическом менеджере инсталлируем нужный пакет или же C:\>[COLOR=White]ppm install GD[/COLOR] можно и так Code: C:\>cpan cpan shell -- CPAN exploration and modules installation (v1.9102) ReadLine support enabled cpan> [COLOR=White]install GD[/COLOR] Способов много , у кого ошибки или не получается советую почитать _ http://forum.vingrad.ru/faq/topic-158272.html IV.Реализация ( Perl ) Проверяем установлен ли GD модуль Code: С:\>perl -e "[COLOR=White]use GD[/COLOR]" Ежели : Code: Can't locate GD.pm in @INC .... [COLOR=Red]Модуль[/COLOR] [COLOR=White]GD[/COLOR] [COLOR=Red]неустановлен ставте[/COLOR] Code: #!/usr/bin/perl -w use GD; use strict; use warnings; #Константы (RED,GREEN,BLUE) характеризуют активные пиксели use constant RED => 44; use constant GREEN => 18; use constant BLUE => 4; my $image = shift || exit print "\x09 bix_exemple.pl ~ / Beeline Image xek / \n". "\x09\x09\x09\x09 / by demonoid / \n". "\x09 specical for forum.antichat.ru / 13.10.2007 / \n\n". "\x09\x09 usage : $0 <image> \n". "\x09\x09 example : $0 5.jpg \n"; my ( $x,$y,$index,$xek_image,$r,$g,$b,$x_position,$y_position,$i,$count ) = ( undef,undef,undef,undef,undef,undef,undef,5,5,0,0 ); my $myImage = newFromJpeg GD::Image( $image ); my %Coordinates = ( '0' => [ '7:4', '0:4' ], '1' => [ '2:2', '3:2' ], '2' => [ '7:9' ], '3' => [ '0:1', '0:8' ], '4' => [ '5:2', '6:9' ], '5' => [ '0:0', '0:1' ], '6' => [ '3:4', '0:4' ], '7' => [ '7:0' ], '8' => [ '2:4', '3:4' ], '9' => [ '7:4', '7:7' ]) ; for(0..3) { for( $i = 0;$i<9;$i++ ) { for( my $k=0;$k<2;$k++ ) { if ( exists $Coordinates{ $i }[ $k ] ) { ( $x,$y ) = split( /\:/,$Coordinates{ $i }[ $k ] ); $index = $myImage->getPixel( $x+$x_position,$y+$y_position ); ( $r,$g,$b ) = $myImage->rgb( $index ); ( ( RED>=$r )&&( GREEN>=$g )&&( $b=BLUE ) )?$count++:1; } } if ( ( $count ==2 )||( $count ==1 )&&( $i==2 )||( $count ==1 )&&( $i==7 ) ) { $count = 0; last; } $count = 0; } $xek_image.=$i; $x_position+=9; } print "IMAGE: $xek_image \n"; Тестируем _http://beesms.beeline.ua/ Лентяям качаем пачку картинок _http://www.rapidshare.ru/429980 или _http://fileshare.in.ua/454150 или _http://upload.com.ua/get/899997654 Еcли можно перенесите в раздел 'Наши Статьи'
отличная статья.. классно оформлена и, что самое главное, интересная тема - сам все хотел поработать в данном направлении (распознование образов), но все руки пока не доходили.. ) буду ждать в продолжении описание более интересных и продвинутых техник распознования каптчи.. p.s. На ActivePerl установить GD можно отсюда: ppm install http://theoryx5.uwinnipeg.ca/ppms/GD.ppd (для версии perl 5.8) ppm install http://theoryx5.uwinnipeg.ca/ppmpackages/GD.ppd (для 5.6) p.p.s. форум кромсанул сорец в районе объявления переменной $y_position - поправьте.. )
классное оформление, а вот сама статья об обычном эталонном сравнение с естественной оптимизацией. буду ждать продолжения.
РЕСПЕКТ! Для регистрации в каталогах людям, занимающимся оптимизацией и раскруткой сайтов, весьма полезно
можно ли распозновать Gif картинку , она тоже простейшая ? на белом фоне красные цифры . размер 60х20 . Чем можно разбить картинку на подобную диаграмму чтоб вычислить координаты пикселей . Зависит ли цвет фона \ цифр при исчислении ? спасибо
Можно, как грит вики библиотека GD входит в стандартную поставку интерпретатора PHP 4.3, так что осталось просто переписать скриптец на пхп
Можно. Открываешь ее в тотал коммандере в листере - там при наведении мыши внизу координаты пишутся. В принципе под это и пейнт пойдет. наводишься, запоминаешь координаты, чикаешь картинку, распознаешь начиканное. Все лучше перегнать в ч/б изображение - так удобнее считать. в пхп гд тоже есть так что можно. Я вообще этими делами на Дельфях занимаюсь.
Тренировался в написании модулей ( классов ) Code: package BOCR; use strict; use GD; use constant { RED => 44, GREEN => 18, BLUE => 4, }; my %c = ( 0 => '7:4,0:4' , 1 => '2:2,3:2' , 2 => '7:9' , 3 => '0:1,0:8' , 4 => '5:2,6:9' , 5 => '0:0,0:1' , 6 => '3:4,0:4' , 7 => '7:0' , 8 => '2:4,3:4' , 9 => '7:4,7:7' , ); sub new { my $class = shift; my $self = { DEBUG => 0, NAME => undef, @_, }; return bless $self, $class; } sub recognition { my $self = shift; unless ( defined $self->{ NAME } ){ $self->{ NAME } = shift ; } my $count = 0; my $image = GD::Image->newFromJpeg( $self->{ NAME } ); for ( my $x0 = 5; $x0 <= 41; $x0 += 9 ) { print "\t\tНачало новой позиции цифры \n\n" if $self->{ DEBUG }; foreach my $n ( sort keys %c ) { print " Цифра : #$n\n\n" if $self->{ DEBUG }; foreach ( split ',',$c{$n} ) { my ( $x,$y ) = split ':'; print "Координаты : x = $x y = $y ; " if $self->{ DEBUG }; my ( $r,$g,$b ) = $image->rgb( $image->getPixel( $x+$x0,$y+5 ) ); print "RGB : r = $r g = $g b = $b\n" if $self->{ DEBUG }; if ( ( RED>=$r )&&( GREEN>=$g )&&( $b=BLUE ) ){ $count++; print "Совпадение #$count : цифра #$n ; координаты : x = $x y = $y \n" if $self->{ DEBUG }; } if ( ( $count == 2 ) || ( $count == 1 ) && ( $n == 2 ) || ( $count == 1 ) && ( $n == 7 ) ){ $count = 0; print "Найдена цифра : '$n' \n" if $self->{ DEBUG }; $self->{ NUMBER } .= $n; last; } } $count = 0; print "\n" if $self->{ DEBUG }; } } print "Результат : $self->{ NUMBER }\n" if $self->{ DEBUG }; return $self->{ NUMBER }; } 1; Использывать примерно так : Code: #!/usr/bin/perl -w use strict; use BOCR; my $i = new BOCR( DEBUG => 1, # можно и без отладки =] NAME => 'b.jpeg' ); print $i->recognition; Пример отладки : Code: $ perl b.pl Начало новой позиции цифры Цифра : #0 Координаты : x = 7 y = 4 ; RGB : r = 236 g = 198 b = 68 Координаты : x = 0 y = 4 ; RGB : r = 28 g = 14 b = 4 Совпадение #1 : цифра #0 ; координаты : x = 0 y = 4 ..... Цифра : #6 Координаты : x = 3 y = 4 ; RGB : r = 36 g = 14 b = 4 Совпадение #1 : цифра #6 ; координаты : x = 3 y = 4 Координаты : x = 0 y = 4 ; RGB : r = 28 g = 14 b = 4 Совпадение #2 : цифра #6 ; координаты : x = 0 y = 4 Найдена цифра : '6' ..... Результат : 6099