Программирование - это просто
Advertisement
Главная arrow Математика и информатика arrow Теория и практика компьютерной графики. arrow Теория и практика компьютерной графики. Урок 6. Цветовая модель HSV
09.05.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Теория и практика компьютерной графики. Урок 6. Цветовая модель HSV Печать E-mail
Автор megabax   
10.05.2023 г.
New Page 1

Теория и практика компьютерной графики. Урок 6. Цветовая модель HSV

Чтобы смотреть урок полностью, подпишитесь на платный раздел.

В платном разделе статья находится здесь.


На уроке Теория и практика компьютерной графики. Урок 1. Растровые модели изображений мы с вами познакомились с различными моделями цветового представления, в частности, с RGB, CMYK, XYZ, YCbCr. Сегодня я расскажу о цветовой модели HSV, и мы ее даже запрограммируем.  Но прежде всего, я расскажу о том, для чего нужна данная модель. Дело в том, что RGB не всегда хорошо подходит для анализа информации. Эксперименты показывают, что геометрическая близость цветов достаточно далека от того, как человек воспринимает близость тех или иных цветов друг к другу....

...

... Цветовое пространство HSV удобнее всего представлять в виде конуса, цвет задается положением на окружности, насыщенность - расстоянием от центральной оси конуса, а яркость - высотой относительно вершины конуса*:

Теория и практика компьютерной графики. Урок 5. Цветовая модель HSV

Таким образом, сама черная точка - это вершина конуса, самая белая - центр основания, а самая "цветная" - лежит на окружность основания конуса....

...

...Теперь перейдем к программе на C#:

    /// <summary>

    /// Точка кадра изображения

    /// </summary>

    public class FramePoint

    {

        /// <summary>

        /// Hue - (сам цвет), от 0 до 1

        /// </summary>

        public double H;

 

        /// <summary>

        /// Saturation — насыщенность. Варьируется в пределах 0—1

        /// </summary>

        public double S;

 

        /// <summary>

        /// Value (значение цвета) или Brightness — яркость. Также задаётся в пределах 0—1

        /// </summary>

        public double V;

 

...

...

...       

В данном листинге представлен класс, который реализует точку изображения, цвет которой храниться в формате HSV. Класс позволяет перевести из данного цветового пространства в RGB, а также, если у нас есть значение RGB, то класс позволяет перевести ее в HSV.

Для того, чтобы провести ряд экспериментов, в исходниках предусмотрена простенькая обертка для данной модели ...

...

 

Суть теста в том, что сначала я перевожу из RGB в HSV, потом обратно. После этого значения RGB не должны измениться. Если изменили - в программе ошибка. Обращаю ваше внимание на то, что если вы захотите запрограммировать какую то другую цветовую модель, предусмотрев конвертацию туда и обратно, тестируйте именно так, покрывая тестами все цветовое пространство  - примерно 16 млн. итераций - это не так уж и много для компьютера, тест будет идти несколько секунд. Но зато вы будете уверены, что ваш алгоритм всегда работает правильно. Потом его надо будет тестировать только в том случае, если вы внесли в него изменения.

Кром юнит теста, полезно сделать и функциональный текс - конвертируйте картинку туда и обратно:

 

    public partial class MainForm : Form

    {

        /// <summary>

        /// Кадр

        /// </summary>

        public Frame frame;

 

        public MainForm()

        {

            InitializeComponent();

            create_matrix("D:\\3\\DSCN0116.png");

        }

 

        /// <summary>

        /// Создать матрицу

        /// </summary>

        /// <param name="file_name">Имя открываемого файла</param>

        private void create_matrix(string file_name)

        {

            Bitmap picture = new Bitmap(file_name);

            Bitmap picture1;

            using (var wrapper = new ImageWrapper(picture, true))

            {

                frame = new Frame(wrapper.Width, wrapper.Height);

                picture1 = new Bitmap(wrapper.Width, wrapper.Height);

                for (int i = 0; i < wrapper.Width; i++)

                {

                    for (int j = 0; j < wrapper.Height; j++)

                    {

                        Color color = wrapper[i, j];

                        frame.matrix[i, j] = new FramePoint(color.R, color.G, color.B);

                    }

                }

 

                using (var wrapper1 = new ImageWrapper(picture1, true))

                {

                    for (int i = 0; i < wrapper1.Width; i++)

                    {

                        for (int j = 0; j < wrapper1.Height; j++)

                        {

                            Color color = frame.matrix[i, j].get_color();

                            wrapper1[i, j] = color;

                        }

                    }

                }

 

            }

            pictureBox1.Image = picture;

            pictureBox2.Image = picture1;

        }

    }

 

Результат наглядно показывает, что все работает правильно:

Теория и практика компьютерной графики. Урок 5. Цветовая модель HSV

 

Теперь попробуем провести ряд экспериментов. ...

 

...

...

 

...Вот что получиться в результате:

Теория и практика компьютерной графики. Урок 5. Цветовая модель HSV

 

Аналогично оставим только канал яркости (монохромное изображениеt):

Теория и практика компьютерной графики. Урок 5. Цветовая модель HSV

 

Канал насыщенности:

Теория и практика компьютерной графики. Урок 5. Цветовая модель HSV

 

Довольно интересный эффект получим, присвоив всем точкам максимальную насыщенность:

Теория и практика компьютерной графики. Урок 5. Цветовая модель HSV

 

 


* «HSV cone». Под лицензией CC BY-SA 3.0 с сайта Викисклада - https://commons.wikimedia.org/wiki/File:HSV_cone.png#/media/File:HSV_cone.png

Последнее обновление ( 10.08.2023 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги