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);
}
}

