チュートリアル18

反復処理とマトリクスの再サンプリング


このチュートリアルでは、名前を持ったjit.matrixオブジェクトを使用した、より複雑な例についてご紹介します。同時にjit.matrixオブジェクトを使ってイメージのアップサンプリングとダウンサンプリングを行う方法についてもご説明します。

・Jitter Tutoriaフォルダの18jMatrisIteration.patというチュートリアルパッチを開いて下さい。
パッチの左上隅にはjit.qt.movieオブジェクトがあり、パッチを開く際に静止画(fuzz_circle.jpgファイル)が読込まれています。


イメージの読込み

metroオブジェクトの上にあるtoggleオブジェクトをクリックしてmetroをスタートさせて下さい。チュートリアルパッチの右下隅のjit.pwindowに画像が現れます。


私たちの小さな彗星


fuzz_circle.jpgファイルには黒い背景を持った白い円の画像が納められています。この画像のサイズはスケールされて、最終的なマトリクスの中では小さな円として表示されています。


実際のfuss circle


ランダムウォーク(酔っ払いの千鳥足)

パッチの一番上の部分では、jit.qt.movieからのイメージをチェインの最初のjit.matrixオブジェクトに書き込んでいます。bangbangオブジェクトで生成されたbangメッセージはjit.matrixオブジェクトのdstdimstartとdstdimendアトリビュートを、Maxのdrunkオブジェクトを使ってランダムに変化させた座標値によってフレームごとに変更します。最初のjit.matrixオブジェクトのusedstdimアトリビュートが1に設定されている点に注意して下さい。これによって入力されるマトリクスがスケールされます。


パッチの中のdrunkオブジェクト(ランダムウォークを作る)の部分

従って、最初のjit.matrixは、単に円の画像をスケールして出力マトリクスの小さな(80×60)領域に収まるようにするという働きをしているにすぎません。イメージをスケールするために座標値をフォーマットしているメッセージボックスが同時にマトリクスをフレームごとに(clearメッセージによって)クリアしている点に注意して下さい。こうすることによって、前に書きこまれたイメージが残らないようにしています。Maxのdrunkオブジェクトは円の位置を変化させるので、震えるような−jitter around−動きになります。(決してギャグではありません)

・パッチの右下隅にあるjit.pwindowの中のどこかをクリックして下さい。クリックした場所に円がジャンプしてきて、そこで動き始めます。

jit.pwindowでマウスクリックが行われた結果はwinclickという名前のreceiveオブジェクトに送られます。このメッセージはセレクタ(mouse)を取り除かれ、最初の2つの要素(クリックされた場所のx及びy位置)がunpackオブジェクトによって抽出されます。これらの座標値が新しいdrunkオブジェクトの基準点をセットするために用いられます。


フィードバック・ネットワーク

jit.matrixオブジェクトによって円の画像がスケールされ適切な場所に置かれると、パッチの処理はblurryという名前のマトリクスを共有する2つのjit.matrixオブジェクトの間のフィードバックチェーンの中に入ります。


パッチのフィードバックループ

パッチのこのセクションには4つのjit.matrixオブジェクト(円の画像を縮小している一番上の jit.matrixは含みません)があります。そのうちの2つのオブジェクトは共通の名前(blurry)を持っていて、単にパッチの他の部分によって生成された直前のマトリクスを格納したり取出したりするため
に使われています。一番上のjit.matrixオブジェクトはパッチの最初のjit.opオブジェクトの右端のインレットにマトリクスを送っています。さらに、bangbangオブジェクトを使って最初の名前を持った jit.matrixにbangメッセージを送っています。これによって格納されているマトリクス(blurryと呼ばれるもの)が出力されます。このマトリクスは最終的にjit.opの左インレットに送られますが、そこで
(jit.pwindowによって)表示され、スカラーを乗じられます(2番目のjit.opオブジェクト)。最後には、これが(一番下の名前付きのjit.matrixオブジェクトに送られることによって)前のblurryマトリクスに上書きされます。処理の中間にあるJitterオブジェクトが生成するものについての理解を助けるために、blurryマトリクスに格納されている円の画像の直
前の「フレーム」のいろいろな状態を見ることができるようにしてみました。


パッチのイラストマップを縮小したもの

 


新しい画像と元の画像はjit.opオブジェクトのmax演算子を使って合成されます。max演算子は2つのマトリクスの各々のセルを比較し大きな値を持つ方を残します。2つめのjit.opオブジェクト(* 演算子を持っているもの)はスカラ(パッチの右側にある、fbという名前のreceiveオブジェクトへ送信をするナンバーボックスによって設定されます)を掛けることによって画像を暗くしています。


フィードバック量は、画像がblurryマトリクスに格納される前に
どのくらい暗くされるかによって決まります。

・パッチの右側にあるFeedbackと表示されたナンバーボックスをいろいろ変化させて、フィードバック量を変更してみて下さい。設定されたフィードバック量によって、jit.pwindowをクリックして円を動かした時に生じる円の尾を引いている部分がどのように増減するかに注意して下さい。


ダウンサンプリングとアップサンプリング

この画像処理処理アルゴリズムの最後のステップは、下にあるjit.matrixによって保存されたマトリクスを送り出す上側の名前付きのjit.matrixと、前のフレームと新しいフレームの合成を行う最初のjit.opオブジェクトに関するものです。


画像の再サンプリングのためにjit.matrixオブジェクトを使います

チュートリアルパッチで緑色で示されている2つのjit.matrixオブジェクトはその上にあるjit.matrix から送られるblurry画像マトリクスの再サンプリングのために用いられます。2つのjit.matrixオブジェクトのうち、最初の方はdimアトリビュートが4×4セルに設定されています。このサイズは、Pixelation という見出しがつけられた左上のナンバーボックスでアトリビュートをセットすることによって変更できます。この値はjit.matrixオブジェクトの上にあるdimという名前をつけられたreceiveオブジェクトに送られます。


彗星の「尾」のピクセレーションを変更します。

・チュートリアルパッチの青い領域にある、Pixelationと表示されたナンバーボックスの値を変えてみて下さい。円の「尾」がどのように変化するかに注意して下さい。

画像マトリクスのダウンサンプリングのために、jit.matrixオブジェクトは入力される320×240のマトリクスを非常に小さなマトリクスにコピーし、余分なデータを捨て去ります。これによって画像のピクセレーションが生じますが、これはマトリクスのdimによってコントロールすることができます。

2番目のjit.matrixオブジェクトはこのマトリクスを320×240のマトリクスサイズにアップサンプリングし直します。これによって、次のJitterオブジェクトの処理に際しては完全な解像度の画像が使用され、完全な解像度のマトリクスが出力されます。

jit.streakオブジェクトは画素化された「尾」に面白い効果を施します。これは、隣接したセルにランダムに線を引くというものです。jit.streakのprobアトリビュートは、与えられたマトリクスのセルをどのくらい隣のセルにコピーするかという可能性をコントロールします。このjit.streakオブジェクトは0.5というprobアトリビュートの値を持っているため、与えられたセルに対して50%の確率でコピーが行われます。

技術的な詳細:デフォルトでは、jit.streakオブジェクトはセルを右へコピーします。この動作はderectionアトリビュートを変更することによって変更されます。また、scaleというアトリビュートがありますが、これは「線を引かれる」セルの元のセルに対する明るさを決定します。jit.streakオブジェクトのヘルプパッチにはこのオブジェクトの動作に関する、より詳しい説明があります。

 


途中の処理内容を示すjit.pwindowを追加したイフェクトチェーン


まとめ

同じ名前を持った2つのjit.matrixオブジェクトを使って、効果的にその直前のJitter処理の繰り返しを保存することができます。このテクニックは、jit.opのようなマトリクス合成オブジェクトを利用した、一つ前のマトリクスと現在のマトリクスを合成することによるビデオディレイ効果の生成に使用できます。また、 jit.matrixオブジェクトは(dimアトリビュートを利用して)画像の再サンプリングを行うために使用することができ、これによってアルゴリズムをより効果的に(マトリクスが小さいと次のイメージの処理が早くなります)行うと同時に、ピクセレーション効果を作り出すこともできます。jit.streakオブジェクトは、確率係数(probアトリビュートによってセットされます)に基づいて隣のセルへのコピーを行うことによって、入力されるマトリクスに、ランダムなセルの線(縞模様)を生成します。