PixelBenderをやってみる その4 – エッジ保存平均化

Filed under AS3, PixelBender

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ランタイムがカーネルコード内でのループ処理をサポートしていないからです。 (ってリファレンスに書いてあった。)

Post a Comment

Your email is never published nor shared.