Авторские статьи Распознавания элементарных Captcha часть I

Discussion in 'Статьи' started by demonoid, 14 Oct 2007.

  1. demonoid

    demonoid Banned

    Joined:
    12 Jan 2007
    Messages:
    101
    Likes Received:
    111
    Reputations:
    27
    Распознавания элементарных CAPTCHA часть I

    I.Что такое CAPTCHA

    II.Элементарная CAPTCHA ( beeline.ua )
    1. Анализ
    2. Элементарные преобразования
    III.GD модуль ( Perl )
    1. Установка, описание
    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 )
    1. Анализ

    'Введите код, указанный на рисунке слева'.Слева указан рисунок с оранжевым фоном и фиксированным размером 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 области в которых находятся цифры
    1. Элементарные преобразования
    Рассмотрим всё цифры от 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 раз меньше чем было.
    
     
    30 people like this.
  2. demonoid

    demonoid Banned

    Joined:
    12 Jan 2007
    Messages:
    101
    Likes Received:
    111
    Reputations:
    27
    III.GD модуль ( Perl )
    1. Установка, описание

    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ли можно перенесите в раздел 'Наши Статьи'
     
    #2 demonoid, 14 Oct 2007
    Last edited: 14 Oct 2007
    5 people like this.
  3. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    отличная статья.. классно оформлена и, что самое главное, интересная тема - сам все хотел поработать в данном направлении (распознование образов), но все руки пока не доходили.. ) буду ждать в продолжении описание более интересных и продвинутых техник распознования каптчи..

    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 - поправьте.. )
     
  4. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    классное оформление, а вот сама статья об обычном эталонном сравнение с естественной оптимизацией. буду ждать продолжения.
     
  5. Talisman

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

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    оформление порадовало, а алгоритм самый элементарный =/
     
  6. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    Я дела с распознаванием образов не имел еще, было весьма интересно
     
  7. demonoid

    demonoid Banned

    Joined:
    12 Jan 2007
    Messages:
    101
    Likes Received:
    111
    Reputations:
    27
    Выбрал перл т. к недостаточно знаний в си++.
    нейронные сети ммм, я подумаю об этом :)
     
    1 person likes this.
  8. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    Автор молодец. понравилось то как идет рспознавание, подход индивидуальный )
     
  9. -Hormold-

    -Hormold- Кто, если не ты?

    Joined:
    29 Sep 2007
    Messages:
    418
    Likes Received:
    290
    Reputations:
    44
    А возможно такое на php?
     
  10. ЛифчиС5СВ

    ЛифчиС5СВ Elder - Старейшина

    Joined:
    9 Mar 2007
    Messages:
    164
    Likes Received:
    141
    Reputations:
    12
    РЕСПЕКТ! ;) Для регистрации в каталогах людям, занимающимся оптимизацией и раскруткой сайтов, весьма полезно ;)
     
  11. Xszz

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

    Joined:
    23 Apr 2007
    Messages:
    141
    Likes Received:
    42
    Reputations:
    9
    ppm Говорит , что нет пакета GD . Как быть ?
     
  12. Xszz

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

    Joined:
    23 Apr 2007
    Messages:
    141
    Likes Received:
    42
    Reputations:
    9
    Разобрался :)
     
    1 person likes this.
  13. Xszz

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

    Joined:
    23 Apr 2007
    Messages:
    141
    Likes Received:
    42
    Reputations:
    9
    можно ли распозновать Gif картинку , она тоже простейшая ? на белом фоне красные цифры .
    размер 60х20 . Чем можно разбить картинку на подобную диаграмму чтоб вычислить координаты пикселей . Зависит ли цвет фона \ цифр при исчислении ?
    спасибо
     
  14. Shred

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

    Joined:
    22 May 2006
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Можно, как грит вики библиотека GD входит в стандартную поставку интерпретатора PHP 4.3, так что осталось просто переписать скриптец на пхп :)
     
  15. vvs777

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

    Joined:
    16 Nov 2004
    Messages:
    394
    Likes Received:
    213
    Reputations:
    4
    Можно. Открываешь ее в тотал коммандере в листере - там при наведении мыши внизу координаты пишутся. В принципе под это и пейнт пойдет. наводишься, запоминаешь координаты, чикаешь картинку, распознаешь начиканное. Все лучше перегнать в ч/б изображение - так удобнее считать.

    в пхп гд тоже есть так что можно. Я вообще этими делами на Дельфях занимаюсь.
     
    1 person likes this.
  16. demonoid

    demonoid Banned

    Joined:
    12 Jan 2007
    Messages:
    101
    Likes Received:
    111
    Reputations:
    27

    Тренировался в написании модулей ( классов )


    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
    
     
    1 person likes this.