Перейти к содержимому
Compvision.ru
idrua

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

Recommended Posts

Добрый день.

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

 

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

Digit.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Цитата

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Цитата

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Smorodov сказал:

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

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

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

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

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

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

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

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

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

Forum.jpg

Forum2.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Nuzhny сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Nuzhny сказал:

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

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

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

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

20170831102541.jpg

20170831104107.jpg

20170831104922.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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. Наверное, так проще будет. Особенно для меня )))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

CompVision1.png

CompVision2.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, mrgloom сказал:

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

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

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

mask.png

res1.jpg

res2.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

res31.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

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

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×