FishHookПомоему с капчами как с криптографией - если не в теме, то будешь изобретать легко ломаемые велосипеды
Выглядит она трудноломаемой

Вот мой любительский подход:
берем PIL и пару фильтров:
from PIL import Image, ImageOps from ImageFilter import * WHITE = 255 BLACK = 0 MARGIN = 2 img = Image.open('capt.png').convert("RGB") # remove filled squares img = img.filter(MinFilter(3)).filter(CONTOUR) # to monochrome img = img.convert('1')

убираем линии:
pixels = img.load() vert_lines = set() horiz_lines = set() # get vertical lines for x in xrange(img.size[0]): if pixels[x, MARGIN] == BLACK: vert_lines.add(x) # get horizontal lines for y in xrange(img.size[1]): if pixels[MARGIN, y] == BLACK: horiz_lines.add(y) # remove lines for x_coord in vert_lines: for y in xrange(img.size[1]): pixels[x_coord, y] = WHITE for y_coord in horiz_lines: for x in xrange(img.size[0]): pixels[x, y_coord] = WHITE # cut off the border img = ImageOps.crop(img, border = MARGIN)

img = img.filter(MinFilter(9))

>tesseract img1.bmp con digits
Tesseract Open Source OCR Engine v3.01 with Leptonica
2560
Ну и с “мечтой дальтоника” - вставляем
img = Image.open('capt2.png').convert("RGB")
# remove filled squares
img = ImageOps.grayscale(img)
pixels = img.load()
for y in xrange(img.size[1]):
for x in xrange(img.size[0]):
if pixels[x,y] > WHITE / 2:
pixels[x,y] = WHITE
else:
pixels[x,y] = BLACK
img = img.filter(MinFilter(3)).filter(CONTOUR)

Правда фильтр придется немного подправить, но думаю что принцип ясен
