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

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

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

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

Построенную оценку можно использовать для вычисления новых значений интенсивности. Заметим, что перечисленные преобразования гистограмм можно применять не только ко всему изображению, но и к отдельным его частям.
В библиотеке OpenCV реализована функция equalizeHist, которая обеспечивает повышение контрастности изображения посредством выравнивания гистограммы [1, 7]. Прототип функции показан ниже.
void equalizeHist(const Mat&src, Mat&dst)
Функция работает в четыре этапа:
- Вычисление гистограммы H исходного изображения src. Отметим, что src – 8-битное одноканальное изображение.
- Нормализация гистограммы. Нормализация посредством деления величины каждого бина гистограммы на общее количество пикселей.
- Построение интегральной гистограммы
. - Определение нового значения интенсивности пикселя dst(x,y) = H'(src(x,y)).
Далее приведем пример программы, обеспечивающей выравнивание гистограммы. Приложение принимает в качестве аргумента командной строки название исходного изображения. После выполнения операции выравнивания гистограммы выполняется отображение исходного изображения1Использовано изображение, входящее в состав базы PASACL VOC 2007. , переведенного в оттенки серого (рис.9.11, слева), и изображения с выровненной гистограммой (рис.9.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";
1
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;
}

"