PixelBenderで輪郭抽出
Flashで輪郭抽出を行う方法はいくつかあるかと思いますが、
畳込みフィルターよりも、(ビジュアル的に)綺麗な輪郭抽出にチャレンジしてみました。
今回はPixelBenderで輪郭抽出アルゴリズムのひとつの、Sobelオペレータを実行しています。
Sobelオペレータについては、Web上にたくさんドキュンメントがあるかと思うので
僕のつたない説明より、そちらを参考にしていただいた方が良いかと思いますが
前後のピクセルの差分をもとにゴニョゴニョする感じです。
サンプル
pbjファイルはこちら
pbkソースはこんな感じ
< languageVersion: 1.0; > kernel EdgeDetection < namespace : ""; vendor : "Shimada Kousho"; version : 1; description : "detect edge"; > { input image4 src; output float4 dst; void evaluatePixel() { float4 col = float4(0.0, 0.0, 0.0, 0.0); float4 col_hx = float4(0.0, 0.0, 0.0, 0.0); float4 col_hy = float4(0.0, 0.0, 0.0, 0.0); //X方向の差分 col_hx -= sampleNearest(src, outCoord() + float2(-1.0, -1.0)); col_hx -= sampleNearest(src, outCoord() + float2(-1.0, 0.0)) * 2.0; col_hx -= sampleNearest(src, outCoord() + float2(-1.0, 1.0)); col_hx += sampleNearest(src, outCoord() + float2(1.0, -1.0)); col_hx += sampleNearest(src, outCoord() + float2(1.0, 0.0)) * 2.0; col_hx += sampleNearest(src, outCoord() + float2(1.0, 1.0)); //Y方向の差分 col_hy -= sampleNearest(src, outCoord() + float2(-1.0, -1.0)); col_hy -= sampleNearest(src, outCoord() + float2(0.0, -1.0)) * 2.0; col_hy -= sampleNearest(src, outCoord() + float2(1.0, -1.0)); col_hy += sampleNearest(src, outCoord() + float2(-1.0, 1.0)); col_hy += sampleNearest(src, outCoord() + float2(0.0, 1.0)) * 2.0; col_hy += sampleNearest(src, outCoord() + float2(1.0, 1.0)); //X方向差分とY方向差分の合成 col.r = sqrt(pow(col_hx.r, 2.0) + pow(col_hy.r, 2.0)); col.g = sqrt(pow(col_hx.g, 2.0) + pow(col_hy.g, 2.0)); col.b = sqrt(pow(col_hx.b, 2.0) + pow(col_hy.b, 2.0)); //モノクロ化 float col_mono = 0.298912 * col.r + 0.586611 * col.g + 0.114478 * col.b; dst = float4(col_mono, col_mono, col_mono, 1.0); } }