Что такое линейное растяжение гистограммы
Всем привет. Сейчас мы с научным руководителем готовим к изданию монографию, где пытаемся простыми словами рассказать об основах цифровой обработки изображений. В данной статье раскрывается очень простая, но в тоже время очень эффективная методика повышения качества изображений – эквализация гистограмм.
Для простоты начнём рассмотрение с монохромных изображений (т.е. изображений содержащих информацию только о яркости, но не о цвете пикселей). Гистограммой изображения будем называть дискретную функцию H, определённую на множестве значений [0;2bpp], где bpp – количество бит, отводимое для кодирования яркости одного пиксела. Хоть это и не является обязательным, но гистограммы часто нормируют в диапазон [0;1], выполняя деление каждого значения функции H[i] на общее количество пикселов изображения. В Табл. 1 представлены примеры тестовых изображений и гистограмм, построенных на их основе:
Табл. 1. Изображения и их гистограммы
Внимательно изучив соответствующую гистограмму можно сделать некоторые выводы и о самом исходном изображении. Например, гистограммы очень тёмных изображений характеризуются тем, что ненулевые значения гистограммы сконцентрированы около нулевых уровней яркости, а для очень светлых изображений наоборот – все ненулевые значения сконцентрированы в правой части гистограммы.
Интуитивно можно сделать вывод, что наиболее удобным для восприятия человеком будет изображение, у которого гистограмма близка к равномерному распределению. Т.е. для улучшения визуального качества к изображению надо применить такое преобразование, чтобы гистограмма результата содержала все возможные значения яркости и при этом в примерно одинаковом количестве. Такое преобразование называется эквализацией гистограммы и может быть выполнено с помощью кода, приведённого в Листинг 1.
Листинг 1. Реализация процедуры эквализации гистограммы
- procedure TCGrayscaleImage.HistogramEqualization;
- const
- k = 255;
- var
- h: array [0 .. k] of double;
- i, j: word;
- begin
- for i := 0 to k do
- h[i] := 0;
- for i := 0 to self.Height — 1 do
- for j := 0 to self.Width — 1 do
- h[round(k * self.Pixels[i, j])] := h[round(k * self.Pixels[i, j])] + 1;
- for i := 0 to k do
- h[i] := h[i] / (self.Height * self.Width);
- for i := 1 to k do
- h[i] := h[i — 1] + h[i];
- for i := 0 to self.Height — 1 do
- for j := 0 to self.Width — 1 do
- self.Pixels[i, j] := h[round(k * self.Pixels[i, j])];
- end;
В результате эквализации гистограммы в большинстве случаев существенно расширяется динамический диапазон изображения, что позволяет отобразить ранее не замеченные детали. Особенно сильно этот эффект проявляется на тёмных изображениях, что показано в Табл. 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) гистограммы.
Линейная растяжка сводится к присваиванию новых значений интенсивности каждому пикселю изображения. Если интенсивности исходного изображения изменялись в диапазоне от до , тогда необходимо линейно «растянуть» указанный диапазон так, чтобы значения изменялись от 0 до 255. Для этого достаточно пересчитать старые значения интенсивности для всех пикселей согласно формуле , где коэффициенты просто вычисляются, исходя из того, что граница должна перейти в 0, а – в 255.
Нормализация гистограммы в отличие от предыдущего метода обеспечивает растяжку не всего диапазона изменения интенсивностей, а только его наиболее информативной части. Под информативной частью понимается набор пиков гистограммы, т.е. интенсивности, которые чаще остальных встречаются на изображении. Бины, соответствующие редко встречающимся интенсивностям, в процессе нормализации отбрасываются, далее выполняется обычная линейная растяжка получившейся гистограммы.
Выравнивание гистограмм – это один из наиболее распространенных способов. Цель выравнивания состоит в том, чтобы все уровни яркости имели бы одинаковую частоту, а гистограмма соответствовала равномерному закону распределения. Допустим, что задано изображение в оттенках серого, которое имеет разрешение пикселей. Количество уровней квантования яркости пикселей (число бинов) составляет . Тогда в среднем на каждый уровень яркости должно выпадать пикселей. Базовая математика лежит в сопоставлении двух распределений. Пусть – случайные величины, описывающие изменение интенсивности пикселей на изображениях, – плотность распределения интенсивности на исходном изображении, – желаемая плотность распределения. Необходимо найти преобразование плотностей распределения , которое позволило бы получить желаемую плотность:
Обозначим через и интегральные законы распределения случайных величин и . Из условия вероятностной эквивалентности следует, что . Распишем интегральный закон распределения по определению:
Отсюда получаем, что
Осталось выяснить, как оценить интегральный закон распределения . Для этого необходимо сначала построить гистограмму исходного изображения, затем нормализовать полученную гистограмму, разделив величину каждого бина на общее количество пикселей . Значения бинов можно рассматривать как приближенное значение функции плотности распределения . Таким образом, значение интегральной функции распределения можно представить как сумму следующего вида:
Построенную оценку можно использовать для вычисления новых значений интенсивности. Заметим, что перечисленные преобразования гистограмм можно применять не только ко всему изображению, но и к отдельным его частям.
В библиотеке OpenCV реализована функция equalizeHist, которая обеспечивает повышение контрастности изображения посредством выравнивания гистограммы [1, 7]. Прототип функции показан ниже.
Функция работает в четыре этапа:
- Вычисление гистограммы исходного изображения src. Отметим, что src – 8-битное одноканальное изображение.
- Нормализация гистограммы. Нормализация посредством деления величины каждого бина гистограммы на общее количество пикселей.
- Построение интегральной гистограммы .
- Определение нового значения интенсивности пикселя dst(x,y) = H'(src(x,y)).
Далее приведем пример программы, обеспечивающей выравнивание гистограммы. Приложение принимает в качестве аргумента командной строки название исходного изображения. После выполнения операции выравнивания гистограммы выполняется отображение исходного изображения1, переведенного в оттенки серого (рис. 7.11, слева), и изображения с выровненной гистограммой (рис. 7.11, справа).
#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 битные бмп файлы были. |
Member Рейтинг (т): 17 | CoGNaC |
Full Member Рейтинг (т): 2 | x128, спасибо за ответ. Что вы имеете ввиду под словом «канал RGB» — значение яркости пикселя? С минимума и максимума я понял. А вот с растяжением как раз у меня возникают трудности, растягивать с помощью линейной функции?) |
Member Рейтинг (т): 17 | Цитата CoGNaC @ 17.12.09, 08:11 Что вы имеете ввиду под словом «канал RGB» — значение яркости пикселя? значение яркости для отдельно взятого компонента R, G и B. Цитата CoGNaC @ 17.12.09, 08:11 А вот с растяжением как раз у меня возникают трудности, растягивать с помощью линейной функции? все зависит от задачи, в простом случае линейно: |
Full Member Рейтинг (т): 2 | Спасибо всем! И отдельный вопрос, как подсчитать сложность выполнения алгоритма? :huh: |
В данном случае: |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
[ Script Execution time: 0,0704 ] [ 15 queries used ] [ Generated: 16.07.20, 22:53 GMT ]
Источник
2.8. Выравнивание гистограмм
Существует три основных метода повышения контраста изображения:
- линейная растяжка гистограммы (линейное контрастирование),
- нормализация гистограммы,
- выравнивание (линеаризация или эквализация, equalization) гистограммы.
Линейная растяжка сводится к присваиванию новых значений интенсивности каждому пикселю изображения. Если интенсивности исходного изображения изменялись в диапазоне от до , тогда необходимо линейно «растянуть» указанный диапазон так, чтобы значения изменялись от 0 до 255. Для этого достаточно пересчитать старые значения интенсивности для всех пикселей согласно формуле , где коэффициенты просто вычисляются, исходя из того, что граница должна перейти в 0, а – в 255.
Нормализация гистограммы в отличие от предыдущего метода обеспечивает растяжку не всего диапазона изменения интенсивностей, а только его наиболее информативной части. Под информативной частью понимается набор пиков гистограммы, т.е. интенсивности, которые чаще остальных встречаются на изображении. Бины, соответствующие редко встречающимся интенсивностям, в процессе нормализации отбрасываются, далее выполняется обычная линейная растяжка получившейся гистограммы.
Выравнивание гистограмм – это один из наиболее распространенных способов. Цель выравнивания состоит в том, чтобы все уровни яркости имели бы одинаковую частоту, а гистограмма соответствовала равномерному закону распределения. Допустим, что задано изображение в оттенках серого, которое имеет разрешение пикселей. Количество уровней квантования яркости пикселей (число бинов) составляет . Тогда в среднем на каждый уровень яркости должно выпадать пикселей. Базовая математика лежит в сопоставлении двух распределений. Пусть – случайные величины, описывающие изменение интенсивности пикселей на изображениях, – плотность распределения интенсивности на исходном изображении, – желаемая плотность распределения. Необходимо найти преобразование плотностей распределения , которое позволило бы получить желаемую плотность:
Обозначим через и интегральные законы распределения случайных величин и . Из условия вероятностной эквивалентности следует, что . Распишем интегральный закон распределения по определению:
Отсюда получаем, что
Осталось выяснить, как оценить интегральный закон распределения . Для этого необходимо сначала построить гистограмму исходного изображения, затем нормализовать полученную гистограмму, разделив величину каждого бина на общее количество пикселей . Значения бинов можно рассматривать как приближенное значение функции плотности распределения . Таким образом, значение интегральной функции распределения можно представить как сумму следующего вида:
Построенную оценку можно использовать для вычисления новых значений интенсивности. Заметим, что перечисленные преобразования гистограмм можно применять не только ко всему изображению, но и к отдельным его частям.
В библиотеке OpenCV реализована функция equalizeHist, которая обеспечивает повышение контрастности изображения посредством выравнивания гистограммы [1, 7]. Прототип функции показан ниже.
Функция работает в четыре этапа:
- Вычисление гистограммы исходного изображения src. Отметим, что src – 8-битное одноканальное изображение.
- Нормализация гистограммы. Нормализация посредством деления величины каждого бина гистограммы на общее количество пикселей.
- Построение интегральной гистограммы .
- Определение нового значения интенсивности пикселя dst(x,y) = H'(src(x,y)).
Далее приведем пример программы, обеспечивающей выравнивание гистограммы. Приложение принимает в качестве аргумента командной строки название исходного изображения. После выполнения операции выравнивания гистограммы выполняется отображение исходного изображения1, переведенного в оттенки серого (рис. 7.11, слева), и изображения с выровненной гистограммой (рис. 7.11, справа).
#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.
Результат выравнивания гистограммы
Источник