チュートリアル10

クロマキー


このチュートリアルでは、jit.chromakeyオブジェクトを使って、2つのソースムービーによるクロマキー処理を行う方法についてご説明します。さらに、スクリーン上の任意のピクセルの色を探し出す方法についてもご説明します。

・Jitter Tutorialフォルダの10jChromakey.patというチュートリアルパッチを開いて下さい。

チュートリアルパッチを開くと、Maxは自動的に2つのムービー(oh.movとtraffic.mov)を jit.qt.movieオブジェクトに読込みます。これは、loadbangオブジェクトによって、対応するreadメッセージがこれらのオブジェクトに送信されることによって行われます。


loadbangによって行われるパッチの初期化


このパッチに必要な他のパラメータも、パッチの右側のメッセージボックスに接続されたloadbangによって初期化されます。メッセージボックスは、パッチの他の場所にある「名前付きのreceiveオブジェクト」にメッセージを送信することによってパッチの残りの部分の初期化を行います。(Max4 Tutorials And Topics の中の「チュートリアル25:Managing Messages」を参照して下さい。)

toggleボックスをクリックして、metroオブジェクトをスタートさせて下さい。パッチにある3つの jit.pwindowオブジェクトに映像が現れるのを見ることができるはずです。toggleボックスはmetroオブジェクトをスタート、ストップさせるだけでなく、2つのjit.qt.movieオブジェクトによるムービー送信のスタート、ストップも行っている点に注意して下さい。

チュートリアルパッチの下半分(3つのjit.pwindowオブジェクトの内の2つがあります)は、このように見えると思います。


jit.chromakeyオブジェクト

・左側のjit.pwindowオブジェクトの青い領域(すなわちムービーの中の男性の頭の背後にあたる領域)をマウスでクリックして下さい。

3番目のjit.pwindowオブジェクト(パッチの右下の部分にあります)はこのように見えると思います。


どうやって彼はあのフェンスの前に入ったのでしょうか?


jit.chromakeyオブジェクト

Jitterでの「クロマキー」(色にもとづいた選択的な置き換えによって、1つのイメージを他のものの上に重ねる処理)はjit.chromakeyオブジェクトによって行われます。色と、他のいくつかのパラメータを指定することによって、jit.chromakeyは最初の(左の)マトリクスからその色を含むセルを探し出して、その部分を2番目の(右の)マトリクスの同じ位置のセルで置き換え、出力マトリクスを造ります。結果として最初のマトリクスからのセルが2番目のものの上に置かれたような形になります。

・どんな色でもクロマキーの対象になります。試しに左のjit.pwindowのどこか他の場所をクリックしてみて下さい。異なった色の場合、男性の顔が消されて道路の風景が現れるでしょう。


顔面消滅のトリック(Part 1)

歴史的な註記:ブルースクリーン合成、つまり、青いマット背景だけの前でライブ場面を撮影し、後からブルーの部分を別の映像と取り替える手法は1930年代後半あたりから行われていました。もともとは、高価な印刷の色分解を含んだ非常に高価なフィルム処理だったブルースクリーン技法(そして、それほど一般的ではないですが、同じような仲間のグリーンスクリーン技法)は、映画、テレビ、ビデオにおける最も当たり前の(そして効果的な)特撮技法へと発展しました。クロマキー(処理についての述語)を行う能力は、アナログ(後にディジタル)のビデオ・スーパーインポーズを使うことによって、さらに、どこにでもあるようなものになりました。テレビ業界では、よくビデオクロマキー処理をCSO(Color Separation Overlay)と呼ぶことがあります。この名前は、1960年代にこの処理を開発したBBCチームによってつけられました。Petro Vlahos(1960年代におけるブルースクリーンの革新者)は、科学技術がどれくらい不可欠なものになっているかという認識のもとに、1994年に映画芸術科学アカデミーによって、Livetime Achievement Award を授与されました。

jit.chromakeyオブジェクトは、colorアトリビュートを使って、クロマキーの中央値となる色(リファレンスカラーと呼ばれます)を定義します。このアトリビュートはキーイング処理されるマトリクスがもつプレーン数と同じ個数の値のリストによって設定されます。tolアトリビュートは基準となる色の前後の値の範囲を指定します。この範囲内の色は同様にキーイング処理されます。jit.chromakeyをcharマトリクス(例えば、ビデオ)に適用する場合、アトリビュートは0〜1の範囲のfloatで指定されます。charデータに直すためにはこれを0〜255の範囲にマッピング(写像)する必要があります。従って、colorアトリビュートを純粋な緑のクロマキーに設定する場合には、color 0 0 1.0 0 と設定しなければなりません。0 0 255 0とするのは間違いです。tolの範囲が0.5の場合、リファレンスカラーからの色彩距離が半分以内の値(各プレーンでのリファレンスカラーと実際のセルの値の差の絶対値の和として計算されます)はすべてキーイング処理されます。tolの範囲が0の場合、ちょうどリファレンスカラーと同じものだけがクロマキーの部分として扱われます。

・もう一度、左のムービーの青の領域をクリックして下さい。そして、tolアトリビュートによってどのようにクロマキーの出力が変化するかを試して下さい。許容値が低い場合には、キー出力の中に左の映像のブルースクリーンがいくらか残っていると思います。非常に許容値が高いと、男性の顔の一部が消えてしまうでしょう。


suckahオブジェクト_

チュートリアルパッチでは、jit.chromakeyのcolorアトリビュートは、見えないオブジェクトをクリックすることによって設定されています。パッチをアンロックすると、左のjit.pwindowオブジェクトの上に、同心状の赤い四角形の領域が重なっているのを見ることができます。


suckahオブジェクト

この領域は、suckahと呼ばれるMaxのインタフェースオブジェクトで、これはオブジェクトパレットではこのように表示されています。


オブジェクトパレットのsuckahオブジェクト

suckahオブジェクトは、スクリーン上でオブジェクト自身が重ねられている部分のピクセルがもつRGB値を調べます。ロックされたパッチでオブジェクトの中をクリックすると、これらの値を調べ、整数のリストとしてアウトレットから出力します。例えば、suckahが重ねられている部分の純粋な青の領域をクリックすると、suckahは0 0 255 というリストを送信します。

ここでは、jit.chromakeyのcolorアトリビュートを設定するために、suckahオブジェクトから送信されるRGBのリストを受け取り、それをprepend 0 に送って、リストの先頭にアルファチャンネルの値 0を追加しています。さらに、そのARGBリストをvexprオブジェクトを使って255で割り、0.〜1.の範囲にスケーリングしています。そして、prepend color によってメッセージが完成させられ、最後にそのメッセージが jit.chromakeyに送信されます。


消滅するブルースクリーン

jit.chromakeyオブジェクトには、さらにいくつかのアトリビュートminkey、maxkey、fadeがあります。マトリクスが左インレットに入力されると、jit.chromakeyは、そのマトリクスにもとづいて内部でグレースケール(1プレーン)のマスクを作成します。このマスクでは、許容範囲(tolの値)内の色の値を持っている入力マトリクスのセルは、maxkeyアトリビュートの値(デフォルトは1)にセットされます。許容範囲外の領域はminkey(デフォルトは0)の値を掛け合わせられます。minkeyとmaxkeyがそれぞれ0と1に設定されている場合には、結果としてのイメージは、キーイングを行うべき部分は白に、オリジナル映像を残すべき部分は黒に見えるはずです。

その後、結果として出来上がったマスクとそれを反転したものが、右と左のマトリクスにそれぞれ掛け合わせられます。そして、その乗算の結果を加算し、合成された映像を造ります。下の図は、そのプロセスの概要を画像で示したものです。


2つのソース、それぞれに対するマスク(minkeyが0、maxkeyが1の場合)、およびクロマキー合成

ご覧になったように、minkeyアトリビュートは出力における左のマトリクスの強さを、対してmaxkeyアトリビュートは、出力における右のマトリクスの強さを設定します。もし、minkeyとmaxkeyの値を反対にすると、クロマキーは反転させられ、以下のようなことが起こります。


minkeyが1、maxkeyが0の場合の合成効果(反転したクロマキー)

fadeアトリビュートによって、キーイング処理される領域とされない領域の間の補間を行うことができます。これによって、クロマキー効果にソフトエッジをかけることができます。左のマトリクスの色のうちで、キー許容範囲のわずかに外側にあって、なおかつリファレンスカラーからtol+fadeの距離の内側にあるものについて、そのオリジナル(キーイングされない)色と、右のマトリクスの同じ位置にある色との補間を行います。補間の量は、fadeの値がどれくらいか、また、問題の色が許容範囲のどれくらい外にあるかに基づいています。

・様々な、tol、fade、minkey、maxkeyの値を様々な色に適用して実験してみて下さい。5つのアトリビュートがどのように相互作用し合って様々なキーイング効果を生み出すか、またminkeyとmaxkeyの値がどのようにお互いを補完しあっているかを観察して下さい。

正確なクロマキーは難しい処理です。tol及びfadeアトリビュートに正しい値を設定することは、第2のイメージに向けてキーイングされる第1のイメージの正しい領域を確保するための基本です。一般的に、非常に詳細なキーイメージでは、色がキー領域と非キー領域の間を急速に動く部分で、わずかなエリアシングが生じます。加えて、完全なキーを得るために1つのキー色(例えば青)だけで十分なことはほとんどないので、たいてい値の範囲が利用されます。しかし、それでもイメージの中の消したい部分のうちのどこかが、残しておきたい領域の中に存在しているのを見つけることがよくあるでしょう。最も納得の行く効果を得るために、これらすべての係数のバランスをとることは、jit.chromakeyオブジェクトを使う際の最も難しい部分です。


まとめ

jit.chromakeyオブジェクトは、Jitterにおいて2つのソースによるクロマキーを可能にします。color、及びtolアトリビュートを使って、キーイング処理のための色の範囲を指定することができます。また、fade、minkey、maxkeyの値を使って、合成において2つのマトリクスがどのように機能するかを定義することができます。suckahインターフェイスオブジェクトは、jit.pwindowの上にオブジェクト自身を重ねることによって、スクリーン上に現れる色を簡単に選ぶことを可能にします。suckahオブジェクトをクリックすると、スクリーン上のちょうどクリックされた場所の色の情報を得ることができます。