Дмитрий Мирошников (namgul) wrote in sreda_photo,
Дмитрий Мирошников
namgul
sreda_photo

О формулах режимов наложения, а также субтрактивном режиме

Посетив семинары Цветокоррекция-2 и Маски-1 Андрея Журавлева, сел дома заново разбираться с режимами наложения... Поскольку оказалось, что понимание приводимых на семинарах примеров у меня есть, а вот самостоятельная цепочка рассуждения, приводящая к выбору оптимального режима и подходящей для него предварительной коррекции, получается с заметным трудом.

Как математику по образованию (в том числе) мне проще иметь дело с  формулами. Приведенные в конспектах мне показались излишне сложными, и я попробовал их упростить. Об этом собственно и пост.

Пусть S - яркость исходного пиксела (0<=S<=255), C - корректирующего, R - результата. 

Максимальное значение в 255 удобно разве что процессору, но никак не упрощает расчеты - поэтому перейдем к определению яркости числом с плавающей запятой в диапазоне от 0 до 1. Обозначим такие числа маленькими буквами s,c,r: s=S/255, c=C/255, r=R/255.

В формулах у Андрея также используется понятие затемненности, т.е. отклонения яркости от белого. Будем обозначать такую величину штрихом: S'=255-S или s'=1-s. Легко видеть, что вычисление затемненности - это просто инверсия изображения.

Теперь по режимам:

Darken: r=min(s,c) 

Lighten: r=max(s,c)

Multiply: r=s*c

Screen: r'=s' * c'

Color burn:  r' = s' / c

Color dodge: r = s / c'

Linear dodge: r = s + c

Linear burn: r = s - c'  = s + c  - 1

Т.е. получается, linear burn и linear dodge оба являются аддитивными режимами и отличаются только коррекцией на константу.


На семинаре по маскам был показан интересный прием устранения цветонейтральных областей на маске путем применения linear burn/dodge на слой из одного канала вместе с инвертированным слоем другого канала. Действительно, что получится, если в формулы подставить в качестве второго слоя его инверсию?

r= LinearBurn(s, c') = s+(1-c) - 1 = s-c

Другими словами, получилась формула отсутствующего в прямом виде в фотошопе субтрактивного режима. По формуле понятно, что если s>c то будет какой-то цвет, а если s<=c, то все превратится в черную плашку. Это очень удобно - применяя субтрактивный режим на копии двух разных каналов легко исключать одинаковые нейтральные области, оставляя лишь различающиеся.

Это напоминает дифференциальный режим (r=abs(s-c)), наличие модуля в котором портит всю малину, оставляя лишь аналитическую пользу. Тут же можно эффективно исключать лишние области.

Как готовить заготовки тоже понятно - сохранять равенство или превышение в одном месте, и разгонять в другом.

Если нужна белая маска вместо черной:

r = LinearDodge(s, c') = s + c' = s+1-c = s - c +1. При s>=c заливка будет белой.





Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 18 comments