點完全指南:利用外部 Roto 遮罩實現(xiàn)像素級通道合并)
音視頻視頻處理圖形學桌面應用【免費下載鏈接】NatronOpen-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.項目地址https://gitcode.com/gh_mirrors/na/Natron點擊查看免費下載本文以 Natron 官方插件文檔 Documentation/source/plugins/net.sf.openfx.MergeRoto.rst 為核心系統(tǒng)講解 RotoMergenet.sf.openfx.MergeRoto節(jié)點的合并原理、全部算子公式、輸入與參數(shù)配置。讀者將掌握如何在合成管線中借助 RotoMask 外部 alpha 通道以任意 Porter-Duff 算子或混合模式將 A 輸入繪制到 B 輸入上并理解每個參數(shù)在底層引擎中的真實作用。節(jié)點概述RotoMerge 與普通 Merge 的區(qū)別RotoMerge 是 Natron 合成節(jié)點家族中的一員其核心特征是使用外部 alpha 通道作為輸入 A 的合成 alpha。普通 Merge 節(jié)點直接使用 A、B 兩個輸入各自的 alpha 通道參與合成而 RotoMerge 多出了一個關鍵維度RotoMask——一個獨立的遮罩通常來自 Roto 節(jié)點的繪制結果被用作輸入 A 的 alpha 值即公式中的小寫字母a。具體而言該節(jié)點對兩個輸入執(zhí)行逐像素pixel-by-pixel合并運算輸入 A 的全部通道RGBA與輸入 B 的全部通道進行合并但合并時輸入 A 的 alpha 不再取自其自身 alpha 通道而是取 RotoMask 的值。于是A 的 alpha 通過 RotoMask覆蓋到 B 的 alpha 之上。這一機制尤其適合以下場景用 Roto 繪制出的遮罩作為外部 alpha把 A 輸入的顏色信息刷到 B 輸入的 alpha 通道上在 A 自身 alpha 為零的區(qū)域仍然借助不透明的外部遮罩將 A 的像素值寫入結果RotoMask 可以在 A 的 alpha 為 0 的位置保持完全不透明用受控的遮罩形狀精確限定合并發(fā)生的區(qū)域避免 A 自身 alpha 形狀干擾合成結果。從源碼結構看Natron 內(nèi)置的 Merge 節(jié)點與 RotoMerge 共享同一套算子體系引擎中的 Global/Enums.h 定義了MergingFunctionEnum枚舉從eMergeATop到eMergeXOR共 38 個算子其注釋明確要求與 OpenFX 的ofxsMerging.h保持同步Engine/MergingEnum.h 則提供getOperatorString()算子腳本名與getOperatorHelpString()算子公式提示兩個輔助函數(shù)RotoMerge 文檔中列出的算子名稱與公式與該頭文件逐項一致。在 GUI 端Gui/NodeGui.cpp 正是通過Merge::getOperatorString()與Merge::getOperatorPixmap()來為節(jié)點構建算子下拉列表和對應圖標。重要前提輸入 alpha 的不透明處理規(guī)則使用 RotoMerge 之前必須理解一條關鍵規(guī)則如果 A 或 B 輸入只連接了 RGB 通道無 alpha其 alpha 通道會被視為恒為不透明值 1。此時只要B 通道 ABChannelsA復選框處于勾選狀態(tài)輸出就會完全不透明。造成這一行為的根本原因是非零 RGB 值與零 alpha 組合不是合法的 alpha 預乘premultipliedRGBA 值。如果用戶希望背景保持完全透明那么背景只能為純黑色——這等價于根本不使用合并算子。非黑色且完全透明的像素不應出現(xiàn)在任何規(guī)范的合成圖compositing graph中這是所有合成軟件共享的約定RotoMerge 只是嚴格遵循了這一約定。算子詳解從 Porter-Duff 到混合模式RotoMerge 共提供 38 種合并算子全部通過operation腳本名operation參數(shù)選擇默認值為over。以下為完整算子清單。為便于閱讀約定大寫A、B代表兩個輸入各自的某個分量R、G、B 或 A小寫a、b代表兩個輸入各自的 alpha 通道值。運算公式對每個分量獨立應用。Porter-Duff 合成算子這組算子是計算機圖形合成的基礎源自 Porter 與 Duff 的經(jīng)典論文《Compositing Digital Images》SIGGRAPH 1984也是 W3C Compositing and Blending Level 1 規(guī)范的核心內(nèi)容算子腳本名公式別名copyAsrcoverA B(1 - a)src-overunderA(1 - b) Bdst-overinA·bsrc-inmaskB·adst-inoutA(1 - b)src-outstencilB(1 - a)dst-outatopA·b B(1 - a)src-atopxorA(1 - b) B(1 - a)—其中over默認算子是最常用的前景疊背景操作A 覆蓋在 B 之上重疊區(qū)域按 A 的 alpha 混合。matte見其他算子則是其非預乘版本。Multiply 與 Screen 類混合模式這類算子源于印刷與圖像編輯的混合模式Blend Modes每個通道獨立計算multiplyAB若 A 0 且 B 0 則取 AscreenA B - AB若 A 或 B ≤ 1否則max(A, B)overlayB 0.5 時取multiply(A, 2·B)B 0.5 時取screen(A, 2·B - 1)hard-lightA 0.5 時取multiply(2·A, B)A 0.5 時取screen(2·A - 1, B)soft-lightA 0.5 時做 burn-in加深A 0.5 時做 lighten提亮Dodge 與 Burn 類color-dodge將 B 向 A 的方向提亮brighten B towards Acolor-burn將 B 向 A 的方向壓暗darken B towards ApinlightB ≥ 0.5 時取max(A, 2·B - 1)否則取min(A, B·2)differenceabs(A - B)別名 absminusexclusionA B - 2ABdivideA / B若 A 0 且 B 0 則取 0簡單算術混合模式plusA B別名 addfromB - A別名 subtractminusA - Bdifferenceabs(A - B)別名 absminusminmin(A, B)別名 darken only只取暗者maxmax(A, B)別名 lighten only只取亮者色相、飽和度與亮度類HSL 類這組算子通過SetLum設置亮度與SetSat設置飽和度輔助函數(shù)定義用于將 A 的色相/飽和度/顏色與 B 的對應屬性進行重組hueSetLum(SetSat(A, Sat(B)), Lum(B))——取 A 的色相、B 的飽和度與亮度saturationSetLum(SetSat(B, Sat(A)), Lum(B))——取 A 的飽和度、B 的色相與亮度colorSetLum(A, Lum(B))——取 A 的色相與飽和度、B 的亮度luminositySetLum(B, Lum(A))——取 B 的色相與飽和度、A 的亮度需要注意HSL 模式hue、saturation、color、luminosity始終強制啟用 Alpha masking即這些模式下輸出 alpha 始終按a b - a·b計算詳見下文 Alpha masking 參數(shù)。其他算子average(A B) / 2conjoint-overA B(1 - a)/b若 a b 則取 Adisjoint-overA B(1 - a)/b若 a b 1 則取A Bfreeze1 - sqrt(1 - A)/Bgeometric2AB/(A B)grain-extractB - A 0.5源自 GIMP 圖層模式grain-mergeB A - 0.5源自 GIMP 圖層模式hypotsqrt(A·A B·B)matteA·a B(1 - a)即非預乘unpremultiplied版本的 overreflectA·A / (1 - B)參考資源除 Porter-Duff 論文外上述算子的理論依據(jù)還包括 W3C《Compositing and Blending Level 1》、W3C《SVG Compositing Specification》、ISO 32000-1:2008PDF 規(guī)范第 11.3 節(jié)Basic Compositing Operations、Marc Levoy 的《Digital Image Compositing》課程資料以及 Martin Constable 關于 Nuke Merge 算子與B 輸入主導性Primacy of the B Feed的論述。grain-extract 與 grain-merge 的描述見 GIMP 官方文檔的圖層模式章節(jié)。這些資料共同構成了算子集合的理論出處。輸入端口詳解RotoMerge 共提供 4 個輸入端口全部為可選Optional輸入描述是否可選B主輸入main input。當節(jié)點被禁用disable時B 被直接透傳pass through作為輸出。是A要與輸入 B 合并的圖像序列。是Mask遮罩輸入作為輸入 A 的外部 alpha 通道來源。是A2備用輸入 A用途同 A。是關鍵行為由于 B 是主輸入且承擔透傳職責禁用節(jié)點時輸出的仍是 B而 A 與 A2 兩個輸入端口的存在意味著可以把兩個不同的前景序列接入并切換使用在腳本中通過切換連接來實現(xiàn) A 與 A2 的互換。Mask 端口即文檔描述中RotoMask的接入位置——它并不參與顏色合并而是僅作為 A 的 alpha 值參與所有公式計算??丶?shù)Controls逐項解析以下是該節(jié)點面板中全部參數(shù)參數(shù)名/腳本名、類型、默認值、功能參數(shù) / 腳本名類型默認值功能Operation /operationChoiceover用于合并 A 與 B 的算子。公式對每個分量獨立應用若勾選 Alpha masking輸出 alpha 改用a b - a·b計算HSL 模式hue、saturation、color、luminosity總是啟用 Alpha masking??蛇x值見上文算子詳解全部 38 項。Bounding Box /bboxChoiceUnion決定輸出圖像的包圍盒bounding box來源Union (union)——所有已連接輸入包圍盒的并集Intersection (intersection)——所有已連接輸入包圍盒的交集A (a)——僅使用輸入 A 的包圍盒B (b)——僅使用輸入 B 的包圍盒。Alpha masking /screenAlphaBooleanOff啟用后在另一圖像 alpha 為 0 的區(qū)域輸入圖像保持不變輸出 alpha 被設置為a b - a·b禁用時 alpha 通道與普通通道一樣參與逐像素運算。對于該選項不適用或無影響的算子此參數(shù)會被置灰禁用。R /AChannelsRBooleanOn是否使用輸入 A 的紅色通道G /AChannelsGBooleanOn是否使用輸入 A 的綠色通道B /AChannelsBBooleanOn是否使用輸入 A 的藍色通道A /AChannelsABooleanOn是否使用輸入 A 的 alpha 通道R /BChannelsRBooleanOn是否使用輸入 B 的紅色通道G /BChannelsGBooleanOn是否使用輸入 B 的綠色通道B /BChannelsBBooleanOn是否使用輸入 B 的藍色通道A /BChannelsABooleanOn是否使用輸入 B 的 alpha 通道R /OutputChannelsRBooleanOn是否將紅色通道寫入輸出G /OutputChannelsGBooleanOn是否將綠色通道寫入輸出B /OutputChannelsBBooleanOn是否將藍色通道寫入輸出A /OutputChannelsABooleanOn是否將 alpha 通道寫入輸出Invert Mask /maskInvertBooleanOff勾選后效果在遮罩為 0 的區(qū)域完全生效即遮罩被反轉。Mix /mixDouble1原圖與變換后圖像之間的混合因子0 表示完全不混合1 表示完全應用。關鍵參數(shù)的行為細節(jié)通道開關AChannels*/BChannels*/OutputChannels*這 12 個布爾參數(shù)讓用戶能夠精確控制參與運算與寫入輸出的通道。例如只勾選 A 的 R 通道與 B 的 R 通道即可把合并限制在紅色分量上關閉全部OutputChannels*中的某幾個則對應通道在輸出中被凍結為原值。這一設計使 RotoMerge 可以充當通道提取器或部分通道合成器。上文提到的 alpha 不透明規(guī)則正是通過BChannelsA與AChannelsA的取值體現(xiàn)的只要任一輸入的 alpha 通道開關打開而該輸入又缺少 alpha 數(shù)據(jù)就按不透明處理。Alpha maskingscreenAlpha啟用后公式中的輸出 alpha 變?yōu)閍 b - a·b這是典型的屏幕疊加式 alpha 累積公式——兩個半透明區(qū)域的透明度按乘法概率合并。同時保證在另一圖像 alpha 為 0 的區(qū)域本圖像的像素原樣保留不被另一側擦掉。對于 copy、in、out 等 Porter-Duff 算子alpha 累積方式已由算子本身確定因此該選項不適用并被禁用。Bounding Boxbbox控制渲染區(qū)域RoD的確定方式。默認 Union 取所有已連接輸入的包圍盒并集保證合并結果完整選擇 Intersection 則只渲染交集區(qū)域可顯著縮小渲染面積、提升性能但會裁掉并集區(qū)域中只有單個輸入存在的像素。Invert MaskmaskInvert實現(xiàn)遮罩取反。默認Off效果在遮罩值為 1 處生效勾選后變?yōu)樵谡谡种禐?0 處生效等價于外部 alpha 取反后再參與公式可用于快速切換合成內(nèi)外區(qū)域。Mixmix在原始輸出與最終合成結果之間做線性混合數(shù)值為 0 時節(jié)點等效于透傳輸出等于不經(jīng)過合并的原始圖像為 1 時完全應用合并結果中間值用于過渡動畫。源碼實現(xiàn)與文檔生成機制RotoMerge 的文檔頁面由 Natron 自動生成而非手寫維護。其生成鏈路如下引擎端 Engine/NodeDocumentation.cpp 負責收集插件的 ID、標簽、描述、分組與圖標等信息并將其與各參數(shù)的腳本名、類型、默認值、幫助文本組裝為 Markdown 文檔渲染器通過--export-docs命令行選項見 tools/genStaticDocs.sh批量導出所有插件的.md文檔腳本隨后調(diào)用 pandoc要求版本 ≤ 2.3.1以保證能生成 grid 表格將 Markdown 轉換為 reStructuredText并插入.. _plugin-id:錨點標簽與表格樣式指令——CONTROLSTABLEPROPS占位符被替換為.. tabularcolumns::與.. cssclass:: longtable見腳本第 93 行這就是本文所依據(jù)的 net.sf.openfx.MergeRoto.rst 中 Controls 表格樣式的來源。這意味著插件文檔中的算子列表、參數(shù)表格與幫助文本與 Engine/MergingEnum.h 中維護的getOperatorString()/getOperatorHelpString()數(shù)據(jù)天然一致。例如 RotoMerge 文檔中over的公式AB(1-a)與 Engine/MergingEnum.h 中eMergeOver的幫助字符串完全相同二者共同保證了 Natron 內(nèi)置 Merge 節(jié)點如 Merge、MergeRoto 等基于同一算子集的節(jié)點與 RotoMerge 插件在算子語義上的一致性。實際應用PyPlug 腳本中的 RotoMerge 式用法在 Natron 自帶的 Python 插件PyPlugs中可以找到大量直接使用這套合并算子與通道參數(shù)的實戰(zhàn)范例可作為 RotoMerge 參數(shù)編排的參考Gui/Resources/PyPlugs/Glow.pyGlow 插件創(chuàng)建 Merge 節(jié)點后通過param.setValue(plus)選擇加算混合并依據(jù)發(fā)光開關對lastNode.getParam(AChannelsA)調(diào)用setValue(False)/setValue(True)來啟停 alpha 通道的參與隨后param.setValue(Natron(plus)/Natron)為該參數(shù)寫入表達式引用實現(xiàn)與其他節(jié)點參數(shù)的聯(lián)動。Gui/Resources/PyPlugs/Glow.py同一腳本中以param.setValue(copy)使用 copy 算子配合表達式Natron(copy)/Natron實現(xiàn)通道搬運。Gui/Resources/PyPlugs/LightWrap.pyLightWrap 插件逐一訪問AChannelsR、AChannelsG、AChannelsB三個參數(shù)展示了按通道粒度精細控制合并輸入的做法。在腳本中創(chuàng)建 RotoMerge 節(jié)點并配置參數(shù)的通用模式為node app.createNode(net.sf.openfx.MergeRoto) node.connectInput(0, bInput) # 端口 0 B主輸入 node.connectInput(1, aInput) # 端口 1 A node.connectInput(2, maskInput) # 端口 2 Mask外部 alpha node.getParam(operation).setValue(over) # 或 plus、multiply 等任意算子 node.getParam(screenAlpha).setValue(True) # 啟用 alpha 遮罩式累積 node.getParam(AChannelsA).setValue(False) # 按需關閉 A 的 alpha 參與 node.getParam(mix).setValue(1.0)典型合成場景與注意事項場景一用 Roto 形狀約束的疊加合成。將前景序列接入 ARoto 節(jié)點繪制形狀的 alpha接入 MaskB 接入背景。選擇over算子即可實現(xiàn)僅在 Roto 形狀內(nèi)把前景畫到背景上的效果——前景自身的 alpha 形狀被 RotoMask 取代合并區(qū)域完全由 Roto 決定。場景二通道級局部替換。關閉除紅色通道外的所有AChannels*與BChannels*再配合bbox的 Intersection 選項可以實現(xiàn)受遮罩約束的單通道替換且只渲染必要區(qū)域。場景三HSL 色彩重組。使用 hue、saturation、color、luminosity 算子時注意其 alpha 恒按a b - a·b累積無需也無法再手動開啟 Alpha masking。使用建議與限制保持規(guī)范化的預乘 alpha 數(shù)據(jù)流如前所述非黑色且 alpha 為 0 的像素在 RotoMerge 中會被不透明化處理。合成圖內(nèi)應避免出現(xiàn)這類非法像素否則結果可能與預期不符。B 輸入承擔透傳職責禁用節(jié)點時輸出等于 B因此將主畫面接到 B、把次要畫面接到 A 是更穩(wěn)妥的連接習慣。先定算子、再調(diào)通道算子決定公式通道開關決定哪些分量參與公式。兩者結合才能得到精確的合成行為當 Alpha masking 選項被置灰時說明當前算子如 copy、in、out 等的 alpha 語義已由 Porter-Duff 公式固定無需額外配置。Mix 用于過渡需要做合成強度動畫時對mix參數(shù)打關鍵幀即可不必切換算子。RotoMerge 的價值在于把合并從單純的 A/B 雙輸入操作擴展為A/B 圖像 外部 Roto 遮罩的三方協(xié)作配合 38 種覆蓋 Porter-Duff、混合模式、HSL 重組與特殊效果的算子使其成為 Natron 節(jié)點圖中處理遮罩約束合成、通道搬運與色彩重組的通用工具。贊分享音視頻視頻處理圖形學桌面應用【免費下載鏈接】NatronOpen-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry.項目地址https://gitcode.com/gh_mirrors/na/Natron點擊查看免費下載相關推薦Natron Difference 節(jié)點完全指南用 clean plate 與圖像差異生成粗糙遮罩Natron Difference 節(jié)點完全指南用 clean plate 與圖像差異生成粗糙遮罩 Differencenet.sf.openfx.Diff音視頻視頻處理圖形學桌面應用Natron 合成實戰(zhàn)Roto / RotoPaint 節(jié)點完全指南蒙版、摳像與矢量繪畫Natron 合成實戰(zhàn)Roto / RotoPaint 節(jié)點完全指南蒙版、摳像與矢量繪畫 本文面向使用 Natron 進行視頻合成的用戶系統(tǒng)講解節(jié)點圖合音視頻視頻處理圖形學桌面應用Natron ZMask 節(jié)點完全指南從深度緩沖生成可控遮罩的原理與實戰(zhàn)Natron ZMask 節(jié)點完全指南從深度緩沖生成可控遮罩的原理與實戰(zhàn) 本文圍繞 Natron 內(nèi)置的 ZMask 節(jié)點 插件 ID fr.inria.Z音視頻視頻處理圖形學桌面應用上一篇graphql-go 高級特性并行執(zhí)行、字段解析器和類型檢查下一篇Draft.js 工程實踐解密2017-03-31 周會中的 Feature Flags、Master 直發(fā)發(fā)布與內(nèi)外倉庫同步機制創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考