Эквализация гистограмм для повышения качества изображений

Всем привет. Сейчас мы с научным руководителем готовим к изданию монографию, где пытаемся простыми словами рассказать об основах цифровой обработки изображений. В данной статье раскрывается очень простая, но в тоже время очень эффективная методика повышения качества изображений — эквализация гистограмм.Для простоты начнём рассмотрение с монохромных изображений (т.е. изображений содержащих информацию только о яркости, но не о цвете пикселей). Гистограммой изображения будем называть дискретную функцию H, определённую на множестве значений [0;2bpp], где bpp — количество бит, отводимое для кодирования яркости одного пиксела. Хоть это и не является обязательным, но гистограммы часто нормируют в диапазон [0;1], выполняя деление каждого значения функции H[i] на общее количество пикселов изображения. В Табл. 1 представлены примеры тестовых изображений и гистограмм, построенных на их основе: Табл. 1. Изображения и их гистограммыe4dfe170b6544bb499e45a072ca1d3db.pngВнимательно изучив соответствующую гистограмму можно сделать некоторые выводы и о самом исходном изображении. Например, гистограммы очень тёмных изображений характеризуются тем, что ненулевые значения гистограммы сконцентрированы около нулевых уровней яркости, а для очень светлых изображений наоборот — все ненулевые значения сконцентрированы в правой части гистограммы.Интуитивно можно сделать вывод, что наиболее удобным для восприятия человеком будет изображение, у которого гистограмма близка к равномерному распределению. Т.е. для улучшения визуального качества к изображению надо применить такое преобразование, чтобы гистограмма результата содержала все возможные значения яркости и при этом в примерно одинаковом количестве. Такое преобразование называется эквализацией гистограммы и может быть выполнено с помощью кода, приведённого в Листинг 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. Изображения и их гистограммы после эквализации0831c8b217fc41cc9019e9e183293b74.pngЛегко можно заметить, что гистограммы после эквализации имеют своеобразные заметные разрывы. Это связано с тем, что динамический диапазон выходного изображения шире диапазона исходного. Очевидно, что в этом случае рассмотренное в Листинг 1 отображение не может обеспечить ненулевые значения во всех карманах гистограммы. Если всё-таки необходимо добиться более естественного вида выходной гистограммы, можно использовать случайное распределение значений i-ого кармана гистограммы в некоторой его окрестности.Очевидно, что эквализация гистограмм позволяет легко повышать качество монохромных изображений. Естественно хочется применить подобный механизм и к цветным изображениям.Большинство не очень опытных разработчиков представляют изображение в виде трёх цветовых каналов RGB и пытаются применить процедуру эквализации гистограммы к каждому цветовому в отдельности. В некоторых редких случаях это позволяет добиться успеха, но в большинстве случаев результат так себе (цвета получаются неестественными и холодными). Это связано с тем, что модель RGB неточно отображает цветовосприятие человека.Вспомним о другом цветовом пространстве — HSI. Эта цветовая модель (и другие родственные ей) очень широко используются иллюстраторами и дизайнерам так как позволяют оперировать более привычными для человека понятиями цветового тона, насыщенности и интенсивности.Если рассмотреть проекцию RGB-куба в направлении диагонали белый-чёрный, то получится шестиугольник, углы которого соответствуют первичным и вторичным цветам, а все серые оттенки (лежащие на диагонали куба) при этом проецируются в центральную точку шестиугольника (см. Рис. 1): 5a21854ebfcf493ab7e0a32bbd3150ee.pngРис. 1. Проекция цветового кубаЧтобы с помощью этой модели можно было закодировать все цвета, доступные в RGB-модели, необходимо добавить вертикальную ось светлоты (или интенсивности) (I). В итоге получается шестигранный конус (Рис. 2, Рис. 3): cffaac5180d248799865c07b7e2084ef.pngРис. 2. Пирамида HSI (вершины)В этой модели цветовой тон (H) задаётся углом относительно оси красного цвета, насыщенность (S) характеризует чистоту цвета (1 означает совершенно чистый цвет, а 0 соответствует оттенку серого). При нулевом значении насыщенности тон не имеет смысла и не определен.a3a2a66b8a974632ac355f345f0d7851.pngРис. 3. Пирамида HSIВ Табл. 3 показано разложение изображения по компонентам HSI (белые пикселы в канале тона соответствуют нулевой насыщенности): Табл. 3. Цветовое пространство HSI88476261dfd64159b332bf65787bf992.pngСчитается, что для повышения качества цветных изображений наиболее эффективно применять процедуру эквализации к каналу интенсивности. Именно это и продемострировано в Табл. 4Табл. 4. Эквализация различных цветовых каналовd9143eb70fc34b0c9c6cac32a0b77cfb.pngНадеюсь, этот материал показался вам как минимум интересным, как максимум полезным. Спасибо.

© Habrahabr.ru