Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 10, 2012 20:12:38

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

Оцените капчу

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)
получаем на выходе (перед фильтром)

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

Отредактировано EBFE (Авг. 10, 2012 23:39:12)

Офлайн

#2 Авг. 14, 2012 12:13:20

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Оцените капчу

А теперь проходимся по нижним и правым, или левым пикселям картинки. Вычисляем размер сетки и гамму. В принципе не важно будет это черно-белым, или цветным, это усложнение для людей.
Затем наносим сетку на картинку и вычитаем. Получаем исходные символы.
Т.к. символы имеют хорошо выраженный пробел, их легко разделить. А дальше уже дело техники. Хоть нейронные сети, хоть векторные множества. Хотя лично я попытался бы упростить до расчета плотности в разных частях символа. Думаю такой шрифт можно определять с высокой точностью.

Надо больше искажений исходного текста.



Офлайн

#3 Сен. 10, 2012 16:46:10

DHT
От:
Зарегистрирован: 2009-09-24
Сообщения: 119
Репутация: +  0  -
Профиль   Отправить e-mail  

Оцените капчу

Как уже раньше отметили любая графическая капча легко разпознается через OCR сервисы (где разгадывают люди).
Поэтому хорошая капча должна отвечать 2 требованиям:
1 - тяжело написать автом. распозновалку;
2 - тяжело передавать на распознование стороннему OCR сервису.

Если у вас РУ ресурс, то сделав капчу на русском вы уже сильно усложните жизнь “вредителям”, т.к. на OCR сервисах в основном хорошо разгадывают только латиницу.




Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version