Меню Закрыть

Преобразование rgb в hsv

Содержание

Взято из книги Д. Роджерс
"Алгоритмические основы машинной графики"

Смит предложил построить модель субъективного восприятия в виде объемного тела HSV (цветовой тон, насыщенность, светлота).

Hасыщенность меняется от 0 до 1. Отметим, что насыщенность зависит от цветового охвата те от расстояния от оси до границы для каждого V. При S=1 цвета или их дополнения полностью насыщенны. Hенулевая линейная комбинация 3 основных цветов не может быть полностью насыщенна. Если S=0, то тон H неопределен, те на центральной оси находятся ахроматические, серые цвета.

Модель HSV соотвествует тому, как составляют цвета художники. Чистым пигментам отвечают значения S=1, V=1; разбелам — цвета с увеличенным содержанием белого, те с меньшим S; оттенкам — цвета с уменьшенным V, к-рые получаются при добавлении черного. Тон изменяется при уменьшении как V так и S.

Преобразование из цветового пространства RGB->HSV проводиться по данному ниже алгоритму, также взятому у Смита:

«Готовь сани летом» — именно этой пословице мы с другом решили последовать, начав разрабатывать новогоднюю гирлянду на широко известных RGB светодиодах со встроенным драйвером WS2812B.
После того, как было решено, что все программные манипуляции с цветом будем производить в цветовой модели HSV, встал вопрос о конвертере HSV->RGB. Ибо формата отличного от RGB светодиоды не понимают. Использовать готовые конвертеры или тупо переложить в код готовые формулы преобразований, чтобы просто оперировать стандартным пространством HSV — неинтересно. Душа требовала какой-нибудь изюминки. Ну и в общем-то что хотела, то и получила.

О цветовых пространствах

Начать следует наверное с маленького пояснения о цветовых пространствах. Например, можно провести аналогию с радиотехникой. Я думаю, что все кто сидит на we.ee знакомы с обработкой сигналов. И знают, что один и тот же сигнал можно рассматривать через призму разных математических моделей — во временной области, в частотной или вообще в пространстве изображений (Лаплас). И каждое из представлений способно предложить определенные удобства, которые не могут дать другие модели. Аналогично и с цветами. Думаю каждый знаком с цветовой моделью RGB и знает, что для получения необходимого цвета нужно смешать три составляющих (Red, Green, Blue) в определенных пропорциях. Вроде ничего сложного, но это до тех пор, пока не понадобится, например, делать плавное радужное перетекание цветов. Не, ну конечно это реализуемо, ну а если допустим параллельно нужно управлять общей яркостью? Уже чего-то не весело. Но тут на помощью приходят другие цветовые модели.

HSV — Hue, Saturation, Value. А если по-русски то: оттенок(H), насыщенность(S), значение(V, или по-другому яркость). Как видно, здесь уже нет явных компонент цвета, с которыми непонятно что делать в сложных ситуациях, а вполне человеческие характеристики, которыми удобно оперировать.
Любой, кто пользовался растровым редактором сталкивался с этой цветовой моделью. Вот например окно выбора цвета из одной весьма уважаемой программы.

Читайте также:  Как правильно выключать сервер

По горизонтальной оси слева направо изменяется H[0;360гр], по вертикальной S[0;100%], шкала рядом регулирует яркость B[0;100%] (это Brightness, тоже самое что и Value).
Ну а теперь попробуем сделать радужный перелив цветов — легко, просто инкрементируем постоянно значение оттенка(H). Нужно изменить яркость? Проще простого, изменим значение V.

Конвертер HSV->RGB

К сожалению, работа с цветовыми моделями, отличными от RGB, подразумевает обратный переход после всех манипуляций, т.к. RGB-светодиоды по другому и не умеют. Как я уже говорил, готовых конвертеров тьма, а формулы перевода можно хоть на той же википедии посмотреть. Так в чем же «изюм»? А в том, что можно сделать свои собственные цветовые палитры сделать! По умолчанию подразумевается палитра вида: красный, желтый, зеленый, голубой, синий, фиолетовый, красный. Вдоль которой мы можем перемещаться изменяя H.
Но можно сделать палитру в синих тонах например (по горизонтали H, по вертикали S).

А можно например реализовать радугу специально для магистра Йоды: «Где Фазан Сидит, Желает Знать Охотник Каждый».

В общем простор для фантазии безграничный.
И под это дело была написана аппаратнонезависимая микробиблиотека на Си, содержащая пару типов и аж одну функцию =)
Вот содержимое hsv_color_pallete.h

Внутреннее устройство библиотеки вполне прозрачно. Есть массив палитр, а по сути массив структур в несколько слоев, которые заполняются данными во время компиляции вполне очевидными макросами. Ну и есть функция преобразования, которая принимает ссылки на структуры источника и приемника данных, а также имя палитры, и затем творит свои темные преобразовательные дела. Вообщем зачем долго говорить, вот содержимое hsv_color_pallete.c

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

Ну а в итоге мы получаем кастомизированное цветовое пространство HSV, которое открывает широчайшие просторы для создания эффектных программ свечения RGB светодиодов и лент.

С помощью универсального конвертер цветов вы можете легко перевести цвет из одной цветовой модели в ряд других.

Читайте также:  J5804 транзистор параметры цоколевка

В первую очередь, калькулятор служит для удобной работы с современными форматами CSS3-цветов. Поддерживается конвертация из HEX в RGB/RGBA и HSL/HSLA, RGB в CMYK, XYZ, LAB, и обратно.

А также специальный функционал для замещения альфа-канала при переводе цвета из RGBA в RGB (и HSLA в HSL).

Справка по цветовым моделям

Далее приводится краткое описание цветовых систем с которыми работает конвертер, разъяснение по форматам, а также примеры использования полученных цветов в CSS/HTML.

HEX / HTML

Цвет в формате HEX — это ни что иное, как шестнадцатеричное представление RGB.

Цвета представляются в виде трёх групп шестнадцатеричных цифр, где каждая группа отвечает за свой цвет: #112233, где 11 — красный, 22 — зелёный, 33 — синий. Все значения должны быть между 00 и FF.

Во многих приложениях допускается сокращённая форма записи шестнадцатеричных цветов. Если каждая из трёх групп содержит одинаковые символы, например #112233, то их можно записать как #123.

Цветовое пространство RGB (Red, Green, Blue) состоит из всех возможных цветов, которые могут быть получены путём смешивания красного, зелёного, и синего. Эта модель популярна в фотографии, телевидении, и компьютерной графике.

Значения RGB задаются целым числом от 0 до 255. Например, rgb(0,0,255) отображается как синий, так как синий параметр установлен в его самое высокое значение (255), а остальные установлены в 0.

Некоторые приложения (в частности веб-браузеры) поддерживают процентную запись значений RGB (от 0% до 100%).

Цветовые значения RGB поддерживаются во всех основных браузерах.

С недавних пор современные браузеры научились работать с цветовой моделью RGBA — расширением RGB с поддержкой альфа-канала, который определяет непрозрачность объекта.

Значение цвета RGBA задается в виде: rgba(red, green, blue, alpha). Параметр alpha — это число в диапазоне от 0.0 (полностью прозрачный) до 1.0 (полностью непрозрачный).

RGBA поддерживается в IE9+, Firefox 3+, Chrome, Safari, и в Opera 10+.

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

HSL расшифровывается как Hue (цвет/оттенок), Saturation (насыщенность), Lightness/Luminance (светлота/светлость/светимость, не путать с яркостью).

Hue задаёт положение цвета на цветовом круге (от 0 до 360). Saturation является процентным значением насыщенности (от 0% до 100%). Lightness является процентным значением светлости (от 0% до 100%).

HSL поддерживается в IE9+, Firefox, Chrome, Safari, и в Opera 10+.

Читайте также:  Php admin value open basedir

По аналогии с RGB/RGBA, для HSL имеется режим HSLA с поддержкой альфа-канала для указания непрозрачности объекта.

Значение цвета HSLA задается в виде: hsla(hue, saturation, lightness, alpha). Параметр alpha — это число в диапазоне от 0.0 (полностью прозрачный) до 1.0 (полностью непрозрачный).

Цветовая модель CMYK часто ассоциируется с цветной печатью, с полиграфией. CMYK (в отличие от RGB) является субтрактивной моделью, это означает что более высокие значения связаны с более тёмными цветами.

Цвета определяются соотношением голубого (Cyan), пурпурного (Magenta), жёлтого (Yellow), с добавлением чёрного (Key/blacK).

Каждое из чисел, определяющее цвет в CMYK, представляет собой процент краски данного цвета, составляющей цветовую комбинацию, а точнее, размер точки растра, выводимой на фотонаборном аппарате на плёнке данного цвета (или прямо на печатной форме в случае с CTP).

Например, для получения цвета «PANTONE 7526» следует смешать 9 частей голубой краски, 83 частей пурпурной краски, 100 — жёлтой краски, и 46 — чёрной. Это можно обозначить следующим образом: (9,83,100,46). Иногда пользуются такими обозначениями: C9M83Y100K46, или (9%, 83%, 100%, 46%), или (0,09/0,83/1,0/0,46).

HSB / HSV

HSB (также известна как HSV) похожа на HSL, но это две разные цветовые модели. Они обе основаны на цилиндрической геометрии, но HSB/HSV основана на модели «hexcone», в то время как HSL основана на модели «bi-hexcone». Художники часто предпочитают использовать эту модель, принято считать что устройство HSB/HSV ближе к естественному восприятию цветов. В частности, цветовая модель HSB применяется в Adobe Photoshop.

HSB/HSV расшифровывается как Hue (цвет/оттенок), Saturation (насыщенность), Brightness/Value (яркость/значение).

Hue задаёт положение цвета на цветовом круге (от 0 до 360). Saturation является процентным значением насыщенности (от 0% до 100%). Brightness является процентным значением яркости (от 0% до 100%).

Цветовая модель XYZ (CIE 1931 XYZ) является чисто математическим пространством. В отличие от RGB, CMYK, и других моделей, в XYZ основные компоненты являются «мнимыми», то есть вы не можете соотнести X, Y, и Z с каким-либо набором цветов для смешивания. XYZ является мастер-моделью практически всех остальных цветовых моделей, используемых в технических областях.

Цветовая модель LAB (CIELAB, «CIE 1976 L*a*b*») вычисляется из пространства CIE XYZ. При разработке Lab преследовалась цель создания цветового пространства, изменение цвета в котором будет более линейным с точки зрения человеческого восприятия (по сравнению с XYZ), то есть с тем, чтобы одинаковое изменение значений координат цвета в разных областях цветового пространства производило одинаковое ощущение изменения цвета.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.