Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 429 / 54 | Длительность: 19:27:00
Самостоятельная работа 2:

Базовые операции обработки изображений

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

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

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

Линейная растяжка сводится к присваиванию новых значений интенсивности каждому пикселю изображения. Если интенсивности исходного изображения изменялись в диапазоне от i_1 до i_2, тогда необходимо линейно "растянуть" указанный диапазон так, чтобы значения изменялись от 0 до 255. Для этого достаточно пересчитать старые значения интенсивности f_{xy} для всех пикселей (x,y) согласно формуле g_{xy}=a \cdot f_{xy} +b , где коэффициенты a,b просто вычисляются, исходя из того, что граница i_1 должна перейти в 0, а i_2 – в 255.

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

Выравнивание гистограмм – это один из наиболее распространенных способов. Цель выравнивания состоит в том, чтобы все уровни яркости имели бы одинаковую частоту, а гистограмма соответствовала равномерному закону распределения. Допустим, что задано изображение в оттенках серого, которое имеет разрешение N \times M пикселей. Количество уровней квантования яркости пикселей (число бинов) составляет . Тогда в среднем на каждый уровень яркости должно выпадать n_{aver}=\frac {NM} {J} пикселей. Базовая математика лежит в сопоставлении двух распределений. Пусть x,y – случайные величины, описывающие изменение интенсивности пикселей на изображениях, w_x(x) – плотность распределения интенсивности на исходном изображении, w_y(y) – желаемая плотность распределения. Необходимо найти преобразование плотностей распределения y=f(x) , которое позволило бы получить желаемую плотность:

w_y(y)=\begin{cases}
{\frac 1 {y_{max}-y_{min}},y_{min} \leqslant y \leqslant y_{max}} \\
0,\text{в противном случае}
\end{cases}

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

F_x(x)=F_y(y)=\int\limits_{y_{min}}^yw_y(y)dy=\frac {y-y_{min}} {y_{max}-y_{min}}

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

y=(y_{max}-y_{min})F_x(x)+y_{min}

Осталось выяснить, как оценить интегральный закон распределения F_x(x). Для этого необходимо сначала построить гистограмму исходного изображения, затем нормализовать полученную гистограмму, разделив величину каждого бина на общее количество пикселей N \cdot M. Значения бинов можно рассматривать как приближенное значение функции плотности распределения w^*_x(x),0\leqslant x \leqslant 255. Таким образом, значение интегральной функции распределения можно представить как сумму следующего вида:

F^*_x(x)=\sum_{j=0}^x {w^*_x(j)}

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

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

void equalizeHist(const Mat&src, Mat&dst) 

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

  1. Вычисление гистограммы H исходного изображения src. Отметим, что src – 8-битное одноканальное изображение.
  2. Нормализация гистограммы. Нормализация посредством деления величины каждого бина гистограммы на общее количество пикселей.
  3. Построение интегральной гистограммы H'_i=\sum_{0 \leqslant < j < i} {H_j} .
  4. Определение нового значения интенсивности пикселя 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; 
}    
Результат выравнивания гистограммы

Рис. 9.11. Результат выравнивания гистограммы
Андрей Терёхин
Андрей Терёхин

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

Демянчик Иван
Демянчик Иван

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

" Искомый объект можно описать с помощью фильтра F= \lbrace f_{x',y'},x' \in \lbrace0, ...,w_f \rbrace , y' \in \lbrace 0,...,h_f \rbrace \rbrace "