/**/

チュートリアル 10:
クロマキー

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

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

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


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

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

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 の範囲の浮動小数点数で指定し、これが char データとして必要な 0〜255 の範囲にマッピング(写像)されます。したがって、color アトリビュートを純粋な緑のクロマキーに設定する場合には、color 0 0 1.0 0 と設定しなければなりません。0 0 255 0とするのは間違いです。tol の範囲が0.5の場合、リファレンスカラー(参照する色)からの色彩距離(各プレーンでのリファレンスカラーと実際のセルの値の差の絶対値の合計として計算されます)が半分以内の値はすべてキーイング処理されます。tol の範囲が0の場合、ちょうどリファレンスカラーと同じものだけがクロマキーの部分として扱われます。

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

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

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


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

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


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

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

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

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

まとめ

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