Что такое линейное растяжение гистограммы

Что такое линейное растяжение гистограммы thumbnail

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

Для простоты начнём рассмотрение с монохромных изображений (т.е. изображений содержащих информацию только о яркости, но не о цвете пикселей). Гистограммой изображения будем называть дискретную функцию H, определённую на множестве значений [0;2bpp], где bpp – количество бит, отводимое для кодирования яркости одного пиксела. Хоть это и не является обязательным, но гистограммы часто нормируют в диапазон [0;1], выполняя деление каждого значения функции H[i] на общее количество пикселов изображения. В Табл. 1 представлены примеры тестовых изображений и гистограмм, построенных на их основе:
Табл. 1. Изображения и их гистограммы

Внимательно изучив соответствующую гистограмму можно сделать некоторые выводы и о самом исходном изображении. Например, гистограммы очень тёмных изображений характеризуются тем, что ненулевые значения гистограммы сконцентрированы около нулевых уровней яркости, а для очень светлых изображений наоборот – все ненулевые значения сконцентрированы в правой части гистограммы.
Интуитивно можно сделать вывод, что наиболее удобным для восприятия человеком будет изображение, у которого гистограмма близка к равномерному распределению. Т.е. для улучшения визуального качества к изображению надо применить такое преобразование, чтобы гистограмма результата содержала все возможные значения яркости и при этом в примерно одинаковом количестве. Такое преобразование называется эквализацией гистограммы и может быть выполнено с помощью кода, приведённого в Листинг 1.
Листинг 1. Реализация процедуры эквализации гистограммы

  1. procedure TCGrayscaleImage.HistogramEqualization;
  2. const
  3.   k = 255;
  4. var
  5.   h: array [0 .. k] of double;
  6.   i, j: word;
  7. begin
  8.   for i := 0 to k do
  9.     h[i] := 0;
  10.   for i := 0 to self.Height — 1 do
  11.     for j := 0 to self.Width — 1 do
  12.       h[round(k * self.Pixels[i, j])] := h[round(k * self.Pixels[i, j])] + 1;
  13.   for i := 0 to k do
  14.     h[i] := h[i] / (self.Height * self.Width);
  15.  
  16.   for i := 1 to k do
  17.     h[i] := h[i — 1] + h[i];
  18.   for i := 0 to self.Height — 1 do
  19.     for j := 0 to self.Width — 1 do
  20.       self.Pixels[i, j] := h[round(k * self.Pixels[i, j])];
  21. end;
  22.  

В результате эквализации гистограммы в большинстве случаев существенно расширяется динамический диапазон изображения, что позволяет отобразить ранее не замеченные детали. Особенно сильно этот эффект проявляется на тёмных изображениях, что показано в Табл. 2. Кроме того, стоит отметить ещё одну важную особенность процедуры эквализации: в отличие от большинства фильтров и градационных преобразований, требующих настройки параметров (апертуры и констант градационных преобразований) эквализация гистограммы может выполняться в полностью автоматическом режиме без участия оператора.
Табл. 2. Изображения и их гистограммы после эквализации

Легко можно заметить, что гистограммы после эквализации имеют своеобразные заметные разрывы. Это связано с тем, что динамический диапазон выходного изображения шире диапазона исходного. Очевидно, что в этом случае рассмотренное в Листинг 1 отображение не может обеспечить ненулевые значения во всех карманах гистограммы. Если всё-таки необходимо добиться более естественного вида выходной гистограммы, можно использовать случайное распределение значений i-ого кармана гистограммы в некоторой его окрестности.
Очевидно, что эквализация гистограмм позволяет легко повышать качество монохромных изображений. Естественно хочется применить подобный механизм и к цветным изображениям.
Большинство не очень опытных разработчиков представляют изображение в виде трёх цветовых каналов RGB и пытаются применить процедуру эквализации гистограммы к каждому цветовому в отдельности. В некоторых редких случаях это позволяет добиться успеха, но в большинстве случаев результат так себе (цвета получаются неестественными и холодными). Это связано с тем, что модель RGB неточно отображает цветовосприятие человека.
Вспомним о другом цветовом пространстве – HSI. Эта цветовая модель (и другие родственные ей) очень широко используются иллюстраторами и дизайнерам так как позволяют оперировать более привычными для человека понятиями цветового тона, насыщенности и интенсивности.
Если рассмотреть проекцию RGB-куба в направлении диагонали белый-чёрный, то получится шестиугольник, углы которого соответствуют первичным и вторичным цветам, а все серые оттенки (лежащие на диагонали куба) при этом проецируются в центральную точку шестиугольника (см. Рис. 1):

Рис. 1. Проекция цветового куба
Чтобы с помощью этой модели можно было закодировать все цвета, доступные в RGB-модели, необходимо добавить вертикальную ось светлоты (или интенсивности) (I). В итоге получается шестигранный конус (Рис. 2, Рис. 3):

Рис. 2. Пирамида HSI (вершины)
В этой модели цветовой тон (H) задаётся углом относительно оси красного цвета, насыщенность (S) характеризует чистоту цвета (1 означает совершенно чистый цвет, а 0 соответствует оттенку серого). При нулевом значении насыщенности тон не имеет смысла и не определен.

Читайте также:  Растяжение ноги к какому врачу

Рис. 3. Пирамида HSI
В Табл. 3 показано разложение изображения по компонентам HSI (белые пикселы в канале тона соответствуют нулевой насыщенности):
Табл. 3. Цветовое пространство HSI

Считается, что для повышения качества цветных изображений наиболее эффективно применять процедуру эквализации к каналу интенсивности. Именно это и продемострировано в Табл. 4
Табл. 4. Эквализация различных цветовых каналов

Надеюсь, этот материал показался вам как минимум интересным, как максимум полезным. Спасибо.

Источник

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),0leq 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, переведенного в оттенки серого (рис. 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 namen»;

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. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code…/code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии «срочно надо», заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке 🙂

 Нормализация гистограммы, алгоритм

Full Member

Рейтинг (т): 2

здравствуйте. Наткнулся на статью Цифровая обработка изображения, не могу разобраться с методом Нормализации гистограммы. Метод описан так:

Цитата

Еще более можно улучшить контраст, используя нормализацию гистограммы. При этом на весь максимальный интервал уровней яркости [0, 255] растягивается не вся гистограмма, лежащая в пределах от fмин до fмакс, а её наиболее интенсивный участок (fмин’, fмакс’), из рассмотрения исключаются малоинформативные «хвосты». На рис. 2б исключено 5% пикселов.

Не понимаю, что они имеют ввиду под словом «растягивается» — линейное растяжение или какое? Кто знаком с этим, подскажите. Или поделитесь своими догадками)

Junior

Рейтинг (т): 6

Линейное растяжение, IMHO.

Full Member

Рейтинг (т): 2

у меня в курсе систем цифровых обработок изображений шло как выделение поддиапазона:

    for i:=0 to Image1.Picture.Bitmap.Height-1 do begin

     Line:=Image1.Picture.Bitmap.ScanLine[i];

     for j:=0 to Image1.Picture.Bitmap.Width*3-1 do begin

      temp:=round(255*(Line^[j]-c1)/(c2-c1));

      goodc0(temp); //функция преобразования параметра в положительное от 0 до 255.

      Line^[j]:=temp;

     end;

    end;

Full Member

Рейтинг (т): 2

Lamer#1,напиши, пожалуйста, комментарии, а то я не совсем понимаю.

    for j:=0 to Image1.Picture.Bitmap.Width*3-1 do begin //почему тут умножаем на 3?

      temp:=round(255*(Line^[j]-c1)/(c2-c1));//что такое с1,с2 и что имеется ввиду под Line^[j]

      goodc0(temp); //функция преобразования параметра в положительное от 0 до 255.

      Line^[j]:=temp;

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

Full Member

Рейтинг (т): 2

CoGNaC, думаю хелп в помощь по сканлайну и битмапу. у меня 24 битные бмп файлы были.
с1 с2 — это (fмин’, fмакс’) твои.

Member

Рейтинг (т): 17

CoGNaC
для каждого канала RGB считаешь вес значений, далее по коэффициенту (подбирается экспериментально или задается интерактивно) находишь первое значение в начале и конце гистограммы которое >= заданному коэффициенту и таким образом находится минимум и максимум который и нужно растянуть в диапазон 0..255.

Full Member

Рейтинг (т): 2

x128, спасибо за ответ. Что вы имеете ввиду под словом «канал RGB» — значение яркости пикселя? С минимума и максимума я понял. А вот с растяжением как раз у меня возникают трудности, растягивать с помощью линейной функции?)

Member

Рейтинг (т): 17

Цитата CoGNaC @ 17.12.09, 08:11

Что вы имеете ввиду под словом «канал RGB» — значение яркости пикселя?

значение яркости для отдельно взятого компонента R, G и B.

Цитата CoGNaC @ 17.12.09, 08:11

А вот с растяжением как раз у меня возникают трудности, растягивать с помощью линейной функции?

все зависит от задачи, в простом случае линейно:
к=округлить((к-минимум)*255/(максимум-минимум)) где к=текущий пиксел компонента.

Full Member

Рейтинг (т): 2

Спасибо всем! И отдельный вопрос, как подсчитать сложность выполнения алгоритма? :huh:

В данном случае:
построение гистограммы O(N), где N — число пикселей;
определение границ O(M), где M — число градаций, как правило M много меньше N;
нормализация O(N).
В результате получаем O(N) — сложность пропорциональна размеру картинки, быстрее просто нельзя
Даже более сложная обработка, типа выравнивания гистограммы или подбор гаммы не увеличивает порядок сложности.

Читайте также:  Допускаемое напряжение на растяжение шпилек

0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

0 пользователей:

[ Script Execution time: 0,0704 ]   [ 15 queries used ]   [ Generated: 16.07.20, 22:53 GMT ]  

Источник

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),0leq 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, переведенного в оттенки серого (рис. 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 namen»;

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.
Результат выравнивания гистограммы

Источник