jit.gl.pix でラプラシアンフィルターを実装してみた:#max6 #jitter #cycling74

Before-特大ゆっくり魔理沙(ニコニ・コモンズより)

スクリーンショット 2014-07-09 19.54.20

After ラプラシアンフィルターによるエッジ抽出

スクリーンショット 2014-07-09 19.54.12

メディアンフィルターに引き続き、ラプラシアンフィルターによるエッジ抽出をjit.gl.pix実装してみました。

jit.gl.pix – Codebox


//laplacian
filter = vec(0,1,0,1,-4,1,0,1,0);

//sharp
//filter = vec(0,-1,0,-1,5,-1,0,-1,0);

//mean
//filter = vec(1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9,1/9);

//mean2
//filter = vec(1/16,2/16,1/16,2/16,4/16,2/16,1/16,2/16,1/16);

//mean3
//filter = vec(1/3,0,0,0,1/3,0,0,0,1/3);

//sobel
//filter = vec(-1,0,1,-2,0,2,-1,0,1);

step = 1/(dim+1);

d = (vec( 0 % 3 , floor( 0 /3)) - 1) * step;
p0 = sample(in1,norm + d,boundmode="clamp");

d = (vec( 1 % 3 , floor( 1 /3)) - 1) * step;
p1 = sample(in1,norm + d,boundmode="clamp");

d = (vec( 2 % 3 , floor( 2 /3)) - 1) * step;
p2 = sample(in1,norm + d,boundmode="clamp");

d = (vec( 3 % 3 , floor( 3 /3)) - 1)* step;
p3 = sample(in1,norm + d,boundmode="clamp");

d = (vec( 4 % 3 , floor( 4 /3)) - 1) * step;
p4 = sample(in1,norm + d,boundmode="clamp");

d = (vec( 5 % 3 , floor( 5 /3)) - 1) * step;
p5 = sample(in1,norm + d,boundmode="clamp");

d = (vec( 6 % 3 , floor( 6 /3)) - 1)* step;
p6 = sample(in1,norm + d,boundmode="clamp");

d = (vec( 7 % 3 , floor( 7 /3)) - 1)* step;
p7 = sample(in1,norm + d,boundmode="clamp");

d = (vec( 8 % 3 , floor( 8 /3)) - 1)* step;
p8 = sample(in1,norm + d,boundmode="clamp");

sum = p0 * swiz(filter,0)
     + p1 * swiz(filter,1)
     + p2 * swiz(filter,2)
     + p3 * swiz(filter,3)
     + p4 * swiz(filter,4)
     + p5 * swiz(filter,5)
     + p6 * swiz(filter,6)
     + p7 * swiz(filter,7)
     + p8 * swiz(filter,8);

out1 = sum;

一番上のfilterの初期値を変える事で、いくつかのフィルターを試せるようにしてあります。

おまけ – jit.gl.pix の困ってるポイント

  • sample / nearest を function や for 文で、取得する位置を変更しながら繰り返し利用するとコンパイル通らない。
  • sample / nearest から取得した pixcel から swizしようとすると(例 : swiz(vec,0) ) コンパイルが通らない。
  • function と Param を同時に定義するとコンパイル出来ない事がある。

Leave a Comment