|
При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка? |
Базовые операции обработки изображений
2.8. Выравнивание гистограмм
Существует три основных метода повышения контраста изображения:
- линейная растяжка гистограммы (линейное контрастирование),
- нормализация гистограммы,
- выравнивание (линеаризация или эквализация, equalization) гистограммы.
Линейная растяжка сводится к присваиванию новых значений интенсивности каждому пикселю изображения. Если интенсивности исходного изображения изменялись в диапазоне от
до
, тогда необходимо линейно "растянуть" указанный диапазон так, чтобы значения изменялись от 0 до 255. Для этого достаточно пересчитать старые значения интенсивности
для всех пикселей
согласно формуле
, где коэффициенты
просто вычисляются, исходя из того, что граница
должна перейти в 0, а
– в 255.
Нормализация гистограммы в отличие от предыдущего метода обеспечивает растяжку не всего диапазона изменения интенсивностей, а только его наиболее информативной части. Под информативной частью понимается набор пиков гистограммы, т.е. интенсивности, которые чаще остальных встречаются на изображении. Бины, соответствующие редко встречающимся интенсивностям, в процессе нормализации отбрасываются, далее выполняется обычная линейная растяжка получившейся гистограммы.
Выравнивание гистограмм – это один из наиболее распространенных способов. Цель выравнивания состоит в том, чтобы все уровни яркости имели бы одинаковую частоту, а гистограмма соответствовала равномерному закону распределения. Допустим, что задано изображение в оттенках серого, которое имеет разрешение
пикселей. Количество уровней квантования яркости пикселей (число бинов) составляет
. Тогда в среднем на каждый уровень яркости должно выпадать
пикселей. Базовая математика лежит в сопоставлении двух распределений. Пусть
– случайные величины, описывающие изменение интенсивности пикселей на изображениях,
– плотность распределения интенсивности на исходном изображении,
– желаемая плотность распределения. Необходимо найти преобразование плотностей распределения
, которое позволило бы получить желаемую плотность:

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

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

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

Построенную оценку можно использовать для вычисления новых значений интенсивности. Заметим, что перечисленные преобразования гистограмм можно применять не только ко всему изображению, но и к отдельным его частям.
В библиотеке OpenCV реализована функция equalizeHist, которая обеспечивает повышение контрастности изображения посредством выравнивания гистограммы [1, 7]. Прототип функции показан ниже.
void equalizeHist(const Mat& src, Mat& dst)
Функция работает в четыре этапа:
- Вычисление гистограммы
исходного изображения src. Отметим, что src – 8-битное одноканальное изображение. - Нормализация гистограммы. Нормализация посредством деления величины каждого бина гистограммы на общее количество пикселей.
- Построение интегральной гистограммы
. - Определение нового значения интенсивности пикселя dst(x,y) = H'(src(x,y)).
Далее приведем пример программы, обеспечивающей выравнивание гистограммы. Приложение принимает в качестве аргумента командной строки название исходного изображения. После выполнения операции выравнивания гистограммы выполняется отображение исходного изображения1 Использовано изображение, входящее в состав базы PASACL VOC 2007., переведенного в оттенки серого (рис. 7.11, слева), и изображения с выровненной гистограммой (рис. 7.11, справа).
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
const char helper[] =
"Sample_equalizeHist.exe <img_file>\n\
\t<img_file> - image file name\n";
int main(int argc, char* argv[])
{
const char *initialWinName = "Initial Image",
*equalizedWinName = "Equalized Image";
Mat img, grayImg, equalizedImg;
if (argc < 2)
{
printf("%s", helper);
return 1;
}
// загрузка изображения
img = imread(argv[1], 1);
// преобразование в оттенки серого
cvtColor(img, grayImg, CV_RGB2GRAY);
// выравнивание гистограммы
equalizeHist(grayImg, equalizedImg);
// отображение исходного изображения и гистограмм
namedWindow(initialWinName, CV_WINDOW_AUTOSIZE);
namedWindow(equalizedWinName, CV_WINDOW_AUTOSIZE);
imshow(initialWinName, grayImg);
imshow(equalizedWinName, equalizedImg);
waitKey();
// закрытие окон
destroyAllWindows();
// осовобождение памяти
img.release();
grayImg.release();
equalizedImg.release();
return 0;
}

