輪郭強調

matsu45122009-08-12



エフェクト処理に輪郭強調を追加
こんな感じ
ソースは右クリックで


エッジ部分を選択した色で塗りつぶす処理。
まず、エッジを抽出

//エッジ抽出
for(yy = 0;yy < 3; yy++) {
    for(xx = 0;xx < 3; xx++) {
    col.color = target_bmpData.getPixel(x+xx-1, y+yy-1);    //画像上の画素情報を取得
    rr = col.r;
    gg = col.g;
    bb = col.b;
    gray = (bb*28+77*rr+gg*151)/256;
    rrx += gray*sobel1[sadr];
    rry += gray*sobel2[sadr];
    sadr++;
    }
}


そして、強度を求める

//エッジの強度を求める
rate = int(Math.sqrt(Number(rrx*rrx + rry*rry)));


エッジ部分を塗る色を求める

//エッジの強度に応じて色を混ぜ合わせる
col.r = (r1*rate + rr*(1000-rate)) / 1000;
col.g = (g1*rate + gg*(1000-rate)) / 1000;
col.b = (b1*rate + bb*(1000-rate)) / 1000;


この計算式だとエッジが強いほど指定した色に近づいていきます。


今回のソース

/輪郭強調
private function edge_emphasis(r1:int, g1:int, b1:int):void
{
    if(target_bmpData == null) return;
    bmpData2 = new BitmapData(target_bmpData.width, target_bmpData.height);
    
    var x:int, y:int;
    var xx:int, yy:int;
    var hh:int;
    var du:int, dd:int, dl:int, dr:int;
    var rrx:int, ggx:int, bbx:int;
    var rry:int, ggy:int, bby:int;
    var rr:int, gg:int, bb:int, gray:int;
    var rate:int;
    var col:Color = new Color();
    var sobel:Array = [];
    var sadr:int;
    var sobel1:Array=[
         1, 0,-1,
         2, 0,-2,
         1, 0,-1];
    var sobel2:Array=[
         1, 2, 1,
         0, 0, 0,
        -1,-2,-1];
    var x1:int, y1:int, x2:int, y2:int;

    x1 = 0;
    y1 = 0;
    x2 = bmpData2.width - 1;
    y2 = bmpData2.height - 1;

    for(y = y1; y <= y2; y++) {
        for(x = x1; x <= x2; x++) {
            rrx = ggx = bbx = 0;
            rry = ggy = bby = 0;
            sadr = 0;
            
            //エッジ抽出
            for(yy = 0;yy < 3; yy++) {
                for(xx = 0;xx < 3; xx++) {
                    col.color = target_bmpData.getPixel(x+xx-1, y+yy-1);    //画像上の画素情報を取得
                    rr = col.r;
                    gg = col.g;
                    bb = col.b;
                    gray = (bb*28+77*rr+gg*151)/256;
                    rrx += gray*sobel1[sadr];
                    rry += gray*sobel2[sadr];
                    sadr++;
                }
            }
            //エッジの強度を求める
            rate = int(Math.sqrt(Number(rrx*rrx + rry*rry)));
            if(rate > 1000) rate = 1000;
            col.color = target_bmpData.getPixel(x, y);    //画像上の画素情報を取得
            rr = col.r;
            gg = col.g;
            bb = col.b;
            //エッジの強度に応じて色を混ぜ合わせる
            col.r = (r1*rate + rr*(1000-rate)) / 1000;
            col.g = (g1*rate + gg*(1000-rate)) / 1000;
            col.b = (b1*rate + bb*(1000-rate)) / 1000;
            bmpData2.setPixel(x, y, col.color);    // 画像に値をセットする
        }
    }
    view.bitmapData = target_bmpData = bmpData2;
    myImage.width = view.width = myImage.width;
    myImage.height = view.height = myImage.height;
}