Алгоритм настройки оттенка / насыщенности слоя из Photoshop - PullRequest
12 голосов
/ 10 декабря 2010

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

Или же можно заменить корректирующий слой Оттенок / Насыщенность на обычные слои с соответствующим образом установленными режимами наложения (Многократный, Экран, Оттенок, Насыщенность, Цвет,Luminocity, ...)?Если так, то как?

Спасибо

Ответы [ 5 ]

9 голосов
/ 07 февраля 2012

Я пересмотрел вычисление для , когда флажок "Colorize" установлен . Весь код ниже псевдокод .

Входные данные:

  • 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
3 голосов
/ 19 ноября 2013

Я понял, как работает Легкость .

Входной параметр яркости 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

Однако, если вы выберете некоторый интервал (например, красные вместо основного), легкость ведет себя совершенно по-другому, больше похоже на насыщенность.

2 голосов
/ 10 декабря 2010

фотошоп, не знаю. Но теория обычно такова: изображение RGB преобразуется в HSL / HSV внутренними методами определенного уровня; HSL каждого пикселя затем модифицируется в соответствии с указанными параметрами, и полученный таким образом результат возвращается (для отображения) в RGB.

PaintShopPro7, используемый для разделения пространства H (при допущении в диапазоне 0..360) с дискретными приращениями 30 ° (IIRC), поэтому, если вы увеличиваете только «желтые», то есть только пиксели, чей компонент H был оценен 45 -75 будет рассматриваться для манипуляции.

красные 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;
1 голос
/ 26 сентября 2014

Здравствуйте, я написал colorize shader, и мое уравнение выглядит следующим образом

inputRGB - исходное изображение, которое должно быть черно-белымfinalRGB - результат

псевдокод:

finalRGB = inputRGB * (colorRGB + inputRGB * 0.5);

Я думаю, что это быстро и эффективно

0 голосов
/ 14 января 2017

Когда флажок «Colorize» установлен , яркость нижележащего слоя объединяется со значениями ползунков Hue и Saturation и преобразуется из HSL в RGB в соответствии с уравнениями https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSL. (Ползунок «Легкость» просто перераспределяет яркость в подмножество шкалы, как вы можете видеть по просмотру гистограммы; эффект довольно ужасный, и я не понимаю, почему кто-то когда-либо использовал бы его.)

...