Алгоритм для корректирующего слоя оттенка/насыщенности из Photoshop
Кто-нибудь знает, как корректирующие слои работают в Photoshop? Мне нужно создать изображение результата с исходным изображением и значениями HSL из корректирующего слоя Hue/Saturation. Преобразование в RGB и последующее умножение на исходный цвет не работают.
Или можно заменить слой регулировки оттенка/насыщенности нормальными слоями с соответствующим образом установленными режимами смешивания (Mulitiply, Screen, Hue, Saturation, Color, Luminocity,...)?
Если да, то как?
Спасибо
Ответы
Ответ 1
Я проверил обратное вычисление для , когда установлен флажок "Раскрасить" . Весь код ниже - псевдокод.
Входы:
- hueRGB, который является цветом RGB для
HSV(photoshop_hue, 100, 100).ToRGB()
- насыщенность, которая равна
photoshop_saturation / 100.0
(т.е. 0..1)
- легкость, которая равна
photoshop_lightness / 100.0
(т.е. -1.1)
- которое является
pixel.ToHSV().Value
, масштабируется в диапазоне 0..1.
Метод для раскрашивания одного пикселя:
color = blend2(rgb(128, 128, 128), hueRGB, saturation);
if (lightness <= -1)
return black;
else if (lightness >= 1)
return white;
else if (lightness >= 0)
return blend3(black, color, white, 2 * (1 - lightness) * (value - 1) + 1)
else
return blend3(black, color, white, 2 * (1 + lightness) * (value) - 1)
Где blend2
и blend3
:
blend2(left, right, pos):
return rgb(left.R * (1-pos) + right.R * pos, same for green, same for blue)
blend3(left, main, right, pos):
if (pos < 0)
return blend2(left, main, pos + 1)
else if (pos > 0)
return blend2(main, right, pos)
else
return main
Ответ 2
Photoshop, не знаю. Но, как правило, теория: изображение RGB преобразуется в HSL/HSV внутренними методами конкретного слоя; каждый пиксел HSL затем изменяется в соответствии с указанными параметрами, и полученный результат возвращается назад (для отображения) в RGB.
PaintShopPro7 используется для разделения пространства H (предполагая диапазон 0..360) с дискретными приращениями 30 ° (IIRC), поэтому, если вы столкнулись только с "желтыми", то есть только пиксели, компонент H которых был оценен 45 -75 будет рассматриваться для манипуляций.
reds 345..15, апельсины 15..45, желтые 45..75, желто-зеленые 75..105, зелень 105..135 и т.д.
if (h >= 45 && h < 75)
s += s * yellow_percent;
Существуют альтернативные возможности, такие как применение фильтра спада, как в:
/* For h=60, let m=1... and linearly fall off to h=75 m=0. */
m = 1 - abs(h - 60) / 15;
if (m < 0)
m = 0;
s += s * yellow_percent * d;
Ответ 3
Я понял, как работает Lightness.
Яркость входного параметра b находится в [0, 2], выход c (цветной канал).
if(b<1) c = b * c;
else c = c + (b-1) * (1-c);
Некоторые тесты:
b = 0 >>> c = 0 // black
b = 1 >>> c = c // same color
b = 2 >>> c = 1 // white
Однако, если вы выберете какой-то интервал (например, Reds вместо Master), Lightness ведет себя совершенно по-другому, больше похоже на Saturation.
Ответ 4
Привет, я написал colorize shader, и мое уравнение - как folow
inputRGB - это исходное изображение, которое должно быть в монохромном
(r+g+b) * 0.333
colorRGB - цвет назначения
finalRGB - результат
псевдокод:
finalRGB = inputRGB * (colorRGB + inputRGB * 0.5);
Я думаю, что это быстро и эффективно
Ответ 5
Когда установлен флажок "Раскрасить" , легкость нижележащего слоя объединяется со значениями ползунков Hue и Saturation и преобразуется из HSL в RGB в соответствии с уравнениями https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSL. (Ползунок Lightness просто переназначает легкость в подмножество шкалы, как вы можете видеть, наблюдая за гистограммой, эффект довольно ужасный, и я не понимаю, почему кто-то когда-либо использовал его.)