Новосибирский Государственный Университет
Опубликован: 20.08.2013 | Доступ: свободный | Студентов: 858 / 36 | Длительность: 14:11:00
Самостоятельная работа 2:

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

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

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

  • линейная растяжка гистограммы (линейное контрастирование),
  • нормализация гистограммы,
  • выравнивание (линеаризация или эквализация, 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 пикселей. Количество уровней квантования яркости пикселей (число бинов) составляет J. Тогда в среднем на каждый уровень яркости должно выпадать n_{aver} = \frac{N \cdot M}{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} \le y \le y_{max}\\
0,\ в\ противном\ случае\\
\end{cases}

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

F_{x}(x)=F_{y}(y) = \int_{y_{min}}^{y}{w_{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\leq x \leq 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 \leq j < H_{j}.
  4. Определение нового значения интенсивности пикселя 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; 
}   
    
Результат выравнивания гистограммы

Рис. 7.11. Результат выравнивания гистограммы
Александра Максимова
Александра Максимова

При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка?
 

Алена Борисова
Алена Борисова

В лекции по обработке полутоновых изображений (http://www.intuit.ru/studies/courses/10621/1105/lecture/17979?page=2) увидела следующий фильтр:


    \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 2 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array} - \frac{1}{9} \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 1 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array}

В описании говорится, что он "делает изображение более чётким, потому что, как видно из конструкции фильтра, в однородных частях изображение не изменяется, а в местах изменения яркости это изменение усиливается".

Что вижу я в конструкции фильтра (скорее всего ошибочно): F(x, y) = 2 * I(x, y) - 1/9 I(x, y) = 17/9 * I(x, y), где F(x, y) - яркость отфильтрованного пикселя, а I(x, y) - яркость исходного пикселя с координатами (x, y). Что означает обычное повышение яркости изображения, при этом без учета соседних пикселей (так как их множители равны 0).

Объясните, пожалуйста, как данный фильтр может повышать четкость изображения?