13 января, 2024

'Swap channels | Смена каналов' - Cinelerra

'Swap channels | Смена каналов' - это плагин для цветокоррекции в Cinelerra, позволяющий брать информацию (значение) для определённого канала из другого канала в том же самом изображении. Вы можете назначить разные источники для каждого из R, G, B, A каналов в том же самом изображении. Эффект работает как со статичными изображениями, так и с видео. UPD.: модификация плагина, представленная в Cin-HV, позволяет брать информацию для канала из другого изображения (см. в конце статьи).

Это один из самых первых плагинов Cinelerra. Он появился ещё в Broadcast2000, затем перекочевал в 2002 году в HV и ныне присутствует во всех версиях Cinelerra. Кроме того, в Cin-GG имеется несколько плагинов группы FFMPEG, выполняющих те же задачи.
 
The Swap channels (Shift Channels) effect  in Cinelerra

Cinelerra: the Swap Channels (Shift Channels) effect.


Рассмотрим стартовые настройки эффекта:

The Swap channels effect's menu - Cinelerra

В вертикальной колонке справа представлены выходные R, G, B, A каналы. В выпадающем меню, отдельном для каждого выходного канала, вы можете выбрать какой из R, G, B, A каналов исходного изображения станет источником для R, G, B, A выходного канала.
Математически, настройки по умолчанию выглядят так:

255, 0, 0 -> R
0, 255, 0 -> G
0, 0, 255 -> B
  Alpha   ->  A
У пользователей, знакомых с Adobe After Effects, глядя на Swap Channels в Cinelerra, может возникнуть состояние Déjà Vu. Да, чувства вас не обманывают - это тот самый 'Shift Channels', но в минималистичном варианте: среди опций здесь нет Luminance, Hue, Lightness, Saturation. А в остальном всё тоже самое и работает точно так же, только некоторые параметры называются по-другому.
Рассмотрим опции подробно, ибо детальное описание этих плагинов в интернете отсутствует. Я встречал лишь объяснения в армейском стиле "делай раз, делай два, повторяй за мной, думать вам не положено - за вас уже подумали":
Red - значение красного канала исход. изображения, которое будет в выходном канале.
Green - значение зелёного канала исход. изобр., которое будет в выход. канале.
Blue - значение синего канала исход. изобр., которое будет в выход. канале.
Alpha - альфа-канал исход. изображения.  Если эта настройка применена к цветовому каналу, то цвет будет отображаться в соответствии с картой прозрачности изображения. В полностью прозрачных участках цвет будет полностью прозрачным, в полностью непрозрачных участках цвет будет полностью непрозрачным. Промежуточные значения прозрачности также учитываются. В этих участках цвет пикселей будет смешиваться с цветом пикселей нижележащего изображения в соответствии с установленным режимом наложения. Однако это не всё ! Значение интенсивности цветового канала будет изменяться в диапазоне 0 - 255: от 0 в участках с нулевой прозрачностью до 255 - в полностью непрозрачных участках. И на основании этих изменений будет рассчитываться выходной цвет для всего изображения.
0 % - отменяет значение исходного канала и вместо него устанавливает для выходного R, G, B канала минимальное значение интенсивности (0). Установив 0 % для всех трёх R, G, B каналов, получим чёрное изображение на выходе (значение альфа-канала должно быть при этом либо 100%, либо Alpha). Для альфа-канала устанавливает полную прозрачность (0), при этом содержимое дорожки становится полностью прозрачным независимо от того какие настройки заданы для R, G, B каналов.

100 % - отменяет значение исходного канала и вместо него устанавливает для выходного R, G, B канала максимальное значение интенсивности (255). Для альфа-канала устанавливает полную непрозрачность (1) (опаковость). Установив 100 % для всех трёх R, G, B каналов, получим белое изображение на выходе (значение альфа-канала должно быть при этом либо 100%, либо Alpha).

Nota bene: Плагин, будучи применённым к временному кадру, сначала применяет установленное значение для альфа-канала, а после применяет цветовые значения согласно настройкам. Если для альфа-канала задано 100 %, то имеющиеся в исходном изображении прозрачные участки отображаются в выходном изображении непрозрачными чёрными (цветовые каналы заполняются zero = black). Если A=100 % и при этом для цветового канала(-ов) задано 100% (255), то такие участки принимают цвет согласно настройкам канала(-ов), для которого(-ых) установлено 100%. Плагин рассматривает исходное значение интенсивности цвета таких участков как (0, 0, 0) и, исходя из этого значения, рассчитывает выходной цвет.

Эффект Swap Channels позволяет перемешивать, дублировать каналы, конвертировать в Cinelerra цветное изображение в изображение в градациях серого (чёрно-белое). Как известно, это такое изображение, в котором значения каналов равны друг другу. Для этого следует установить для R, G, B каналов один и тот же исходный канал. В примере ниже в качестве источника взят канал Red:
#1
Grayscale image in Cinelerra.
#2
Grayscale with cinelerra.

Как работает плагин ? Если в некой XXX-точке исходного изображения значения RGB составляли, например, (R209, G160, B123), то после установки Red для всех выходных каналов, значения R, B каналов в этой XYZ-точке примут значение Red в этой точке, которое равно 209 и на выходе мы получим (R209, G209, B209). А если в некой YYY-точке значения в исход. изобр. были (R53, G48, B12), то на выходе они составят (R53, G53, B53). Таким образом, выходные каналы R, B принимают значения красного канала, заданного в настройках. Более светлые участки в изображении означают большее значение интенсивности цвета, более тёмные - меньшее. И вот вам уже градации серого.
Математически:
Исходное изображ.:                            После смены:
255, 0, 0 -> R                                        255, 0, 0 -> R => R
0, 255, 0 -> G                                        255, 0, 0 -> G => R
0, 0, 255 -> B                                        255, 0, 0 -> B => R

Вы можете проэксперементировать с каждым из каналов и выбрать наилучший вариант.
Давайте возьмём более простой пример:
#3

В исходном изображении в красной полосе значение цвета (R255, G0, B0). Меняем значение R255 и B0 на значение зеленого в красной полосе 0 - получаем чёрный цвет (R0, G0, B0). В зелёной полосе (R0, G255, B0) - аналогично меняем значения красного и синего каналов на значение зелёного 255 - получаем (R255, G255, B255), то-бишь белый цвет. Ну и в синей полосе (R0, G0, B255) меняем на 0 - получаем чёрный цвет (R0, G0, B0).

В примере ниже на верхней дорожке изображение без альфа-канала (взято отсюда) - обрезано инструментом 'Маска' в режиме 'Multiply' (в Compositor) , переведено в grayscale, а затем значение Red channel (в котором контрастность лучше, чем в остальных каналах) перенаправлено в Alpha channel (то есть красн. канал используется как Alpha Matte):
#4
cinelerra - grayscale, mask, color channel

Как это сделано:
#5
create grayscale and mask in cinelerra
Ещё пример (ниже).
Здесь всё выглядит просто. В настройках красный меняем на синий, синий на красный и на выходе соответственно:
исходный синий становится красным, зеленый остаётся зелёным, исходный красный становится синим:
#6
swap channels in cinelerra

А в следующем примере цветоизменение уже не очевидно и для новичка может быть непонятно:
#7

Давайте посмотрим на математич. формулу:

255 0   0         0  255 0   R
0   255 0        255 0   0   G
0     0  255       0 255 0   B

В левой и правой колонках горизонтальные строки - исходные каналы.
Сверху вниз значения R, G, B для каждой вертик. цветной полосы до и после применения эффекта. Результирующий цвет тоже удобно считать сверху вниз: Green, Magenta, Black.
Технику обмена значениями красного и синего каналов можно использовать при работе с инфракрасными изображениями и для создания эффекта инфракрасного изображения в Cinelerra:
#8
How to create an infrared effect with Cinelerra.
Математически:
Исходное изображ.:                                     После смены:
255, 0, 0 -> R                                        0,     0,   255 -> R => Blue
0, 255, 0 -> G                                        0,   255, 0     -> G => Green
0, 0, 255 -> B                                        255, 0,   0     -> B => Red

Углубимся в работу некоторых опций.
На скриншоте ниже я использую Cinelerra-HV - там фон отображается сеточкой.
Изображение 720x576 состоит из центральной части (3 цветных полосы) и прозрачной рамки вокруг центр. части:
#9


R=100%, G=G, B=B, Alpha=100%
Так как Alpha=100%, то выходное изображение будет полностью непрозрачным. R=100% означает, что в любой точке выходного изображения в том числе и бывших прозрачных участках R=255. G=G, B=B означает, что значения зеленого и синего в выход. изобр. = значениям в исходном. В красной полосе в исходном изобр. значения интенсивности цвета равны R255,G0,B0 и значит на выходе будет R255,G0,B0 = красный цвет. В зелёной полосе в исход. изображении R0,G255,B0 и на выходе будет R255,G255,B0 = жёлтый цвет. В синей полосе в исход. изобр. R0,G0,B255 и на выходе будет R255,G0,B255 = пурпурный цвет.
Вопрос: почему прозрач. рамка красного цвета, а не жёлтого или пурпурного ? Как я уже говорил выше, разбирая опции: Если для альфа-канала задано 100 %, то имеющиеся в исходном изображении прозрачные участки отображаются в выходном изображении непрозрачными чёрными. Если A=100 % и при этом для цветового канала(-ов) задано 100% (255), то такие участки принимают цвет согласно настройкам канала(-ов), для которого(-ых) установлено 100%. Плагин рассматривает исходное значение интенсивности цвета таких участков как (0, 0, 0) и, исходя из этого значения, рассчитывает выходной цвет.
В данном примере, прозрачные участки становятся непрозрачными чёрными согласно настройке Alpha=100%, далее плагин рассматривает их как R0,G0,B0 и исходя из этого значения, рассчитывает выходной цвет, применяя к ним настройки цвет. каналов => R255 (то-есть R=100%), а G, B = 0. Тот же самый результат можно получить, если переключиться в цветовую модель без альфа-канала RGB-8 bit.

Возьмём другое изображение - здесь будет более наглядно:
#10
cinelerra - color corrections - shift channels

Обратите внимание ! Размер оригинального изображения = 1280x720. Project size (canvas size) = 1980x1080. Temporary size (track size) = 1980x1080. Временный кадр (temporary) состоит из оригин. изображения (1280x720) и прозрачных полос вокруг, добавляемых программой до размеров холста. В Cinelerra эффект применяется ко всему временному кадру (temporary), что мы и видим на холсте в Compositor. Для простоты усвоения материала новичками я везде выше говорил о "исходном изображении". Но, строго говоря, это неверно. Вы теперь понимаете почему ? Почитайте в блоге материалы по тегу "canvas".

Ещё пример: #11


Заданные настройки: R=Alpha, G,B=100%, Alpha=100%
Центр. часть - белая, а рамка вокруг - циановая. Почему ?
Так как задано Alpha=100%, то альфа-канал выходн. изображ. полностью непрозрачный. Прозрачн. участки стали черными и, как я говорил выше, далее плагин рассматривает их как R0,G0,B0. Каналы G, B имеют максимальное значение 255. Красный выходной канал использует значения альфа-канала исход. изобр.: значение альфа-канала в центр. части исход. изображения = 1, а в прозр. рамке вокруг центр. части = 0. Таким образом, в центр. части выходного изображения R=255 и вместе с G255+B255 составляют белый цвет. А в рамке вокруг центр. части значение красного = 0 (так как в исход. изобр. значение альфа-канала там = 0). Поэтому прозрачная рамка вокруг центр. части цианового цвета: Cy = R0+G255+B255. Если установить и для зелёного выходного канала источником альфа-канал, то рамка будет синего цвета.
 
В примере выше альфа-канал имеет два значения.
А как работает плагин, если изображение имеет промежуточные значения прозрачности ?
А вот так:
#12
Alpha channel in cinelerra

Здесь я использую предварительно модифицированную в GIMP картинку - добавлен градиент прозрачности. Сверху вниз прозрачность убывает.
В Cinelerra в настройках эффекта для выходного изображ. установлено A=100. Для Red задано 'Alpha'. G, B = исходным значениям. И дальше как уже описано выше.
В верхней части красной, зеленой и синей полос значение R=0 так как значение альфа-канала там = 0 и следовательно выходной цвет в красн. полосе R0,G0,B0 , а в зеленой и синей полосах цвет сохраняет свои исходные значения R0,G255,B0 , R0,G0,B255. 
В нижней части красн. полосы мы видим R255,G0,B0 , зелёной полосы исход. изображения - жёлтый R255,G255,B0 , синей исходного - пурпурный R255,G0,B255.
Математика понятна ? Значение красного в каждой полосе исходного изобр. постепенно изменяется в соответствии со значением 'Alpha' (градиентом прозрачности) от 0 до 1, т.е. от 0 до 255. И результирующий цвет в выходном изображении пересчитывается соответственно.
Для наглядности (примерная схема):
верх (A=0):     R0, G0,     B0 | R0,    G255,  B0 | R0,     G0, B255
сер. (A≈50): ≈ R130, G0, B0 | R130, G255, B0 | R130, G0, B255
низ (A=100):   R255, G0, B0 | R255, G255, B0 | R255, G0, B255

И вот ещё парочка контрольных тестов на понимание происходящего:
#13

Почему в верхнем примере: зелёный квадрат, т.е. чёрные полосы стали зелёными, а ниже - чёрная, зелёная, чёрная полосы ?
0% для красного и синего каналов отменяет их исход. значение и устанавливает 0 - это значит, что в любой точке выходного изображения R=0, B=0. В верх. примере зелёный изменяется в соответствии со значением альфа, аналогично схеме выше. В нижнем всё просто - для выходных каналов берётся фиксированное исходное значение зелёного 255, а для красного и синего задан 0. В красной полосе в исход. изобр. было R255,G0,B0, а так как для выходного изображ. мы задали R=0, то значит на выходе будет R0,G0,B0 - чёрный. В синей аналогично. Ну и в зелёной исходной - для выхода установлено фиксированное исходное значение зелёного 255, а для красного и синего у нас задан 0.
Стремился разложить предельно понятно, на пальцах.

Эффект Swap Channel имеет смысл использовать в комбинации с другими эффектами Cinelerra. В этом случае нам открываются более широкие возможности.
Например, eсли вы решили создать alpha track matte key effect in Cinelerrra, но хотите использовать в качестве alpha track matte (подложки) не альфа-канал, а какой-то другой канал, который определяет требуемую область прозрачности лучше, чем альфа-канал (или в случаях, когда исходное изображение не содержит альфа-канала), примените Swap Channels и перенаправьте с его помощью желаемый канал в альфа-канал, а после примените эффект 'Reroute | Перенаправление' в режиме 'Alpha Replace', перенаправив Alpha Matte с одной дорожки на другую и создав таким образом Alpha Track Matte.


Давайте что-нибудь сделаем. На нижней дорожке - чёрно-белая картинка без альфа-канала 
$ pngcheck OK: ./wmn.png (720x576, 24-bit RGB, non-interlaced, 97.2%).

Обращайте внимание на Overlay modes, значение Fade.
Используемый Font: Dubiel, Font Color: #FF1C56
#14

Color correction effects in Cinelerra: shift (swap) color channels, invert color channels, blur color channels.

Те же самые настройки, но с другой картинкой:
#15
Swap color channels in Cinelerra

В следующих примерах задействован уже знакомый читателям по предыдущим публикациям эффект 'Reroute |Перенаправление':                  

#16
(здесь я откорректировал при помощи инстр. 'Camera' участки изобр. с верх. дорожки, которые попадают в альфа-маску):

Cinelerra - swap color and reroute color channel to alpha channel

То же самое, но с другими настройками:
#17

cinelerra - shift color channels

Усложним немного конструкцию:
#18

Cinelerra: a mask on one colour channel and then to change that into a masking track

Сменим режим наложения:
#19

Cinelerra: a mask, colour channel, a masking track

Сменим настройки: 
#20

Cinelerra - replacing one channel with a different channel from the other layer.

Это не всё, что можно сделать с этим плагином. Возможно позже добавлю ещё что-нибудь.
P.S.
Вышеприведённые примеры сделаны в Cinelerra-CV 2.3 на Lubuntu 18.04 64-bit.
C Cinelerra-HV 8 совместимы примеры, в которых отсутствует эфф. 'Reroute' (в HV нет этого эффекта), но задействовав 'Swap Channels' в технике 'shared effects' вы сможете получить аналогичные результаты. Кроме того, смотрите обновление внизу статьи.
C Cinelerra-GG примеры технически совместимы, но с рядом оговорок. 
Во-первых, некоторые режимы работают наоборот.
Например:
Subtract overlay mode
- в HV, CV:
static const char *blend_subtract_frag = 
" result_color.rgb = dst_color.rgb - src_color.rgb;\n";
- в GG  - наоборот:
58 // SUBTRACT     [(Sa - Da), (Sc - Dc)]

Divide overlay mode
- в HV, CV*: dst_color.rgb / src_color.rgb
- в GG - наоборот [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) +  Sc / Dc] и с ним в cin-gg проблемы (даже с учётом переворота).

Поэтому если вы захотите воспроизвести примеры, где задействован Subtract overlay mode, вам потребуется, вероятно, перевернуть всё "вверх ногами".
Во-вторых, в этом форке, похоже, есть ряд проблем как с режимами наложения, так и с альфа-каналом (какие-то невнятные глюки). Я говорил об этом в статье о объёмных титрах в Cinelerra, где привёл ряд скриншотов с описанием проблем GG, а позже добавил ряд вариантов обходных путей (статью читать с конца).

#14, #15 - воспроизводятся.
#16  - воспроизводится, но несколько не то. Addition не выдаёт результат как в CV и его потребуется отключить. Переворот не требуется. А если перевернуть, то получается ерунда.
#17 - ерунда какая-то получается..
#18 - нормально воспроизводится.
#19 и #20 (там Subtract) - я пробовал воспроизвести и как в CV, и с переворотом  -> или вообще чёрти-что, или только часть требуемого результата.

Тем не менее, вы вполне можете использовать этот форк для описываемых в этой статье целей, ибо сам по себе плагин работает в GG нормально - вопросы возникают при комбинировании его с конкретными режимами наложения и др. эффектами. 
Я хотел воспроизвести всё вышеописанное в GG.. Может недостаточно старался. Попробуйте вы.

P.P.S
В Cinelerra-CVE этот плагин получил новую опцию '50%':


Но этот экспериментальный форк по-прежнему находится в "экспериментальном состоянии" и для работы не пригоден (в том числе и потому, что многие необходимых для работы опции и настройки были удалены или урезаны). А вот для портирования ряда нововведений фундаментального плана его можно и нужно рассматривать. Но заниматься этим должны специалисты, понимающие что они делают - код сложный.
P.P.S.
Добавил в руководство по Cinelerra-CV описание плагина на английском. В РФ, РБ сайт доступен через VPN/proxy (заходите через Opera).
UPD.: В февр. 2024 Адам модифицировал эффект в:


С этой модификацией эффект в Cinelerra HV  работает аналогично the 'Set channels' effect in Adobe After Effects и позволяет брать информацию (значение) для определённого канала из другого канала другого изображения, находящегося на другой дорожке. Модификацию следует применять в соответствии с техникой 'Shared effects'. Дорожка, к которой эффект применён как основной,  рассматривается как основная (воспринимающая) (0), а дорожка, к которой он применён как "shared effect" - это Source track (источник). 

В колонке 'Source buffer', то-бишь 'Source track', задаётся дорожка-источник. Если для воспринимающей дорожки выбрать 0, то источником будет канал изображения на этой же дорожке. В данном меню доступны варианты: 1, 2, 3. UPD.: Адам увеличил число возможных источников до 16. Это дорожки-источники, на которые "расшарен" эффект. При этом отсчёт идёт в порядке следования дорожек, содержащих расшарен. эффект, после воспринимающей дорожки. Номер дорожки, представленный на панели управления, не имеет значения. В примере ниже источником альфа-канала задан 1, то-есть дорожка 'Video 1'. Но это потому, что эта дорожка - первая с "расшаренным" эффектом после основной, а не потому, что в поле 'Название трека' написано 'Video 1'. Там могло бы быть и 'Video 111'. 
Здесь при помощи модифицированного 'Swap Channels' создаётся Alpha Track Matte в Cinelerra.  Тоже самое  я показывал в предыдущих публикациях, но используя эффект 'Reroute'.




Чтобы получить интересующие меня участки изображения внутри букв, я перевернул картинку на дорожке 'Video 3' эффектом 'Flip' и отрегулировал её положение инструментом 'Camera' дорожки 'Video 3'. Эффект 'Scale' дорожки 'Video 2' масштабировал картинку, убрав ненужные части за пределы холста. Шрифт: 'Glamoure'/'Liberation Serif'. Cin-HV не видит OTF-fonts, поэтому самое простое решение - при помощи онлайн-конвертера конвертировать шрифт в TTF, а затем разместить его в каталоге /home/user/.fonts .
Коротенький < ролик >. И ещё раз: пример на картинке выше сделан в Cin-HV. В прочих форках используйте для таких целей эффект 'Reroute'. Схема будет такая:






Комментариев нет:

Отправить комментарий