動画アニメーションのノイズ除去方法と解析
テーブル目次:
- 動画アニメーションにおけるノイズの課題とは?
- Blenderのノイズ除去機能について
- 空間ノイズ除去によるノイズ軽減
- 時間ノイズ除去とは?
- NVidia OptiXを使用した時間ノイズ除去方法
- コンポジタでのノードマジックによる時間ノイズ除去方法
- レンダリングサンプルの増加によるノイズ軽減
- 連続フレームの結合によるノイズ削減
- モーションベクトルとその利用方法
- ゴーストイメージとシャドウの問題と解決策
📹 動画アニメーションのノイズとその軽減方法
動画アニメーション制作において、ノイズは一般的な問題です。BlenderのCyclesパストレーシングエンジンでは、ランダムサンプリングからノイズが発生します。低サンプルレートでは、ノイズは斑点として表示されます。十分なサンプル数があれば、完全にクリーンな画像が作成されますが、時間がかかる場合もあります。Blenderには、空間ノイズ除去機能が組み込まれており、待つ必要はありません。空間ノイズ除去は、隣接ピクセル間の差をなめらかにすることで、ノイズを効果的に除去します。ノイズフリーに見える完璧なノイズ除去画像でも、アニメーションに使用するとチラつきやゆらぎが発生する場合があります。このようなビデオノイズは、連続フレーム間の差に起因しています。この問題を修正するには、時間ノイズ除去の異なる戦略が必要です。空間ノイズ除去はX/Y次元でのみ動作し、時間ノイズ除去は時間次元で動作します。時間ノイズ除去と空間ノイズ除去は連携して、アニメーション内のノイズを軽減します。Blenderは、NVidia OptiXを使用して時間ノイズ除去を実行することができますが、現在のバージョンでは開発者向けの機能として非表示になっています。ハードウェアベースのAIノイズ除去機能は、レイトレーシングゲーム向けに設計されており、ピクセルあたり1〜2つのレイトレースサンプルの予算で動作することが求められます。それは極端なノイズでも時間的に安定しています。また、コンポジタ内のノードマジックでも時間ノイズ除去を行うことが可能です。時間ノイズ除去のノードグループを使用して、その仕組みや制限、結果を調べ、OptiXと比較します。ノイズを軽減するための主要な機構は、より多くのサンプルをレンダリングすることですが、それはより長い時間がかかります。サンプル数を倍にしても、品質は倍になるわけではありません。減少するリターンがあります。連続するフレームを結合することで、追加の「無料」サンプルを得る方法があります。この例では、1024サンプルの3つのフレームを結合することで、3072サンプルでレンダリングされた単一のフレームとほぼ同じノイズレベルを得ることができます。画像はノイズフリーではありませんが、空間ノイズ除去によりより良い結果が得られます。重要なことは、連続するフレームを結合することで、チラつきを引き起こすフレーム間の差をなめらかにする助けになるということです。この単純な例では、イメージ内の移動がある場所で失敗し、ゴーストイメージが発生します。ただし、Blenderにはフレーム間の移動量を補正するメカニズムが用意されています。Cyclesベクトルレンダーレイヤーは、オブジェクトのフレーム間の移動を説明するモーションベクトルを出力します。実際には、RGBAデータでは、前のフレームへのベクトルと次のフレームへのベクトルの2つのベクトルが得られます。私の時間ノイズ除去ノードグループを使用して、モーションベクトルを視覚化することができます。コンポジタにEXRイメージシーケンスを読み込み、各フレームに個別のフレームオフセットを指定します。これにより、前のフレーム、現在のフレーム、次のフレームにアクセスできます。時間ノイズ除去ノードグループには、3つの連続フレームからの画像とモーションベクトルの入力があります。デバッグノードグループを使用してモーションベクトルを表示します。色でモーションベクトルが視覚化され、色相はモーションの方向を表し、輝度は距離を示します。立方体に焦点を当てると、モーションベクトルは下または右を指し示しています。方向は、正順および逆ベクトルを比較する際に反転しません。ディスプレイスノードは、モーションベクトルを使用して近隣フレームを変形しますが、問題もあります。オブジェクトは変形されており、元の位置にオブジェクトのゴーストコピーも存在します。さらに、影も変形されず、元の位置に残ります。画像の変位は、画像のすべてのピクセルで行われます。新しい位置のモーションベクトルは、最初のフレームを2番目のフレームと同じ位置に変位させます。しかし、背景が明らかになる位置には0,0のモーションベクトルも存在します。これにより、イメージが同じ位置に変位され、ゴーストオブジェクトが作成されます。ゴーストイメージを引き起こすモーションベクトルは、単純に背景オブジェクトのベクトルです。この場合、背景は動いていないため、ゼロベクトルです。モーションベクトルは、近隣フレームでオブジェクトが隠れているか画面外にある場合でも、技術的には有効です。ただし、技術的に有効であっても、ゴースティングを引き起こす場合には何の意味もありません。単純な3つのイメージの混合を行うと、ゴーストオブジェクトが低い不透明度で表示されます。すべての影も部分的に透明です。代わりに、ゴースティングを排除して影を修正するためには、より賢明なフレームブレンディングが必要です。野球ボールがレンガの壁を横切る場合を考えてみましょう。緑の矢印は、両方のオブジェクトの正方向モーションベクトルを示しています。同様に、逆方向モーションベクトルは、前のフレームのピクセル位置を示しています。近隣フレーム間にはベクトル間の相関関係があります。現在のフレームの逆ベクトルに前のフレームの正ベクトルを追加すると、開始点に戻りますが、必ずしもそうではありません。レンガの壁のこのパッチを考えてみましょう。逆方向モーションベクトルは右を指しています。しかし、前のフレームでは野球ボールがその場所に存在していました。この位置の正方向ベクトルは、右にさらにポイントし、開始点には戻りません。前方と逆方向のベクトルが互いに反対でない場合、フレームが一致しない場所です。ここがディスプレースノードグループがゴーストイメージを作成する場所です。モーションベクトルを比較することで、ノードグループはブレンド時に含めるまたは除外するエリアのマスクを生成します。しかし、シャドウの問題は解決されません。この例では、シャドウと非シャドウエリアのブレンドを処理するためには、明るさのしきい値を厳密に設定する必要があります。シャドウとオーバーレイする前に、時間ノイズ除去が行われるので、シャドウも一緒に処理します。私の知る限り、Shadow Catcherパスは私が必要とすることを実行することはできません。Shadow Catcherは特定のオブジェクトでのみ動作することができ、どのオブジェクトが当たってもすべてのシャドウを自動的にキャプチャする必要があります。概念の証明のために、シーンを複製し、すべてのオブジェクトでShadow Ray Visibilityを無効にするテストレンダーを行いました。照明は影響を受けますが、私のシーンでは違いは最小限でした。2つのレンダリングセットでは、Divideを使用して影を分離し、時間ノイズ除去後に影を重ね合わせることができました。うまく動作し、閾値は影と非影領域の処理に必要ありませんでした。もちろん、このワークフローは実用的ではありません。シーンを2回レンダリングする必要があります。Blenderがすべてのシャドウを自動的に別のレンダーレイヤーに出力できると良いですね。ノードベースの時間ノイズ除去とOptiXを比較しましょう。これらのシーンはサンプル数が少ないため、強い時間的ノイズが見られます。OptiXはモンスターシーンでより多くの時間ノイズを除去しているように見えますが、ノードベースのノイズ除去器はより多くのディテールを保持しています。ジャンクショップシーンでは、ノードベースの時間ノイズ除去器がOptiXよりも優れているように思えます。私にとって特に注目すべきは、ゲージの矢印、彼女の顔と髪です。両方のノイズ除去器は時間的ノイズをきれいに処理しており、サンプル数が多い場合にはさらに良い結果が得られます。時間ノイズ除去のプロセスは少しクセがあり、不正確になりやすいですが、機能します。空間ノイズ除去に依存するため、ほとんどのアニメーションでは一定の時間ノイズ除去が必要です。アニメーションを複数レイヤーのEXRとしてレンダリングし、必要なレンダーパスを含めます。その後、OptiXまたはノードベースの時間ノイズ除去を使用するか、必要な場所でさらにサンプルをレンダリングするかのオプションがあります。ノードベースの時間ノイズ除去はOptiXよりも少し遅く、設定に一定の努力が必要ですが、アニメーションの最大限の利点を引き出すためにプロセスを調整することができます。私のノードグループは無料でダウンロードできます。リンクは動画の説明にあります。とにかく、ご視聴ありがとうございました。この情報が役に立つことを願っています。いいねやチャンネル登録もお願いします。ご質問やコメント、ノードグループの改善に関する提案など、どんなフィードバックでも歓迎します。"""