/**/

チュートリアル 18:
反復処理とマトリックスの再サンプリング

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

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

パッチの左上隅には 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 オブジェクトの dstdimstartdstdimend アトリビュートを、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.matrixbang メッセージを送っています。これによって格納されているマトリックス(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.streakprob アトリビュートは、与えられたマトリックスのセルを隣のセルにコピーする確率をコントロールします。この jit.streak オブジェクトは0.5という prob アトリビュートの値を持っているため、与えられたセルに対して50%の確率でコピーが行われます。

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


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

まとめ

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