Меню Закрыть

Opencv нормализация яркости изображения

У меня есть изображение RGB, хранящееся в структуре данных Mat. Я конвертирую изображение в оттенки серого, используя функцию cvtColor в opencv. После этого я пытаюсь нормализовать изображение в диапазоне [0,1]. Я использую стандартную функцию нормализации opencv. Чтобы проверить правильность, я попытался напечатать значения пикселей и приравнять их к значениям matlab (значения Matlab уже находятся в диапазоне [0,1]). Но значения сильно отличаются. Помогите мне сделать оба результата практически одинаковыми. Ниже приведены коды opencv и matlab.

Решение

Я не думаю, что вы хотите нормализовать здесь. Преобразование Matlab rgb2gray использует это уравнение: 0,2989 * R + 0,5870 * G + 0,1140 * B. Таким образом, не ожидается, что у вас будет минимальное значение 0,0 или максимальное значение 1,0 в вашем выходном изображении в градациях серого. Вы ожидали бы только 0 и 1, если бы у вас были чисто белый (255,255,255) и чисто черный (0,0,0) пиксели.

1. OpenCV шаг за шагом. Введение.
2. Установка.
3. Hello World.
4. Загрузка картинки.
5. Вывод видео
6. Ползунок
7. Захват видео с камеры
8. Запись видео
9. События от мышки
10. Обработка изображения — сглаживание
11. Обработка изображения — изменение размеров
12. ROI — интересующая область изображения
13. Типы данных OpenCV
14. Матрица
15. Сохранение данных в XML
16. Генерация случайных чисел
17. Обработка изображения — морфологические преобразования
18. Обработка изображения — морфологические преобразования 2
19. Обработка изображения — заливка части изображения
20. Обработка изображения — альфа-смешивание
21. Обработка изображения — пороговое преобразование
22. Поиск объекта по цвету — RGB.
23. Поиск объекта по цвету. Цветовое пространство HSV.
24. Работа с камерой через библиотеку videoInput.
25. Обработка изображения — свёртка

Свёртка (англ. convolution) — это операция, показывающая «схожесть» одной функции с отражённой и сдвинутой копией другой.

В случае работы с изображениями — свёртка — это операция вычисления нового значения заданного пикселя, при которой учитываются значения окружающих его соседних пикселей.
Главным элементом свёртки является т.н. ядро свёртки — это матрица (произвольного размера и отношения сторон; чаще всего используется квадратная матрица (по-умолчанию, размеры 3х3)).

Читайте также:  Fallout 3 high definition texture pack

У ядра свёртки есть важный параметр — якорь — это элемент матрицы (чаще всего — центр), который прикладывается к заданному пикселю изображения.

Работает свёртка очень просто:
При вычислении нового значения выбранного пикселя изображения, ядро свёртки прикладывается своим центром к этому пикселю. Соседние пиксели так же накрываются ядром.
Далее, вычисляется сумма произведений значений пикселей изображения на значения, накрывшего данный пиксель элемента ядра.
Полученная сумма и является новым значением выбранного пикселя.
Теперь, если применить свёртку к каждому пикселю изображения, то получится некий эффект, зависящий от выбранного ядра свертки.

Пример:
пусть у нас есть клеточное поле, которое соответствует пикселям исходного изображния:

и есть ядро свёртки, представляющее собой матрицу 3х3 с якорем в центре и элементами:

Результат операции наложения нашего ядра на пиксель со значением 50:

Всё очень просто:

С OpenCV операция свёртки реализуется функцией cvFilter2D()

-свёртка изображения при помощи ядра kernel

src — исходное изображение
dst — изображение для сохранения результа
kernel — ядро свёртки (массив из одного канала из элементов типа float)
anchor — якорь ядра ( (-1,-1) говорит, что якорь в центре (для ядра нечётной размерности))

При данном ядре никаких изменений в картинке не наблюдается.

Давайте попробуем поиграться с элементами ядра свёртки:

Т.о. накладывая ядро с разными коэффициентами можно получить различные эффекты.

Свёртка — очень полезная и распространённая операция, лежащая в основе различных фильтров (размытие, повышение резкости, нахождение краёв).

Но возникает вопрос, как должен вести себя алгоритм свёртки на краях изображения?
Если взять рассмотренный пример, то как нужно рассчитывать свёртку, если приложить якорь ядра к пикселю со значением 47?
Хорошим решением этой проблемы может быть создание изображение большего размера, чем исходное, у которого на краях будут заданное значение пикселей. Начинать обработку картинки нужно тогда не с 0-го, а с 1-го пикселя (и до n-1-го пискселя):

Читайте также:  Заставка для ролика ютуб

В OpenCV уже есть функция реализующая копирование изображения с последующим окружением границей с заданным значением — cvCopyMakeBorder()

— копирует исходное изображение, окружая его границей

src — исходное изображение
dst — изображение для сохранения результа
offset — смещение (координаты левого верхнего угла целевого изображения)
bordertype — тип границы:

value — цвет заливки границы

скачать иcходник (25-cvCopyMakeBorder.cpp)
результат работы:

Функция свёртки cvFilter2D() внутри себя уже вызывает функцию cvCopyMakeBorder() с параметром IPL_BORDER_REPLICATE.

2.8. Выравнивание гистограмм

Существует три основных метода повышения контраста изображения:

  • линейная растяжка гистограммы (линейное контрастирование),
  • нормализация гистограммы,
  • выравнивание (линеаризация или эквализация, equalization) гистограммы.

Линейная растяжка сводится к присваиванию новых значений интенсивности каждому пикселю изображения. Если интенсивности исходного изображения изменялись в диапазоне от до , тогда необходимо линейно "растянуть" указанный диапазон так, чтобы значения изменялись от 0 до 255. Для этого достаточно пересчитать старые значения интенсивности для всех пикселей согласно формуле , где коэффициенты просто вычисляются, исходя из того, что граница должна перейти в 0, а – в 255.

Нормализация гистограммы в отличие от предыдущего метода обеспечивает растяжку не всего диапазона изменения интенсивностей, а только его наиболее информативной части. Под информативной частью понимается набор пиков гистограммы, т.е. интенсивности, которые чаще остальных встречаются на изображении. Бины, соответствующие редко встречающимся интенсивностям, в процессе нормализации отбрасываются, далее выполняется обычная линейная растяжка получившейся гистограммы.

Выравнивание гистограмм – это один из наиболее распространенных способов. Цель выравнивания состоит в том, чтобы все уровни яркости имели бы одинаковую частоту, а гистограмма соответствовала равномерному закону распределения. Допустим, что задано изображение в оттенках серого, которое имеет разрешение пикселей. Количество уровней квантования яркости пикселей (число бинов) составляет . Тогда в среднем на каждый уровень яркости должно выпадать пикселей. Базовая математика лежит в сопоставлении двух распределений. Пусть – случайные величины, описывающие изменение интенсивности пикселей на изображениях, – плотность распределения интенсивности на исходном изображении, – желаемая плотность распределения. Необходимо найти преобразование плотностей распределения , которое позволило бы получить желаемую плотность:

Читайте также:  Что значит пустое сообщение

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

Отсюда получаем, что

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

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

В библиотеке OpenCV реализована функция equalizeHist , которая обеспечивает повышение контрастности изображения посредством выравнивания гистограммы [1, 7]. Прототип функции показан ниже.

Функция работает в четыре этапа:

  1. Вычисление гистограммы исходного изображения src . Отметим, что src – 8-битное одноканальное изображение.
  2. Нормализация гистограммы. Нормализация посредством деления величины каждого бина гистограммы на общее количество пикселей.
  3. Построение интегральной гистограммы .
  4. Определение нового значения интенсивности пикселя dst(x,y) = H'(src(x,y)) .

Далее приведем пример программы, обеспечивающей выравнивание гистограммы. Приложение принимает в качестве аргумента командной строки название исходного изображения. После выполнения операции выравнивания гистограммы выполняется отображение исходного изображения 1 Использовано изображение, входящее в состав базы PASACL VOC 2007. , переведенного в оттенки серого (рис. 7.11, слева), и изображения с выровненной гистограммой (рис. 7.11, справа).

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.