Обеззараживающие полосы капчи


Я имею дело с чем-то вроде капчи с какими-то шумными полосками. Они нарисованы в случайном направлении, и они прямые. Цвет цифр и полос действительно случайный.

Введите описание изображения здесьВведите описание изображения здесьВведите описание изображения здесь

Приведенный ниже код способенраспознавать цифры из некоторых каптч с помощью tesseract.

from pytesser.pytesser import *
from PIL import Image, ImageFilter, ImageEnhance

im = Image.open("test.tiff")
im = im.filter(ImageFilter.MedianFilter()) # blur the image, the stripes will be erased
im = ImageEnhance.Contrast(im).enhance(2)  # increase the contrast (to make image clear?)
im = im.convert('1')                       # convert to black-white image
text = image_to_string(im)
print "text={}".format(text)

Подход к удалению полос состоит в том, чтобы сначала размыть изображение, а затем снова его заострить. точность распознавания в большинстве случаев составляет 100%, но я думая , есть ли какие-то другие подходы, чтобы удалить полосы, не размывая цифры.

Любые намеки высоко ценятся.

3 3

3 ответа:

Почему бы не попытаться использовать то, насколько тонки полосы? Я бы предположил, что они не более 5px. Так почему бы не сделать что-то вроде (грубый псевдокод):

  1. преобразуйте изображение в массив numpy
  2. для direction в UP, DOWN, LEFT, RIGHT
    1. создайте новый массив numpy, сдвинутый на 5px в direction, обрезав край.
    2. и вместе ваш новый массив и старый массив.
    3. Проверьте нижний левый угол. Если она белая, то ваша работа сделана, и ваш образ оглушен. Если нет, попробуйте следующий направление.
Учитывая, что числа намного толще полос, я предполагаю, что удаление полос из изображения перевесит любое искажение, внесенное из и.

Второй пример очень прост: сканируйте края, чтобы определить цвет полос и превратить этот цвет в белый. (Эти цветные линии не являются надежной функцией капчи.)

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

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

Существует класс математических задач в обработке изображений под названием "Inpainting".

Вы должны получить маску из полос, чтобы как-то делать вещи.

Вот моя библиотека статей: http://dpaste.com/0CZ25FT . Там есть все современные издания.

В OpenCV реализовано несколько алгоритмов: "Navier-Stokes "и" Telea", но они не подходят для рисования больших областей.

Вы также можете найти некоторые ссылки на подрисовка в пакет scikit, но не законченные алгоритмы там.

Кроме того, если полосы всегда имеют ширину 1 Пикс, их можно легко удалить с помощью расширения+эрозии. Проверьте Вудс, Гонсалес "Цифровая обработка изображений" для получения дополнительной информации.