Skip to content

routersys/YMM4-DirectionalColorKey

Repository files navigation

方向色分離キー for YMM4

License .NET Release

YukkuriMovieMaker4(YMM4)上で動作する、背景色からの色変位方向をクラスタリングして前景を分離する映像エフェクトプラグインです。 HLSL ピクセルシェーダーを Direct2D カスタムエフェクトとして実装しており、GPU 上でのリアルタイムレンダリングが可能です。 背景色を Oklab 色空間へ変換し、各ピクセルの背景からの変位ベクトルを正規化した方向場を k-means クラスタリングで分離することで、複数の前景層を方向ごとに切り分けてキーイングします。

Image


目次

  1. 概要
  2. 動作要件
  3. インストール方法
  4. 主な機能
  5. アルゴリズム
  6. パラメータ一覧
  7. 使い方ガイド
  8. 注意事項
  9. 免責事項
  10. ライセンス

概要

本プラグインは YMM4 の映像エフェクトとして動作します。除去する背景色を指定すると、その色を Oklab 色空間の基準点として読み取り、各ピクセルが背景色からどの方向へ色変位しているかを表す方向場を生成します。この方向場を平滑化したうえでクラスタリングし、方向の異なる前景層を最大 4 つまで分離して、それぞれにアルファ値を割り当てます。

Direct2D カスタムピクセルシェーダーエフェクト(D2D1CustomShaderEffectBase)として実装されており、コンパイル済み HLSL シェーダー(.cso)を利用します。方向場の生成・平滑化・クラスタリング・前景色推定には ComputeSharp による GPU シェーダーを使用します。


動作要件

項目 要件
OS Windows 10 バージョン 2004(ビルド 19041)以降 / Windows 11(64 bit)
YukkuriMovieMaker4 最新版を推奨
ランタイム .NET 10.0

インストール方法

  1. Releases ページから最新のプラグインファイル(.ymme)をダウンロードしてください。
  2. YMM4 が起動していないことを確認し、ダウンロードしたファイルを実行してインストールします。
  3. YMM4 を起動し、タイムライン上のアイテムに映像エフェクトを追加します。
  4. 映像エフェクトの種類として 「方向色分離キー」 を選択してください。

主な機能

1. Oklab 方向場による背景分離

除去する背景色を Oklab 色空間へ変換し、各ピクセルの色を同じく Oklab へ変換したうえで、背景色からの変位ベクトルを算出します。変位の大きさがノイズ閾値未満のピクセルは背景とみなして無効方向として扱い、それ以外は変位を正規化した単位方向ベクトルとして方向場へ格納します。アルファ値が 0 のピクセルは方向場から除外されます。

2. 色類似度重み付き方向場平滑化

生成した方向場に対して、色の近いピクセル同士の方向を優先して平均化するバイラテラル平滑化を 5 反復適用します。空間方向のガウシアン重みと、色シグマで幅を決める色類似度のガウシアン重み、さらに中心方向との内積を重みに掛け合わせることで、色境界を保ちながら方向のばらつきを抑えます。

3. k-means による方向クラスタリング

平滑化した方向場を Lloyd 法による k-means クラスタリングで最大 4 つの方向クラスタへ分離します。クラスタ中心は前景層数パラメータで指定した数だけ初期化され、各ピクセルを最も近い方向のクラスタへ割り当てて中心を更新する処理を 12 反復まで行います。前フレームのクラスタ中心をウォームスタートとして再利用し、収束を高速化します。

4. アルファスケールの決定モード

各クラスタの方向射影に対するアルファスケール下限を、3 つのモードで決定できます。

  • 物理境界: 背景色からクラスタ方向へ進んだとき sRGB 色域の境界に達するまでの距離を二分探索で求め、これをスケール下限とします。
  • 不透明基準: クラスタに属するピクセルの方向射影値のヒストグラムを作成し、指定した累積百分位に対応する射影値をスケールとします。
  • 前景色指定: 指定した前景色の Oklab 変位をクラスタ方向へ射影した値をスケールとします。

5. インクリメンタル再計算

前フレームと比較して色が変化した画素のみを再平滑化することで、フレーム間の処理を高速化します。変化画素を膨張させた領域だけを再計算し、変化のない領域は前フレームの方向場を採用します。背景色・ノイズ閾値・色シグマが変化した場合や、変化画素が全体の 25% を超える場合は全体再計算へフォールバックします。

6. 前景色推定とスピル除去

前景部分の本来の色を、色差直線モデルに基づく伝播で推定します。背景色の彩度軸から十分に離れたピクセルを種として、近傍の前景色のうち観測色と背景色を結ぶ直線に最も整合するものを伝播させます。最終合成では推定した前景色から背景色の被りを差し引くスピル除去を適用し、スピル許容で除去を開始する彩度の下限を調整できます。


アルゴリズム

方向場生成(GPU シェーダー)

DisplacementFieldShader が各ピクセルに対して以下の処理を行います。

  1. BGRA パック値からストレートアルファの sRGB を復元し、線形 RGB を経て Oklab へ変換します。
  2. 背景色の Oklab との差ベクトル(変位)を計算し、その長さを求めます。
  3. 長さがノイズ閾値未満であれば無効方向(ゼロベクトル)として書き込みます。
  4. それ以外は変位を正規化し、単位方向ベクトルとして方向場へ格納します。

アルファ値が 0 のピクセルは色・方向ともにゼロを書き込み、以降の処理から除外されます。

方向場平滑化(GPU シェーダー)

DirectionSmoothShader が方向場のバイラテラル平滑化を担います。半径 4 のタイルをグループ共有メモリへ読み込み、空間ガウシアン重み・色類似度ガウシアン重み・中心方向との内積を掛けた重みで近傍方向を加重平均し、正規化します。この処理を 5 反復繰り返します。中心方向が無効、または有効近傍が存在しない場合はゼロまたは元の方向を維持します。

インクリメンタル再計算時は RegionDirectionSmoothShader が同じ平滑化を計算マスク内の画素にのみ適用し、AdoptRegionShader がマスク外の画素へ前フレームの結果を反映します。

方向クラスタリング(GPU・CPU)

ClusterAssignAccumulateShader が各有効方向を最も内積の大きいクラスタへ割り当て、固定小数点スケールで方向成分と画素数を累積します。CPU 側でこの累積から新しいクラスタ中心を正規化して算出し、前回中心との内積が収束閾値を超えれば収束とみなします。割り当てと更新を 12 反復まで繰り返します。

クラスタ中心の初期化は、白方向を主軸として、層数に応じた角度で彩度面を回転させた方向を副クラスタへ割り当てます。ウォームスタート時は近接しすぎたクラスタのみ再配置します。

アルファスケール決定(GPU・CPU)

不透明基準モードでは ProjectionHistogramShader が各有効ピクセルの背景からの変位を所属クラスタ方向へ射影し、256 ビンのヒストグラムへ加算します。CPU 側で累積百分位に達するビンを選び、その射影値をスケールとします。物理境界モードでは背景色からクラスタ方向へ進んだ sRGB 色域境界までの距離を 40 反復の二分探索で求めます。

前景色推定(GPU シェーダー)

ForegroundSeedShader が背景色の彩度軸からの垂直距離が基準を超えるピクセルを前景の種として確定します。ForegroundPropagateShader が近傍の有効な前景色のうち、観測色と背景色を結ぶ線分への距離が許容内であるものから、背景に対する純度が最大の色を伝播させます。この伝播を 16 反復繰り返して前景色フィールドを構築します。

最終合成(HLSL シェーダー)

DirectionalColorKey.hlsl が各ピクセルのアルファと前景色を確定します。前景色フィールドが有効な画素は、観測色を背景色と前景色の線形補間とみなしてアルファを直接解きます。無効な画素はクラスタ方向への射影とスケールからアルファを求め、中性軸に基づくアルファとの最大値を採用します。最後にエッジ柔らかさによる低アルファ側の足切りと、背景彩度方向へのスピル除去を適用して出力します。


パラメータ一覧

パラメータ名 デフォルト スライダー範囲 アニメーション 説明
背景色 RGB(0,255,0) 除去する背景色
前景層数 1 1〜4 方向クラスタリングで分離する前景層の最大数
スケール決定 物理境界 アルファのスケール決定戦略
前景色 RGB(255,255,255) 不透明部分の前景色ヒント(前景色指定時のみ表示)
不透明基準値 99% 0〜100% 不透明とみなす射影値の累積百分位(不透明基準時のみ表示)
ノイズ閾値 0.02 0〜0.2 背景とみなす変位の大きさ
色シグマ 0.1 0.001〜0.5 方向場平滑化の色類似度の幅
エッジ柔らかさ 0% 0〜100% 低アルファ側の足切り量
スピル除去 50% 0〜100% 前景色への背景色被りの抑制量
スピル許容 0 0〜0.5 スピル除去を開始する彩度の下限
前景出力 ON オフでマスクを確認できる

使い方ガイド

基本的な使い方

  1. タイムライン上のアイテムを選択し、エフェクトを追加します。
  2. 映像エフェクトの種類として 「方向色分離キー」 を選択します。
  3. 背景色を、除去したい背景の色に合わせて指定します。
  4. ノイズ閾値を調整して、背景とみなす変位の大きさを設定します。値を上げると背景近傍の弱い変位が背景として除去されます。
  5. 前景に色の方向が異なる複数の層がある場合は、前景層数を増やして方向クラスタを分離します。
  6. スケール決定でアルファのスケール戦略を選び、必要に応じて補助パラメータを調整します。

スケール決定モードの選択

物理境界は色域境界からスケール下限を自動計算するため、追加の指定なしで動作します。不透明基準不透明基準値で指定した累積百分位を不透明として扱い、被写体の透明度の分布に合わせてスケールを調整したい場合に有効です。前景色指定前景色で指定した色を基準に厳密にスケールを決定します。

ノイズ閾値と色シグマの調整

ノイズ閾値は背景とみなす変位の大きさで、値を上げると背景際のノイズが抑えられますが、背景に近い淡い前景も除去されやすくなります。色シグマは方向場平滑化の色類似度の幅で、値を上げると平滑化が広い色範囲へ及び、値を下げると色境界をより強く保ちます。

マスクの確認

前景出力を OFF にすると、前景色を出力せずアルファマスクのみを表示します。キーイングの効き具合を確認したい場合に利用します。

スピル除去の調整

スピル除去は前景色への背景色被りの抑制量で、背景の色が前景の輪郭へ被っている場合に上げます。スピル許容はスピル除去を開始する彩度の下限で、上げると本来の彩度を保ちながら過剰な除去を防げます。

キーフレームアニメーション

前景層数・不透明基準値・ノイズ閾値・色シグマ・エッジ柔らかさ・スピル除去・スピル許容はキーフレームアニメーションに対応しています。タイムライン上でキーフレームを設定することで、分離数やスケール、各種閾値を時間とともに変化させることができます。


注意事項

  • AviUtl 非対応: HLSL ピクセルシェーダーおよび Direct2D カスタムエフェクトを使用しているため、AviUtl 形式(.exo)への出力には対応していません。
  • 前景層数の上限: 方向クラスタリングで分離できる前景層の上限は 4 です。
  • GPU の利用: 方向場生成・平滑化・クラスタリング・前景色推定には ComputeSharp を通じてデフォルト GPU デバイスが使用されます。GPU が利用できない環境では動作しない場合があります。
  • インクリメンタル再計算の前提: 変化画素が全体の 25% を超えるフレームや、背景色・ノイズ閾値・色シグマが変化したフレームでは方向場の全体再計算が行われます。
  • 本プラグインを使用する前に、YMM4 プロジェクトファイルのバックアップを作成することを推奨します。

免責事項

本プラグインは GNU Lesser General Public License v3.0(LGPL 3.0)のもとで公開されています。

本ソフトウェアは「現状のまま」提供されており、明示・黙示を問わず、商品性、特定目的への適合性、および権利非侵害に関する保証を含む、いかなる種類の保証も行いません。

作者は、本プラグインの使用または使用不能に起因するいかなる損害についても、一切の責任を負いません。ご利用は自己責任でお願いします。


ライセンス

LGPL-3.0 License

About

背景色からの色変位方向をクラスタリングして前景を分離する映像エフェクト

Topics

Resources

License

Stars

Watchers

Forks

Contributors