суббота, 29 мая 2010 г.

Распознавание captcha.

Решил я научиться распознавать самую простую капчу, какая только существует. Вот она:.  Это png-изображение с размерами 90x25.  То есть каждый символ занимает 18 пикселей, всего 5 символов. Весь алфавит этой капчи состоит из 16 символов: 0123456789abcdef. Таким образом мне пришлось собрать все картинки для этого алфавита, нарезать из них буковки, а затем склеить в одну картинку: . Ну и весь алгоритм сводится к тому, чтобы сравнивать все символы по очереди с алфавитом. Для этого я воспользовался библиотекой PIL:
from PIL import Image, ImageColor
def cmp_image(img1,img2):
    return list(img1.getdata()) == list(img2.getdata())
def decode(img):
    # Весь алфавит
    bigimg = Image.open(r"all.png")
    # Соответсвие букв изображениям
    alpha = "0123456789abcdef"
    res = ""
    for x in xrange(5):
        tmp = Image.new('RGB', (18, 25))
        tmp.paste( img.crop((x*18,0,x*18+18,25)))

        letter = "a"
        for y in xrange(16):
            ideal = Image.new('RGB', (18, 25))
            ideal.paste(bigimg.crop((y*18,0,y*18+18,25)))
            rms = cmp_image(ideal,tmp)
            if rms:
                letter = alpha[y]
                break
        res += letter
    return res
img = Image.open(r"e:\image.png")
print decode(img)

5 комментариев:

  1. А почему не
    for y in xrange(len(alpha)):

    ?

    ОтветитьУдалить
  2. На скорую руку. Не было нужды в обобщении пока=)

    ОтветитьУдалить
  3. Ну чо, страшно это - с капчами работать? )

    ОтветитьУдалить
  4. Эт простая сильно, даж статьи не пришлось искать на тему распознавания, а вот всякие изгибающиеся пока пугают=)

    ОтветитьУдалить
  5. Вот поумнее алгоритм
    http://habrahabr.ru/blogs/artificial_intelligence/67194/

    ОтветитьУдалить