Jump to content
Compvision.ru
idrua

Очистка изображения от печатного текста

Recommended Posts

Добрый день.

Подскажите, какие есть варианты для очистки изображения от  "шума"? Под шумом подразумеваю печатный текст "пiдпис" и "№". Нюанс еще в том, что этот текст может быть напечатан разными шрифтами и разного размера. Пробовал удалить наложением эталона с логическим AND. Получается, но далеко не идеально.  Возможно, есть другой вариант очистки?

 

P.S. Угловой перекос устранил, линии удалил. Вопрос исключительно по очистке от печатного текста.

Digit.jpg

Share this post


Link to post
Share on other sites

Убрать этот шум будет довольно проблематично, но сверточная нейронка способна работать с таким шумом и распознать цифры.

Задача похожа на распознавание капчи, посмотрите здесь: https://habrahabr.ru/post/116222/ , может будет полезно.

Share this post


Link to post
Share on other sites

Статью на хабре видел. Там фон удачно чистится по причине разных цветов фона и цифр.

Цитата

Поскольку изображение трёхцветное, порежем его на каналы, а затем выбросим все точки, которые ярче 116 по всем каналам.

 

А у меня все черное. И рукописные цифры и печатный текст.

Share this post


Link to post
Share on other sites

Можете тут посмотреть, но применимость зависит от того что вы на вход подаёте. У меня там есть работа с переменной длиной строки, но размер изображения константный.

И всякие tesseract тоже с LSTM.

https://github.com/tesseract-ocr/tesseract/wiki/4.0-with-LSTM

Share this post


Link to post
Share on other sites

 

Цитата

 

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

Очень часто цвет печатного и рукописного отличается. Но не могу придумать как на этом "сыграть".
 

P.S. Могу примеры картинок прикрепить.

Share this post


Link to post
Share on other sites

разлиновку можно убрать по гистограмме, если инвертировать изображение и найти суммы вдоль строк пикселей, это даст пики на местах линий. А вот выковыривать текст это задачка много сложнее. Можно попробовать нейронку натренироватьб если на вход подавать изображение с печатным текстом, а на выход очищенную надпись, то может и сработать, но нужно большой датасет руками делать, самому почистить штук 1000-2000 таких изображений.

Share this post


Link to post
Share on other sites
4 часа назад, Smorodov сказал:

разлиновку можно убрать по гистограмме, если инвертировать изображение и найти суммы вдоль строк пикселей, это даст пики на местах линий. А вот выковыривать текст это задачка много сложнее. Можно попробовать нейронку натренироватьб если на вход подавать изображение с печатным текстом, а на выход очищенную надпись, то может и сработать, но нужно большой датасет руками делать, самому почистить штук 1000-2000 таких изображений.

Линии уже удалены. Я правда не гистограммой делал, а HoughLines. Принцип примерно такой же.

Нейронку пока не могу. Это долго и нет нужного объема изображений.

По теме чистки (очередная попытка):

1)Известна примерная зона рукописного текста.

2)Бинаризирую, провожу условно линию по высоте \ 2.

3)Ищу все точки черного цвета на условной линии.

4) Заливаю другим цветом (FloodFill) найденные точки.

Получается отсеять часть букв, которые не соприкасаются с рукописным. Но все равно плохо.

Forum.jpg

Forum2.jpg

Share this post


Link to post
Share on other sites

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

  • Thanks 1

Share this post


Link to post
Share on other sites
2 часа назад, Nuzhny сказал:

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

Спасибо тебе, добрый человек!  Буду разбираться и проверять.

Share this post


Link to post
Share on other sites

Вот, блин... ни одного примера на C# во всем интернете по Expectation Maximization. Могу я попросить exe'шник с dll'ками для тестов (для 86 машины)? Тем более, его ранее раздавали на форуме. Насколько я понимаю, мне нужно разложить на 3 канала (белый(фон), черный(печатный), черный (рукописный)). Не совсем понял, почему Nuzhny предлагает на 2. Или имелось 2 класса с разными черными?

P.S. Смотрел свои проблемные картинки в HSV. Hue для печатного и рукописного почти не отличается (если черным рукописным по черному печатному). А вот Saturation иногда отличается и очень сильно

 

Share this post


Link to post
Share on other sites

1. Предлагаю забить на C# и проверить вообще будет ли подход работать, на С++, например. или на Питоне.

2. Да, я предлагаю именно два класса с разными чёрными. Фон вообще отсекать по порогу, чтобы он в EM не участвовал. Уверен, что оттенков фона может быть много и он попадёт не в одну, а в две модели.

3. Да, HSV очень удобен для таких задач. Лучше добавлять в качестве признаков и H, и S каналы.

Share this post


Link to post
Share on other sites
4 часа назад, Nuzhny сказал:

1. Предлагаю забить на C# и проверить вообще будет ли подход работать, на С++, например. или на Питоне.

2. Да, я предлагаю именно два класса с разными чёрными. Фон вообще отсекать по порогу, чтобы он в EM не участвовал. Уверен, что оттенков фона может быть много и он попадёт не в одну, а в две модели.

3. Да, HSV очень удобен для таких задач. Лучше добавлять в качестве признаков и H, и S каналы.

1. Легко сказать, но трудно сделать. Не использовал до этого момента плюсы и Питон. Ладно, буду пробовать. Какой пакет Nuget устанавливать? Вижу два популярных от Itseez и shimat.
2. Удалил фон. Сделал его белым, чтобы удобнее отсекать.

20170831102541.jpg

20170831104107.jpg

20170831104922.jpg

Share this post


Link to post
Share on other sites

1. Nuget?!! Я всегда качаю репозиторий с Гитхаба и компилирую. Но выбирать, конечно, надо Itseez!

2. Надо продолжать.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
5 часов назад, Nuzhny сказал:

2. Надо продолжать.

Продолжил... Должен сказать, что установка  пакета OpenCV на С++ в корне отличается от C#. Скачал opencv-3.2.0-vc14.exe, распаковал, прописал все пути. Создал тестовый пример. Компилируется успешно. Но выяснилось, что это только для x64, а у меня x86. Насколько я понял, нужно при помощи CMAKE создавать нужные библиотеки из папки source.

P.S. В opencv-2.4.13.3-vc14.exe есть папка x86. Наверное, так проще будет. Особенно для меня )))

 

Share this post


Link to post
Share on other sites

Установил C++, взял за основу код (Smorodov) с небольшими правками ( беру для обучения все не белое). Результат, не очень.
По первым двум каналам (H-S) совсем плохо. Чуть лучше по другим парам (H-V или S-V или полностью H-S-V). Иногда по RGB лучше раскладывает, чем по HSV.
Также не понятно, как программно контролировать устраивает результат или не устраивает.

Ниже результаты. Оригинал, точки для обучения, результат разложения. На первой картинке по H-S. На второй по H-S-V.
 

CompVision1.png

CompVision2.png

Share this post


Link to post
Share on other sites

Да, не так хорошо, как хотелось бы.

Если двигаться дальше в этом направлении.

1. Надо вручную разметить данные: набрать примеров картинок и сделать маски для них: 0 - фон, 1 - печатный шрифт, 2 - от руки.

2. Этот датасет визуализировать. У тебя есть 3 признака (H, S и V), в 3D вывести два датасета: красными точками пиксели печатного текста, а синим - рукописного. Посмотреть, насколько они сливаются.

3. Обучить что-то сложнее EM, например SVM с RBF (радиально-базисными функциями).

4. Если будет не намного лучше, то добавлять признаков.

Share this post


Link to post
Share on other sites
5 часов назад, mrgloom сказал:

Спасибо, посмотрю. Но там шум совсем другой: следы от стаканов, загнутые страницы и т.д. Это все гораздо проще удалить, имхо. У меня же на черном печатном пишут черным рукописным (синий тоже бывает, но с ним легче).

Наверное, следует написать пару слов о промежуточных результатах на сейчас. Во первых, спасибо, Nuzhny, что помогает советами и кодом вот уже месяц.
1. Разложить по цвету мои картинки невозможно. Что только не делали: добавляли LBP, оператор Собеля, различные маски. Все мимо. Ни кластеризация, ни классификация не справляются.
2. Решили добавить принадлежность пикселя с типу текста. Ведь что-то таки известно. Можно получить контуры и отобрать только те, которые подходят по размеру печатных букв. Определяются не все, иногда ложные появляются (с этим беда). А еще можно получить рукописный из LSD (длинные линии под углом 10..80 и 100..170) будут говорить о рукописном. В результате получается такая маска(см.ниже). Результаты пока не очень, но заметно лучше, чем просто по цвету с всевозможными "играми" из LBP, Sobel и т.д.

В красном и зеленом результат разложения. Это мой первый опыт работы с классификатором. Думаю, что у Nuzhny получше выйдет, но он пока занят.

mask.png

res1.jpg

res2.jpg

Share this post


Link to post
Share on other sites

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

 

res31.jpg

Share this post


Link to post
Share on other sites

У меня всё получилось! Почти год прошел. Что я только не пробовал, к кому только не обращался за помощью...а в итоге сделал сам.

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×