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

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

Recommended Posts

idrua    0

Добрый день.

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

 

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

Digit.jpg

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


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

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

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

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


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

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

Цитата

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

 

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

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


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

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

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

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

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


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

 

Цитата

 

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

Forum.jpg

Forum2.jpg

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


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

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

  • Thanks 1

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


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

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

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

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


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

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

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

 

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


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

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

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

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

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


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

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

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

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

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

20170831102541.jpg

20170831104107.jpg

20170831104922.jpg

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


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

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

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

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


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

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

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


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

 

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


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

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

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

CompVision1.png

CompVision2.png

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×