Решил я научиться распознавать самую простую капчу, какая только существует. Вот она:
. Это png-изображение с размерами 90x25. То есть каждый символ занимает 18 пикселей, всего 5 символов. Весь алфавит этой капчи состоит из 16 символов: 0123456789abcdef. Таким образом мне пришлось собрать все картинки для этого алфавита, нарезать из них буковки, а затем склеить в одну картинку:
. Ну и весь алгоритм сводится к тому, чтобы сравнивать все символы по очереди с алфавитом. Для этого я воспользовался библиотекой PIL:
. Это 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)