Я иногда путешествую по разным странам, и языковой барьер, довольно часто, становится серьезным препятствием для меня. И если в странах, где используются языки германской группы, я еще как то могу сориентироваться, то в таких странах как Китай, Израиль и арабские страны без сопровождающего, путешествие превращается в загадочный квест. Невозможно понять местное расписание автобусов/поездов/электричек, названия улиц в небольших городах очень редко есть на английском языке. А уж проблема с выбором, что бы поесть, из меню на непонятном языке вообще сродни ходьбы по минному полю.
Так как я разработчик под iOS, я подумал, а почему бы не написать такое приложение: наводишь камеру на вывеску/расписание/меню и тут же получаешь перевод на русский.
Краткий поиск по App Store показал, что имеется всего одно или два подобных приложения, причем русский язык не входит в число поддерживаемых. Значит, путь открыт и, можно попробовать, написать такое приложение. Тут стоит оговориться, что разговор не идет о тех приложениях, которые фотографируют черный текст на белом листе бумаги и потом оцифровывают и переводят его. Таких приложений действительно вагон и маленькая тележка. Речь идет приложении, кото��ое может выделить текст на естественном изображении, например на фотографии автобуса необходимо выделить текст на маршрутной табличке и перевести его, чтоб пользователь мог понять, куда идет этот автобус. Или актуальный для меня вопрос с меню, очень уж хочется знать, что ты заказываешь поесть.
Основная задача в приложении, это детектирование и локализация текста, а затем его выделение и бинаризация для «скармливания» в OCR, например tesseract. И если алгоритмы по обнаружению текста в сканированных документах уже давно известны и достигли 99% точности, то обнаружение текста произвольного размера на фотографиях до сих пор является актуальной областью исследований. Тем интереснее будет задача, подумал я и взялся изучать алгоритмы.
Естественно, универсального алгоритма для нахождения любого текста на любом изображении не существует, обычно используется разные алгоритмы для разных задач плюс эвристические методы. Для начала, формализуем задачу: для наших целей необходимо найти текст, который достаточно контрастен с окружающим фоном, расположенный горизонтально, угол наклона не превышает 20 градусов, и он может быть написанный шрифтом разного размеров и цвета.
Просмотрев алгоритмы, япринялся изобретать велосипед взялся за реализацию. Решил писать все сам, без использования opencv, для более глубокого погружения в предмет. За основу взял, так называемый, edge based метод. И вот, что в итоге у меня получилось.
В начале получаем изображение с камеры телефона в формате BGRA.

Переводим его в grayscale и строим гауссову пирамиду изображений. На каждом уровне пирамиды, будем находить текст определенной размерности. На самом низком уровне мы детектируем шрифты высотой, примерно, от 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. На вопросы отвечу в коментах, про грамматические ошибки пишите в личку.



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

Переводим его в grayscale и строим гауссову пирамиду изображений. На каждом уровне пирамиды, будем находить текст определенной размерности. На самом низком уровне мы детектируем шрифты высотой, примерно, от 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. На вопросы отвечу в коментах, про грамматические ошибки пишите в личку.



