0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

任意のCryptomatteデータを作成する

Last updated at Posted at 2025-02-27

前回BlenderからAfterEffectsにマスクデータを受け渡す方式として
OpenEXRで保存したCryptomatteデータの基本的な使い方を試しました

AfterEffectsではエフェクトでクリックした部分のマスクを抽出できるので
動画の編集作業をする人には 複数のマスクやカラーマスクより扱いやすく感じるようです
ただ、標準機能では現状ではオブジェクトやマテリアル基準で分けるデータしか作成できません

任意の塗分けのマスクを作れないかCryptomatteの規格について調べてみました
仕様については wikipediaからもリンクされているこのPDFの通りのようです
https://raw.githubusercontent.com/Psyop/Cryptomatte/master/specification/IDmattes_poster.pdf
どうやら

  • オブジェクトやマテリアルといったものにIDを割り当て
  • 画像のピクセル毎に画像の要素にどのIDのものが寄与している割合が大きいかを計算して順序付けし
  • 順序付けした順にレベル(画像処理ソフトのレイヤのようなもの)で上になるようにする
  • カバレッジ(そのIDの要素がピクセルにどの程度寄与してるか)を記録する
    といった処理のようです

1つのチャンネルの値の違いの塗分けでIDを表現するようですが
OpenEXRは各チャンネル32ビット浮動小数点でデータを記録するので 1チャンネルだけでも十分な数です
(16ビット浮動小数点や圧縮方式によっては24ビット精度になるようです)
また、1つのレベルはIDとカバレッジのペアで構成されていて
1つのレベルで画像のRGBAのうち2チャンネルづつを利用するようです
image.png
Cryptomatteを設定する時のデフォルトのレベルが6でレンダーレイヤが3つ出力されているのはこういったことですね

Cryptomatteの値

Cryptomatteで出力された画像の値を見ておきます
左がレンダリングのプレビュー画像 右がCryptomatteで 赤色のオブジェクトは半透明です
image.png
Cryptomatteは一見ただの緑色主体の画像ですが
IDを示す数が入っていて とても大きな値だったりマイナスだったりします
半透明の重なりのない部分はRとGのチャンネルのみ値が入っていて
オブジェクトIDなので 重なりがなければ同じオブジェクトの部分では全部同じ値です

一方の半透明の部分はRにピクセル内で一番寄与している画像のID Gにカバレッジ Bに2番目に寄与しているIDと場所により変化します

半透明で重なったものが幾つもある場合にはレベルが何階層も必要になりますが
単純な塗分けマスク程度の場合は IDを示すベタ塗りと境目のアンチエイリアス情報のペアだけしか必要ないので
レベルも2つ(レンダーレイヤー1つ分)で済みそうです

Cryptomatteデータを自分で作ってみたいと思います。

IDでの単純な塗分け

まず左端のような画像を元に 透明 白 黒 ではっきり塗分けたCryptomatte画像をAfterEffectsに読み込ませてみました
image.png
黒部分のRチャンネル(Xチャンネル)に0.1 白部分に0.5と ID代りの数値を入れています
透明部分は空白を表す0.0 1つのレベルしか使用していないのでアルファは全て0に設定しました
2502601.gif
AfterEffectsに読み込んだところ 「Criptmatte」のエフェクトを手動で設定する必要はありますが
マットの範囲の指定を読ませることができました

グレースケールのCryptomatte変換

仕様に合わせてグレースケールのマスクを作る計算をし

  • カバレッジのカバレッジの一番大きいIDをRチャンネルに
  • 重なりがある場合はもう一方のIDをBチャンネルに
  • 上のレイヤのカバレッジ(グレースケール)をGチャンネルに
  • 1から上のレイヤのカバレッジを引いた値をアルファチャンネルに

をBlenderのコンポジションノードで作るとこうなります
image.png
AfterEffectsで読ませてみました
2502602.gif
うまくマスク抽出できているようですね

もっとシンプルに カバレッジに応じて前後を変えなくても
AfterEffectsではそれぞれのマスクのIDとグレースケールのみでも
同様に選択ができましたので その計算をしてみました
image.png
これならかなりシンプルですね。

ただ注意が必要なのは
一番上のレベルに有効なIDを設定せずに下のレベルにマスクのデータを設定してもマスクとして機能しないようで
また カバレッジを0に設定した状態でも そのカーソル位置に設定されているIDを選択してしまうようです。
一方で 複数のレベルのカバレッジの合計を1にする計算がファイルの仕様に書かれていますが
重なった部分の 片方のカバレッジを1にする等、合計が1でない設定でもエラーにはならないようです

図の 中央やや左の「比較」を使った計算が入っているのは不要な箇所にはID0を設定するためのものです

このまま使うということはないかもしれませんが
何かの参考になれば幸いです

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?