неравномерное освещение - PullRequest
2 голосов
/ 19 марта 2010

Как избавиться от неравномерного освещения от изображений, которые содержат текстовые данные, обычно напечатанные, но могут быть написаны от руки? На нем могут быть пятна света, потому что свет отражается при создании изображения. Я видел, что функция plot_characters в программе Halcon отлично выполняет эту работу, но это не с открытым исходным кодом. Я хочу преобразовать изображение в изображение с постоянной подсветкой на фоне и более темными областями текста. Так что бинаризация будет легкой и без шума. Предполагается, что текст темнее, чем фон. Есть идеи?

Ответы [ 5 ]

2 голосов
/ 29 января 2012

Использовать локальный порог вместо глобального алгоритма порога. Разделите ваше изображение (в градациях серого) на сетку из небольших изображений (скажем, 50x50 пикселей) и примените алгоритм порогового значения к каждому отдельному изображению.

2 голосов
/ 23 мая 2010

Вы пробовали использовать морфологические методы?Замыкание по реконструкции (как представлено в Гонсалес, Вудс и Эддинс ) может использоваться для создания представления уровней яркости фона в оттенках серого.Вы можете более или менее стандартизировать эффективное освещение следующим образом:

1) Расчет средней интенсивности всех пикселей на изображении

2) Использование замыкания по реконструкции для оценки освещенности фонауровни

3) Вычтите вывод (2) из ​​исходного изображения

4) Добавьте среднюю интенсивность от (1) к каждому пикселю на выходе (3).

В основном то, что делает замыкание за реконструкцией, это удаляет все элементы изображения, которые меньше определенного размера, стирая «передний план» (текст, который вы хотите захватить) и оставляя позади только «фон» (уровни освещения).Вычитание результата из исходного изображения оставляет только небольшие отклонения (текст).Добавление к этим отклонениям исходной средней интенсивности просто делает текст читабельным, чтобы полученное изображение выглядело как нормализованная по свету версия исходного изображения.

2 голосов
/ 19 марта 2010

Строго говоря, предполагая, что у вас есть доступ к пикселям изображения (вы можете найти в Интернете, как этого добиться на вашем языке программирования, поскольку тема доступна в изобилии), упражнение включает в себя один раз просмотр пикселей, чтобы определить «порог темноты». ». Для этого вы конвертируете каждый пиксель из RGB в HSL , чтобы получить компонент уровня lightness для каждого пикселя. Во время этого процесса вы рассчитываете среднюю яркость для всего изображения, которую вы можете использовать в качестве «порога темноты»

Получив средний уровень яркости изображения, вы можете еще раз пройтись по пикселям изображения, и если пиксель меньше порога темноты, установите его цвет на полный белый RGB (255 255 255), в противном случае установите его цвет на полный. черный RGB (0,0,0). Это даст вам двоичное изображение, в котором текст должен быть черным, а остальное должно быть белым.

Конечно, ключ в поиске подходящего порога темноты - поэтому, если усредненный метод не дает хороших результатов, вам, возможно, придется придумать другой метод, чтобы увеличить этот шаг. Такой метод может включать разделение изображения в основных каналах Red, Green, Blue и вычисление порога темноты для каждого канала в отдельности, а затем использование агрессивного порога из трех ..

И, наконец, лучшим подходом может быть вычисление распределения уровней освещенности, а не просто среднего значения, а затем исходя из этого, диапазон вокруг максимума - это то, что вы хотите сохранить. Опять же, пройдитесь по каждому пикселю и, если его яркость соответствует полосе, сделайте его черным, в противном случае сделайте его белым.

EDIT

Для дальнейшего прочтения о HSL я рекомендую начать с записи Wiky в цветовых пространствах HSL и HSV .

0 голосов
/ 26 марта 2010

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

Если это невозможно, вы можете попробовать некоторые идеи из этого вопроса или этого . Вы хотите реализовать некоторый тип «адаптивного порога», при этом локальный порог будет применен к отдельным частям изображения, чтобы изменение контрастности не было столь заметным.

Существует также простой, но эффективный метод, объясненный здесь . Простая схема этого алгоритма следующая:

  1. Разделить изображение на NxN областей или районов
  2. Рассчитать среднее или медианное значение пикселя для окрестности
  3. Порог области на основе значения, рассчитанного в 2) или значения из 2) минус C (где C - выбранная константа)
0 голосов
/ 23 марта 2010

Если фоновые объекты обычно больше, чем буквы, вы можете попытаться оценить и впоследствии удалить фон.

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

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

...