Опубликован: 20.08.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Самостоятельная работа 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).

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

Сергей Кротов
Сергей Кротов
Россия
Дмитрий Донсков
Дмитрий Донсков
Россия, Москва, Московский Авиационный Институт