마스크된 에지 색상을 크기에 따라 바깥쪽으로 확산시키는 다중 스케일 에지 돌출 기능으로, 선택적으로 마스크 침식, 반전 및 로그 공간 처리를 수행할 수 있습니다.
에지 익스트루드는 마스크된 경계에서 바깥쪽으로 색상을 확장하기 위해 단계별 크기의 박스 블러를 여러 개 적용한 다음, 이러한 레이어를 소스 아래에 병합하여 가장자리 픽셀이 주변 영역으로 확장되도록 합니다.
메인 입력에 이미지를, 마스크 입력에 매트를 입력합니다. 마스크 채널을 선택하고, 필요에 따라 마스크를 침식하거나 반전시키고, 가장자리가 이동하는 범위를 설정합니다. 화질은 마스터 블러를 따릅니다. 로그를 활성화하면 스택을 시네온 공간에서 실행하고 출력 시 다시 변환할 수 있습니다.
잘라낸 부분이나 로토스코핑 가장자리의 플레이트 색상이 알파 영역을 넘어 계속 이어져야 할 때, 즉 타이트한 크롭, 키 주변 정리 또는 부드러운 테두리 채우기에 사용하세요. 마스크되지 않은 영역 내부에 새로운 디테일을 만들 필요가 없습니다.
set cut_paste_input [stack 0]
version 9.0 v7
push 0
push $cut_paste_input
Group {
inputs 2
name edgeExtrude
tile_color 0x421010ff
selected true
xpos 480
ypos 114
addUserKnob {20 User l edgeExtrude}
addUserKnob {41 from0 l "mask channel" T Copy1.from0}
addUserKnob {7 erodeMask l "erode mask" R 0 100}
erodeMask 10
addUserKnob {6 invertMask -STARTLINE}
addUserKnob {41 size T master.size}
addUserKnob {52 group T "import nuke\nknobChanged \"\\n\\ng = nuke.thisNode()\\nk = nuke.thisKnob()\\n\\nif k.name() in \\\[\\\"frames\\\",\\\"method\\\"]:\\n \\n i = nuke.toNode(\\\"img\\\")\\n i2 = nuke.toNode(\\\"mask\\\")\\n o = nuke.toNode(\\\"Output1\\\")\\n c = nuke.toNode(\\\"Copy1\\\")\\n\\n if k.name() == \\\"frames\\\":\\n \\n defaultNodes = \\\[i,i2,o,c]\\n for n in nuke.allNodes():\\n if n not in defaultNodes:\\n nuke.delete(n)\\n \\n fvalue = g\\\['frames'].value()\\n step = 1\\n if fvalue < 0:\\n step = -1\\n \\n for f in range(0,int(fvalue)+step,step):\\n t = nuke.nodes.TimeOffset()\\n t\\\['time_offset'].setValue(-f)\\n t.setInput(0,i)\\n \\n if f == 0 :\\n lastnode = t\\n \\n else :\\n slice = nuke.nodes.Grade()\\n slice\\\['channels'].setValue(\\\"alpha\\\")\\n slice\\\['blackpoint'].setValue((1/(fvalue+1))*abs(f))\\n slice\\\['whitepoint'].setValue((1/(fvalue+1))*(abs(f)+1))\\n slice.setInput(0,c)\\n exp = nuke.nodes.Expression()\\n if g\\\['method'].value() == \\\"average\\\":\\n exp\\\['expr3'].setValue('a>1?1:a')\\n else:\\n exp\\\['expr3'].setValue('a>0?1:0')\\n exp.setInput(0,slice)\\n km = nuke.nodes.Keymix()\\n km.setInput(1,t)\\n km.setInput(0,lastnode)\\n km.setInput(2,exp)\\n lastnode = km\\n \\n sw = nuke.nodes.Switch()\\n sw.setInput(0,i)\\n sw.setInput(1,lastnode)\\n sw\\\['which'].setExpression('parent.maskChannel!=0')\\n o.setInput(0,sw)\\n \\n for n in nuke.allNodes():\\n nuke.autoplace(n)\\n\\n elif k.name() == \\\"method\\\":\\n\\n for e in nuke.allNodes('Expression'):\\n if g\\\['method'].value() == \\\"average\\\":\\n e\\\['expr3'].setValue('a>1?1:a')\\n else:\\n e\\\['expr3'].setValue('a>0?1:0')\\n\\n\"" +STARTLINE}
addUserKnob {41 quality -STARTLINE T master.quality}
addUserKnob {6 log -STARTLINE}
log true
addUserKnob {26 ""}
addUserKnob {26 lbl l "" +STARTLINE T "Edge Extrude v1.2"}
addUserKnob {22 btn l DerekVFX.ca T "nuke.tcl('start', 'https://derekvfx.ca')" +STARTLINE}
}
Input {
inputs 0
name mask
xpos -137
ypos -799
number 1
}
set Na4475400 [stack 0]
push $Na4475400
Copy {
inputs 2
from0 rgba.alpha
to0 rgba.alpha
name Copy1
xpos -137
ypos -751
disable {{"\[exists parent.input1] == 0"}}
}
set N492aa800 [stack 0]
push $N492aa800
Dot {
name Dot2
xpos -208
ypos -741
}
Invert {
channels alpha
name Invert1
xpos -242
ypos -696
}
Dot {
name Dot4
xpos -208
ypos -623
}
Switch {
inputs 2
which {{invertMask}}
name Switch1
xpos -137
ypos -627
}
Dilate {
channels alpha
size {{abs(erodeMask)*-1+-1}}
name Dilate1
xpos -137
ypos -575
}
Input {
inputs 0
name Input
xpos 27
ypos -729
}
Colorspace {
colorspace_out Cineon
name Colorspace1
xpos 27
ypos -626
disable {{"parent.log != 1"}}
}
Merge2 {
inputs 2
operation mask
bbox B
name Merge1
xpos 27
ypos -501
}
Dot {
name Dot3
xpos 61
ypos -428
}
set Nc32cdc00 [stack 0]
Dot {
name Dot1
xpos 370
ypos -428
}
Blur {
channels rgba
size {{parent.master.size/32}}
filter box
quality {{parent.master.quality}}
name Blur5
label "\[value size] px"
xpos 336
ypos -380
}
set Nb0597800 [stack 0]
Unpremult {
name Unpremult5
xpos 336
ypos -342
}
Expression {
expr3 "a != 0"
name Expression1
xpos 336
ypos -316
}
Blur {
channels rgba
size {{parent.master.size/16}}
filter box
quality {{parent.master.quality}}
name Blur13
label "\[value size] px"
xpos 343
ypos -293
}
set Nb0596000 [stack 0]
Unpremult {
name Unpremult13
xpos 336
ypos -255
}
Expression {
expr3 "a != 0"
name Expression13
xpos 336
ypos -229
}
Blur {
channels rgba
size {{parent.master.size/8}}
filter box
quality {{parent.master.quality}}
name Blur15
label "\[value size] px"
xpos 336
ypos -203
}
set Nc1a1f400 [stack 0]
Unpremult {
name Unpremult15
xpos 336
ypos -165
}
Expression {
expr3 "a != 0"
name Expression15
xpos 336
ypos -139
}
Blur {
channels rgba
size {{parent.master.size/4}}
quality {{parent.master.quality}}
name Blur16
label "\[value size] px"
xpos 336
ypos -113
}
set Nc1a1f000 [stack 0]
Unpremult {
name Unpremult16
xpos 336
ypos -75
}
Expression {
expr3 "a != 0"
name Expression16
xpos 336
ypos -49
}
Blur {
channels rgba
size {{parent.master.size/2}}
quality {{parent.master.quality}}
name Blur17
label "\[value size] px"
xpos 336
ypos -19
}
set Na4475000 [stack 0]
Unpremult {
name Unpremult17
xpos 336
ypos 19
}
Expression {
expr3 "a != 0"
name Expression17
xpos 336
ypos 45
}
Blur {
channels rgba
size {{parent.master.size}}
quality {{parent.master.quality}}
name Blur18
label "\[value size] px"
xpos 336
ypos 71
}
set Na4475c00 [stack 0]
Unpremult {
name Unpremult18
xpos 336
ypos 116
}
Expression {
expr3 "a != 0"
name Expression18
xpos 336
ypos 131
}
Blur {
channels rgba
size {{parent.master.size*2}}
quality {{parent.master.quality}}
name Blur19
label "\[value size] px"
xpos 336
ypos 157
}
Unpremult {
name Unpremult6
xpos 336
ypos 195
}
Expression {
expr3 "a != 0"
name Expression6
xpos 336
ypos 221
}
push $Na4475c00
push $Na4475000
push $Nc1a1f000
push $Nc1a1f400
push $Nb0596000
push 0
push $Nb0597800
push $Nc32cdc00
Merge2 {
inputs 8+1
operation under
bbox B
invert_mask true
name Merge4
xpos 27
ypos 221
}
Colorspace {
colorspace_in Cineon
name Colorspace2
xpos 27
ypos 293
disable {{"parent.log != 1"}}
}
Output {
name Output1
xpos 27
ypos 356
}
push $Nc32cdc00
Blur {
channels rgba
size 20
name master
label "\[value size] px"
xpos 154
ypos -384
hide_input true
}
push $Nb0597800
Viewer {
frame_range 100-100
colour_sample_bbox {-0.15625 0.2568359375 -0.1552734375 0.2578125}
name Viewer1
xpos 1872
ypos 1458
}
end_group