Обеззараживающие полосы капчи
Я имею дело с чем-то вроде капчи с какими-то шумными полосками. Они нарисованы в случайном направлении, и они прямые. Цвет цифр и полос действительно случайный.
Приведенный ниже код способенраспознавать цифры из некоторых каптч с помощью 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 ответа:
Почему бы не попытаться использовать то, насколько тонки полосы? Я бы предположил, что они не более 5px. Так почему бы не сделать что-то вроде (грубый псевдокод):
Учитывая, что числа намного толще полос, я предполагаю, что удаление полос из изображения перевесит любое искажение, внесенное из и.
- преобразуйте изображение в массив
numpy
- для
direction
вUP, DOWN, LEFT, RIGHT
- создайте новый массив
numpy
, сдвинутый на 5px вdirection
, обрезав край.- и вместе ваш новый массив и старый массив.
- Проверьте нижний левый угол. Если она белая, то ваша работа сделана, и ваш образ оглушен. Если нет, попробуйте следующий направление.
Второй пример очень прост: сканируйте края, чтобы определить цвет полос и превратить этот цвет в белый. (Эти цветные линии не являются надежной функцией капчи.)
Первый и третий поднимают более серьезную проблему, потому что полосы имеют тот же цвет, что и некоторые символы. Вы можете справиться с этим, стирая только пиксели цвета полос, имеющих несколько соседей. Еще лучше проанализировать контур изображения, чтобы определить направление полос и увидеть, что именно конфигурации окрестностей соответствуют пикселю полосы.Технически говоря, вы будете выполнять операцию эрозии с подходящей формой структурирующего элемента.
Существует класс математических задач в обработке изображений под названием "Inpainting".
Вы должны получить маску из полос, чтобы как-то делать вещи.
Вот моя библиотека статей: http://dpaste.com/0CZ25FT . Там есть все современные издания.
В OpenCV реализовано несколько алгоритмов: "Navier-Stokes "и" Telea", но они не подходят для рисования больших областей.
Вы также можете найти некоторые ссылки на подрисовка в пакет scikit, но не законченные алгоритмы там.
Кроме того, если полосы всегда имеют ширину 1 Пикс, их можно легко удалить с помощью расширения+эрозии. Проверьте Вудс, Гонсалес "Цифровая обработка изображений" для получения дополнительной информации.