PixelBender触り中。
前に作った、エッジ保存平均化をPixelBenderで書き直してみました。
以下、PixelBenderのソースと結果画像です。
ソースコード。
<languageVersion : 1.0;>
kernel Sample05
< namespace : "sakef";
vendor : "sakef";
version : 1;
description : "sample05";
>
{
input image4 src;
output pixel4 dst;
void evaluatePixel()
{
const int block = 9;
const float size = 81.0;
float rmax1=0.0, gmax1=0.0, bmax1=0.0, rmin1=1.0, gmin1=1.0, bmin1=1.0;
float rmax2=0.0, gmax2=0.0, bmax2=0.0, rmin2=1.0, gmin2=1.0, bmin2=1.0;
float rmax3=0.0, gmax3=0.0, bmax3=0.0, rmin3=1.0, gmin3=1.0, bmin3=1.0;
float rmax4=0.0, gmax4=0.0, bmax4=0.0, rmin4=1.0, gmin4=1.0, bmin4=1.0;
float area1, area2, area3, area4;
float4 avg1=float4(0,0,0,0) , avg2=float4(0,0,0,0), avg3=float4(0,0,0,0), avg4=float4(0,0,0,0);
float4 color;
for(int i = 0; i<block ; i++)
{
for(int j=0 ; j<block; j++)
{
color = sampleNearest(src, outCoord() - float2(block-1, block-1) + float2(i, j));
avg1 += color;
rmax1 = max(rmax1, color.r);
gmax1 = max(gmax1, color.g);
bmax1 = max(bmax1, color.b);
rmin1 = min(rmin1, color.r);
gmin1 = min(gmin1, color.g);
bmin1 = min(bmin1, color.b);
color = sampleNearest(src, outCoord() - float2(0, block-1) + float2(i, j));
avg2 += color;
rmax2 = max(rmax2, color.r);
gmax2 = max(gmax2, color.g);
bmax2 = max(bmax2, color.b);
rmin2 = min(rmin2, color.r);
gmin2 = min(gmin2, color.g);
bmin2 = min(bmin2, color.b);
color = sampleNearest(src, outCoord() + float2(i, j));
avg3 += color;
rmax3 = max(rmax3, color.r);
gmax3 = max(gmax3, color.g);
bmax3 = max(bmax3, color.b);
rmin3 = min(rmin3, color.r);
gmin3 = min(gmin3, color.g);
bmin3 = min(bmin3, color.b);
color = sampleNearest(src, outCoord() - float2(block-1, 0) + float2(i, j));
avg4 += color;
rmax4 = max(rmax4, color.r);
gmax4 = max(gmax4, color.g);
bmax4 = max(bmax4, color.b);
rmin4 = min(rmin4, color.r);
gmin4 = min(gmin4, color.g);
bmin4 = min(bmin4, color.b);
}
}
area1= (rmax1 - rmin1 + gmax1 - gmin1 + bmax1 + bmin1) / 3.0;
area2= (rmax2 - rmin2 + gmax2 - gmin2 + bmax2 + bmin2) / 3.0;
area3= (rmax3 - rmin3 + gmax3 - gmin3 + bmax3 + bmin3) / 3.0;
area4= (rmax4 - rmin4 + gmax4 - gmin4 + bmax4 + bmin4) / 3.0;
float tmin = min(min(min(area1, area2), area3), area4);
if(tmin == area1) dst = avg1 / size;
else if(tmin == area2) dst = avg2 / size;
else if(tmin == area3) dst = avg3 / size;
else dst = avg4 / size;
}
}
元画像。

処理後画像。

ちなみに、このソースコードはFlash側に持っていくことはできません。
Flash PlayerおよびAIRランタイムがカーネルコード内でのループ処理をサポートしていないからです。 (ってリファレンスに書いてあった。)