Еквалізація гістограм для підвищення якості зображень

Всім привіт. Зараз ми з науковим керівником готуємо до видання монографію, де намагаємося простими словами розповісти про основи цифрової обробки зображень. В даній статті розкривається дуже проста, але в теж час дуже ефективна методика підвищення якості зображень — еквалізація гістограм.

Для простоти почнемо розгляд з монохромних зображень (тобто зображень, що містять інформацію лише про яскравість, але не про колір пікселів). Гістограмою зображення будемо називати дискретну функцію 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 і := 0 to k do
  9.     h[i] := 0;
  10.   for і := 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 і := 0 to k do
  14.     h[i] := h[i] / (self.Height * self.Width);
  15.  
  16.   for і := 1 to k do
  17.     h[i] := h[i - 1] + h[i];
  18.   for і := 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. Еквалізація різних колірних каналів

Сподіваюся, цей матеріал здався вам як мінімум цікавим, як максимум корисним. Спасибі.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.