Детектирование и локализация произвольного текста на изображениях, полученных с помощью фотокамер мобильных телефонов

от автора

Я иногда путешествую по разным странам, и языковой барьер, довольно часто, становится серьезным препятствием для меня. И если в странах, где используются языки германской группы, я еще как то могу сориентироваться, то в таких странах как Китай, Израиль и арабские страны без сопровождающего, путешествие превращается в загадочный квест. Невозможно понять местное расписание автобусов/поездов/электричек, названия улиц в небольших городах очень редко есть на английском языке. А уж проблема с выбором, что бы поесть, из меню на непонятном языке вообще сродни ходьбы по минному полю.
Так как я разработчик под iOS, я подумал, а почему бы не написать такое приложение: наводишь камеру на вывеску/расписание/меню и тут же получаешь перевод на русский.

Краткий поиск по App Store показал, что имеется всего одно или два подобных приложения, причем русский язык не входит в число поддерживаемых. Значит, путь открыт и, можно попробовать, написать такое приложение. Тут стоит оговориться, что разговор не идет о тех приложениях, которые фотографируют черный текст на белом листе бумаги и потом оцифровывают и переводят его. Таких приложений действительно вагон и маленькая тележка. Речь идет приложении, которое может выделить текст на естественном изображении, например на фотографии автобуса необходимо выделить текст на маршрутной табличке и перевести его, чтоб пользователь мог понять, куда идет этот автобус. Или актуальный для меня вопрос с меню, очень уж хочется знать, что ты заказываешь поесть.

Основная задача в приложении, это детектирование и локализация текста, а затем его выделение и бинаризация для «скармливания» в OCR, например tesseract. И если алгоритмы по обнаружению текста в сканированных документах уже давно известны и достигли 99% точности, то обнаружение текста произвольного размера на фотографиях до сих пор является актуальной областью исследований. Тем интереснее будет задача, подумал я и взялся изучать алгоритмы.
Естественно, универсального алгоритма для нахождения любого текста на любом изображении не существует, обычно используется разные алгоритмы для разных задач плюс эвристические методы. Для начала, формализуем задачу: для наших целей необходимо найти текст, который достаточно контрастен с окружающим фоном, расположенный горизонтально, угол наклона не превышает 20 градусов, и он может быть написанный шрифтом разного размеров и цвета.

Просмотрев алгоритмы, я принялся изобретать велосипед взялся за реализацию. Решил писать все сам, без использования opencv, для более глубокого погружения в предмет. За основу взял, так называемый, edge based метод. И вот, что в итоге у меня получилось.
В начале получаем изображение с камеры телефона в формате BGRA.

Переводим его в greyscale и строим гауссову пирамиду изображений. На каждом уровне пирамиды, будем находить текст определенной размерности. На самом низком уровне мы детектируем шрифты высотой, примерно, от k до 2*k- 1 пикселей, затем от 2*k до 4*k-1 и так далее. Вообще то надо было использовать 4 изображения в пирамиде, но мы помним, что в нашем распоряжении всего лишь iPhone, а не четырехядерный i7, по этому ограничимся 3-мя изображениями.

Применим оператор Собеля для выделения вертикальных границ. И отфильтруем полученный результат, просто удалив слишком короткие отрезки, чтобы отсечь шум.

К выделенным оператором Собеля вертикальным границам, применим морфологическую операцию закрытия. По горизонтали на ширину шрифта, а по вертикали на 5. Полученный результат опять отфильтровываем. Пропускаем только то что укладывается в высоту искомого нами шрифта от k до 2*k- 1, и длиной не менее 3-х символов. Получаем вот такой результат.

Проделываем те же операции со следующим уровнем пирамиды.

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

Ниже приведены примеры работы алгоритма на более сложных изображениях, видно что еще требуется некоторая доработка.
Время обработки изображения 640х480 на iPhone 5, порядка 0.3 сек.

P.S. На вопросы отвечу в коментах, про грамматические ошибки пишите в личку.

ссылка на оригинал статьи http://habrahabr.ru/post/180609/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *