• Как разгадать такую капчу?

    mitaichik
    @mitaichik Автор вопроса
    Кому интересно: распознать такую капчу не так то сложно: единственная проблема - это наличие эффекта сферы.

    Сначала нам необходимо вычислить центр и радиус сферы. Для этого нам поможет "сетка" которая есть на капче.

    Сначала нам необходимо удалить гардиент, так как в середине капчи он может сливаться с сеткой. Гардиент имеет довольно линейную зависимость, поэтому легко вычислить у удалить.

    Затем необходимо вычислить координаты линий сетки. Я это сделал с помощью прохода по нижнему и правому краю. Цвет пикселей сетки примерно одинаков (с очень маленьким разбросом), поэтому их легко вычленить.

    Затем, проходя по линиям сетки, вычисляется где они сдвигаются в ту или иную сторону - это сообственно начало эффекта сферы. Имея 3 таких координаты (справа/слева и с низу или сверху) можно вычислить его радиус и центр.

    Следующий шаг - бинаризация изображения. Для этого можно применить постеризацию и бинаризацию по порогу, Первый, увы больно тупо работает (можно указать только кол-во цветов), второй более точно настраиваемый, поэтому я заюзал его.

    Далее у нас получаются чернобелый исходник цифр, но с пустыми пикселями от сетки, и все еще с эффектом сферы.

    Следующий шаг - убираем эффект сферы. Это элементарно, ибо мы знаем его параметры.

    Далее нам надо "восстановить" пустые пиксели от сетки. Сначала думал юзать дилитацию, но расстояние между цифрами не позволяет это. Затем думал заюзать центры гравитации, чтоб они цифры как бы сжались, удалив пустоты, но не нашел алгоритма для этого. В итоге написал свой алгоритм, который работает гораздо лучше (так как он учитывает координаты линий сетки, в отличии от простой дилитации).

    Получаются практически нормальные цифры. Сегментация - написал свой алгоритм, довольно тупой, ничего сложного.

    После всего у нас получаются разбитые цифры. На это на все я натравил FANN. Сначала обучил его с помощью антигейта, теперь уже сам работает как надо.

    В итоге - капча распознаются с приемлемым результатом. Самое крутое, что все необходимое можно спокойно сделать с помощью imagemagick.

    Но существуют 2 проблемы: Если сетка слишком частая - то она при наложении эффекта сферы дико искривляется, что затрудняет поиск начала ее смещения. Плюс если удается вычислить только 2 координаты начала сферы - не удается точно вычислить ее центр по вертикальной оси. Это все влияет на процент распозноваемости.

    Но РЖД дает возможность запросить новую капчу, очень быстро, и получается что в среднем за 3 попытки распознавания ее удается обойти в любом случае (но обычно меньше).

    Естественно, это все требует времени, но время в моем случае не столь критичное, так как РЖД в лбом случае отдает ответ от 10 до 40 секунд - пользователи уже привыкли к этому, и лишние 2 секунды роли не сыграют.

    Вот как-то так...
    Ответ написан
    1 комментарий