Преобразование RGB в HLS и обратно
Я использую библиотеку python colorsys для преобразования значений цвета RGB в HLS. Просто чтобы проверить, я попробовал конвертировать обратно в RGB и получил другое значение. Я могу понять небольшие различия из-за точности вопросов, но эти значения существенно отличаются.
Зеленое значение отключено более чем на 200%
Я попробовал другие значения, и каждый раз, когда один из компонентов отключен на значительную сумму. Я что-то пропустил?
Ваши значения являются способами, вне границ цветового пространства.
Координаты во всех этих цветовых пространствах являются значениями с плавающей запятой. В пространстве YIQ координата Y находится между 0 и 1, но координаты я и Q могут быть положительными или отрицательными. Во всех остальных пространствах координаты находятся между 0 и 1.
Я предполагаю, что вы ожидаете, что они будут байтовыми значениями от 0 до 255? Просто сначала разделите на 255:
Если вы хотите понять, почему вы получаете такие нелепые ошибки, когда вы выходите за пределы цветового пространства.
Хорошо, сначала прочитайте два документа, связанные с документами, чтобы понять, почему значения вне цветового пространства не имеют смысла, и почему вы просите его генерировать значения до невозможных ограничений. Затем, чтобы точно выяснить, почему это не удается, как это происходит, а не каким-либо другим способом, вам нужно знать, какой алгоритм он использует, — что довольно просто, поскольку документы связаны с исходным кодом, который является чистым Python и довольно читаемым.
(PS, я могу себе представить, что может выглядеть 9650% легкости, но мне любопытно, что -100% насыщенности. Возможно, что-то Lovecraftian.)
Faq преобразование цвета rgb < > hls
У меня есть значения HLS цвета. Мне их нужно конвертированть в соответствующие значения RGB. Для этого есть такая ф-ция:
procedure HLStoRGB(H, L, S: Integer; var R, G, B: Integer);
Var
Magic1, Magic2: single;
function HueToRGB(n1, n2, hue: single): single;
begin
if (hue HLSMAX) then hue:=hue-HLSMAX;
if (hue RGBMAX then R:=RGBMAX;
if G RGBMAX then G:=RGBMAX;
if B RGBMAX then B:=RGBMAX;
end;
Обьясните, как она работает?
Это все хорошо, но мне бы хотелось получить закомментированный код именно ПРИВЕДЕННОЙ ВЫШЕ процедуры.
P.S. Такое впечатление, что все вопросы можно отправлять сразу тебе, а не в конференцию
> Tahion2 [2]
упрямый какой — чужие исходники, да с комментами.
найди delphi 6, там в исходниках vcl есть модуль graphutil.pas.
в нём есть как раз такая функция, там даже немного комментариев разбросано.
Исходники то не полные. Откуда же я знаю значения констант
> Исходники то не полные. Откуда же я знаю значения констант
>
Любой каприз, сэр:
Const
HLSMAX=240;
RGBMAX=255;
UNDEFINED=(HLSMAX*2)div 3;
Так, ч честно пытасно закомментировать, но а) лень б) невозможно, если человек не знает, что отображает Hue
Поэтому, что вот получившееся:
< Максимальное значение для H, L и S. Дело в том, что в реальности
H является углом и принимает значения 0..360, а L и S принимают
значения от 0 до 1 (например, 0.1). Однако по принципу типа RGB
нужно, чтобы HLS принимало значения в пределах типа Byte. Можно было
бы присвоить HLSMAX = 255, но дело в том, что хорошо бы, если HLSMAX
делится на 6 (или даже на 12), поэтому взяли HLSMAX = 240 >
< Максимальное значений каждой из состовляющих значение RGB.
Напомню, что RGB кодируется тремя состовляющими — красного (R),
зелёного (G) и синего (B) цветов, каждая из которых может принимать
значения от 0 до 255 [всего 256 значений] >
procedure HLStoRGB(H, L, S: Integer; var R, G, B: Integer);
var
Magic1, Magic2: single;
function HueToRGB(n1, n2, hue: single): single;
begin
if (hue HLSMAX) then hue := hue — HLSMAX;
// Hue можно рассматривать как угол, причём полный угол будет 240, а не 360
// градусов. Повернуть на 250 градусов в нашем случае будет то же самое, что
// повернуть на 250-240=10 градусов. Именно это и делает приведённый выше код.
// Теперь представим, что HLSMAX = 360 градусов. Тогда.
if (hue RGBMAX then R := RGBMAX;
if G RGBMAX then G := RGBMAX;
if B RGBMAX then B := RGBMAX;
Вдумчиво прочитай это:
http://semmix.pl/color/models/emo18.htm
и когда код читаешь, то пусть открыто вот это:
http://semmix.pl/color/extrans/etr50.htm
max(r,g,b) и min(r,g,b) — это из этой оперы:
http://semmix.pl/color/extrans/etr30.htm
На странице 3 — интересная таблица, а далее по страницам есть код, где более понятно, куда какой градус.
Может еще к вот этому можно комментарий придумать?
Magic1 := 2 * L — Magic2;
R := Round((HueToRGB(Magic1, Magic2, H + (HLSMAX / 3)) * RGBMAX + (HLSMAX / 2)) / HLSMAX);
G := Round((HueToRGB(Magic1, Magic2, H) * RGBMAX + (HLSMAX / 2)) / HLSMAX);
B := Round((HueToRGB(Magic1, Magic2, H — (HLSMAX / 3)) * RGBMAX + (HLSMAX / 2)) / HLSMAX);
Ну вот — лабораторка почти и сделана, главное — нахаляву:))
Ну не совсем сделана, и совсем не лабораторка, так что.
Magic1 и Magic2 хранят информацию о Saturation и Lightness, эта информация передаётся в HueToRGB через эти переменные. Далее, информация о Hue передаётся отдельно для R, G, B, так как по идее, Hue — это уже цвет, но нам то его нужно разлагать. Как видишь, добавляется 120 градусов (в коде это 240 / 3 = 80) — а это значит, что берутся три равноудалённые точки (см. теорию про цветовое колесо).
Преобразование RGB в HLS и обратно
Я использую библиотеку colorsys python для преобразования значений цвета RGB в HLS. Просто чтобы проверить, я попробовал конвертировать обратно в RGB и получил другое значение. Я могу понять незначительные различия из-за точности вопросов, но эти значения существенно отличаются.
Зеленое значение отключено более чем на 200%
Я пробовал другие значения, и каждый раз, когда один из компонентов отключается на значительную сумму. Я что-то упускаю?
One Solution collect form web for “Преобразование RGB в HLS и обратно”
Ваши значения – это путь, выходящий за пределы цветового пространства.
Координаты во всех этих цветовых пространствах являются значениями с плавающей запятой. В пространстве YIQ координата Y находится между 0 и 1, но координаты I и Q могут быть положительными или отрицательными. Во всех остальных пространствах координаты находятся между 0 и 1.
Я предполагаю, что вы ожидаете, что они будут байтами значений от 0 до 255? Просто разделите сначала на 255:
Если вы хотите понять, почему вы получаете такие нелепые ошибки, когда вы выходите за пределы цветового пространства.
Прежде всего, прочитайте два документа, связанные с документами, чтобы понять, почему значения вне цветового пространства не имеют смысла, и почему вы просите его генерировать значения до невозможных ограничений. Затем, чтобы выяснить, почему именно это происходит не так, как это происходит, а не каким-либо другим способом, вам нужно знать, какой алгоритм он использует, – что довольно легко, так как документация ссылается на исходный код, который является чистым Python и довольно читаемым ,
(PS, я могу себе представить, что может выглядеть 9650% легкости, но мне любопытно, что -100% насыщенности. Возможно, что-то Lovecraftian.)
Почему неточно преобразование между RGB и цветовыми системами HLS?
Для одного из моих заявлений я должен преобразовать цвета от RGB до цветовой системы HLS и наоборот. Я нашел, что Пайтон имеет colorsys модуль в его стандартной библиотеке.
Проблема, преобразования иногда немного неточны и возвращают немного отличающиеся результаты по сравнению с этот цветной конвертер онлайн.
Вот пример, сначала две небольших функции, которые я написал для удобства:
Согласно цветному конвертеру онлайн, RGB (123, 243, 61) должен быть равен HLS (100, 60, 88). Результаты я получаю использование функций colorsys, отличаются:
Мое первое впечатление было то, что это — просто округляющаяся проблема, но рассмотрение различия между 61 и 63, там, кажется, другая причина. Но что это? Действительно ли возможно вообще гарантировать абсолютное точное преобразование между цветовыми системами?
Почему преобразование между RGB и HLS цветовых систем неточным?
Для одного из моих приложений, мне нужно преобразовать цвета из RGB в систему цветности HLS и наоборот. Я обнаружил , что Python имеет colorsys модуль в стандартной библиотеке.
Проблема заключается в том , что преобразования иногда немного неточным и вернуться немного разные результаты по сравнению с этим интернет — цветной конвертер .
Вот пример, первые две небольшие функции, которые я написал для удобства:
По данным интернет-цветной конвертер, RGB (123, 243, 61) должна быть равна ЗОЖ (100, 60, 88). Результаты, которые я получаю, используя colorsys функции различны:
Мое первое впечатление было, что это просто проблема округление, но, глядя на разницу между 61 и 63, кажется, есть еще одна причина. Но что это? Является ли это вообще возможно, чтобы гарантировать абсолютное точное преобразование между цветовыми системами?
Изменения :
- 360 вместо 359 , потому что диапазон [0, 360) ( википедия ).
- Существовало два закругления без вести convert_rgb_to_hls(r, g, b) .
- Добавлено питон 3 разделение в случае, если вы используете Python 2.
тесты :
Вы были правы, когда вы сказали, что было округление подобных ошибок, но разница между 61 и 63, потому что вы теряете точность при округлении. Не круглый для лучшей точности:
colors Преобразование цвета HSL в RGB
rgb онлайн (16)
C ++ с вероятностью лучшей производительности, чем код @Mohsen. Он использует диапазон [0-6] для оттенка, избегая деления и умножения на 6. Диапазон S и L равен [0,1]
Я ищу инструмент или алгоритм для преобразования между цветом HSL в RGB. Мне кажется, что HSL не очень широко используется, поэтому мне не очень нравится искать конвертер.
Значение hsl | значение цвета, установленное в javascript, будет мгновенно преобразовано в rgb | a Все, что вам нужно сделать, это доступ к значению вычисленного стиля
Технически, я думаю, это даже не строки кода — это просто сделано автоматически. Таким образом, в зависимости от вашей среды, вы можете уйти от всего этого. Не то, чтобы здесь не было очень много вдумчивых ответов. Я не знаю, какова ваша цель.
Теперь, что, если вы хотите конвертировать из rbg | a в hsl | a?
Php Внедрение кода C # Криса
И here , что объясняет его математику очень хорошо.
Это в основном набор функций для преобразования в и из HSL (Hue Saturation Lightness)
Протестировано и работает на PHP 5.6.15
TL; DR : Полный код можно найти здесь, в Pastebin .
Гнездо для HSL
Вход: Цвет шестнадцатеричного в формате: [#] 0f4 или [#] 00ff44 (знак фунта дополнительно)
Выход: HSL в градусах, процентах, процентах
RGB для HSL
Вход: RGB в диапазоне 0-255 Выход: HSL в градусах, процентах, процентах.
HSL (диапазон 0-1) в градусы, процент, в процентах
Для математических вычислений HSL легче справляться с диапазоном 0-1, но для удобства чтения в классах легче, в процентах, процентах. Эта функция принимает HSL в диапазонах 0-1 и возвращает HSL в градусах, процентах, процентах.
HSL (градусы, процент, процентный формат) для HSL в диапазоне 0-1
Эта функция преобразует HSL в формате Degrees, Percent, Percent, в диапазоны 0-1 для упрощения вычислений.
HSL для RGB
Вход: HSL в формате Degrees, Percent, Percent Output: RGB в формате 255, 255, 255 .
Оттенок к RGB
Эта функция вызывается hslToRgb для преобразования оттенка в отдельные значения RGB.
HSL — Hex
Вход: HSL в формате Степени, Процент, Процент Выход: Hex в формате 00ff22 (без знака фунта).
Преобразует в RGB, затем преобразует отдельно в hex.
PHP-реализация кода @ Mohsen (включая Test!)
Извините за повторное опубликование. Но я действительно не видел никакой другой реализации, которая давала качество, в котором я нуждался.
Если вы ищете что-то, что определенно соответствует семантике CSS для HSL и RGB, вы можете использовать алгоритм, указанный в спецификации CSS 3 , который гласит:
Я считаю, что это источник некоторых других ответов здесь.
Статья для HSL и HSV по википедии содержит некоторые формулы. Вычисления немного сложны, поэтому было бы полезно взглянуть на существующие реализации .
Вот быстрая, сверхпростая, нераспространяемая версия в GLSL:
Не становится намного короче, чем
Ссылка на оригинальное доказательство концепции: https://www.shadertoy.com/view/XljGzV
(Отказ от ответственности: не мой код!)
Мне нужен был очень легкий вес, это не 100%, но он достаточно близко подходит для некоторых случаев.
Garry Tan разместил в своем блоге решение Javascript (которое он приписывает ныне несуществующему mjijackson.com, но архивируется здесь, а оригинальный автор имеет суть — благодаря user2441511).
Код обновляется ниже:
HSL для RGB:
RGB для HSL:
Для всех, кто сказал, что решение Garry Tan конвертирует неверные данные из RGB в HSL и обратно. Это потому, что он оставил часть кода в своем коде. Я исправил его код (javascript). Извините за ссылку на русский язык, но по-английски отсутствует — HSL-wiki
Если вам нужно RGB для HSV и наоборот:
С H, S и L в диапазоне [0,1]:
Найден самый простой способ, питон на rescue : D
Преобразование цвета из координат HLS в координаты RGB.
Код Unity3D C # из ответа Мохсена.
Вот код ответа Мохсена на C #, специально предназначенный для Unity3D. Он был адаптирован из ответа C #, данного Алек Тилениус выше.
Java-реализация кода Мохсена
Обратите внимание, что все целые объявляются как float (т.е. 1f) и должны быть float, иначе вы будете выбирать серые цвета.
HSL для RGB
RGB для HSL
Код C # из ответа Мохсена.
Вот код ответа Мохсена на C #, если кто-то еще этого захочет. Примечание. Color — это пользовательский класс, а Vector4 — из OpenTK. Оба легко заменить чем-то другим по вашему выбору.
Процедуры преобразования моделей цветов
В данном приложении приведены процедуры перевода из RGB в HSV и наоборот и процедуры перевода из RGB в HLS и наоборот, соответствующие процедурам из [Род89] и [Фол85]. В процедурах используется вещественная арифметика. Переход на целочисленную арифметику, более подходящую для реальных применений, может быть выполнен определением констант для максимальных значений координат цвета — R,G,B, оттенка (hue), насыщенности (saturation), светлоты (value или lightness) и соответствующей модификацией текстов процедур.
0.14.1 V_HSVRGB — перевод из HSV в RGB
0.14.2 V_RGBHSV — перевод из RGB в HSV
0.14.3 Тест процедур V_HSVRGB и V_RGBHSV
0.14.4 V_HLSRGB — перевод из HLS в RGB
0.14.5 V_RGBHLS — перевод из RGB в HLS
0.14.6 Тест процедур V_HLSRGB и V_RGBHLS
1. Электромагнитная волна (в религиозной терминологии релятивизма — «свет») имеет строго постоянную скорость 300 тыс.км/с, абсурдно не отсчитываемую ни от чего. Реально ЭМ-волны имеют разную скорость в веществе (например,
200 тыс км/с в стекле и
3 млн. км/с в поверхностных слоях металлов, разную скорость в эфире (см. статью «Температура эфира и красные смещения»), разную скорость для разных частот (см. статью «О скорости ЭМ-волн»)
2. В релятивизме «свет» есть мифическое явление само по себе, а не физическая волна, являющаяся волнением определенной физической среды. Релятивистский «свет» — это волнение ничего в ничем. У него нет среды-носителя колебаний.
3. В релятивизме возможны манипуляции со временем (замедление), поэтому там нарушаются основополагающие для любой науки принцип причинности и принцип строгой логичности. В релятивизме при скорости света время останавливается (поэтому в нем абсурдно говорить о частоте фотона). В релятивизме возможны такие насилия над разумом, как утверждение о взаимном превышении возраста близнецов, движущихся с субсветовой скоростью, и прочие издевательства над логикой, присущие любой религии.
4. В гравитационном релятивизме (ОТО) вопреки наблюдаемым фактам утверждается об угловом отклонении ЭМ-волн в пустом пространстве под действием гравитации. Однако астрономам известно, что свет от затменных двойных звезд не подвержен такому отклонению, а те «подтверждающие теорию Эйнштейна факты», которые якобы наблюдались А. Эддингтоном в 1919 году в отношении Солнца, являются фальсификацией. Подробнее читайте в FAQ по эфирной физике.
Преобразовать ARGB в RGB
Как преобразовать RGB в sRGB?
Как реализовать алгоритм конвертации RGB (0-255) в sRGB (0-1) ?
Принимаемые данные с датчика через Serial port преобразовать в RGB
Всем доброго времени суток! Стоит одна задача. Необходимо, получая строки с датчика цвета.
Получение ARGB из BMP
Здравствуйте! Не могли бы Вы подсказать как получить таблицу ARGB из изображения .bmp? Глубина.
Преобразование RGB в HLS и обратно
Я использую библиотеку colorsys python для преобразования значений цвета RGB в HLS. Просто чтобы проверить, я попробовал конвертировать обратно в RGB и получил другое значение. Я могу понять незначительные различия из-за точности вопросов, но эти значения существенно отличаются.
Зеленое значение отключено более чем на 200%
Я пробовал другие значения, и каждый раз, когда один из компонентов отключается на значительную сумму. Я что-то упускаю?
One Solution collect form web for “Преобразование RGB в HLS и обратно”
Ваши значения – это путь, выходящий за пределы цветового пространства.
Координаты во всех этих цветовых пространствах являются значениями с плавающей запятой. В пространстве YIQ координата Y находится между 0 и 1, но координаты I и Q могут быть положительными или отрицательными. Во всех остальных пространствах координаты находятся между 0 и 1.
Я предполагаю, что вы ожидаете, что они будут байтами значений от 0 до 255? Просто разделите сначала на 255:
Если вы хотите понять, почему вы получаете такие нелепые ошибки, когда вы выходите за пределы цветового пространства.
Прежде всего, прочитайте два документа, связанные с документами, чтобы понять, почему значения вне цветового пространства не имеют смысла, и почему вы просите его генерировать значения до невозможных ограничений. Затем, чтобы выяснить, почему именно это происходит не так, как это происходит, а не каким-либо другим способом, вам нужно знать, какой алгоритм он использует, – что довольно легко, так как документация ссылается на исходный код, который является чистым Python и довольно читаемым ,
(PS, я могу себе представить, что может выглядеть 9650% легкости, но мне любопытно, что -100% насыщенности. Возможно, что-то Lovecraftian.)
Цветовые палитры для пространства 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 светодиодов и лент.