Подтвердить что ты не робот

Алгоритм для корректирующего слоя оттенка/насыщенности из Photoshop

Кто-нибудь знает, как корректирующие слои работают в Photoshop? Мне нужно создать изображение результата с исходным изображением и значениями HSL из корректирующего слоя Hue/Saturation. Преобразование в RGB и последующее умножение на исходный цвет не работают.

Или можно заменить слой регулировки оттенка/насыщенности нормальными слоями с соответствующим образом установленными режимами смешивания (Mulitiply, Screen, Hue, Saturation, Color, Luminocity,...)? Если да, то как?

Спасибо

4b9b3361

Ответ 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 просто переназначает легкость в подмножество шкалы, как вы можете видеть, наблюдая за гистограммой, эффект довольно ужасный, и я не понимаю, почему кто-то когда-либо использовал его.)