鮮鋭化フィルタを作成する

寄稿:東條遼平

Laplacianフィルタを利用する

img10.png

鮮鋭化フィルタとはエッジ部分を強調するフィルタです.ラプラシアンフィルタでは注目しているピクセルが小さく隣の値が大きい場合も,注目しているピクセルが大きく隣の値が小さいものの場合も絶対値をとっているため,どっちも同じように見えますが,本来前者は値がプラスで後者はマイナスになっています.そのため注目しているピクセルの値からフィルタに掛けた値を引けば,エッジの隣では値が小さくなり,エッジの部分で値が大きくなるため鮮鋭化されることになります.

for(i=1; i<img->height-1; i++){
  for(j=1; j<img->width-1; j++){
    sumr = sumg = sumb = 0;
    for(k=-1; k<=1; k++){
      for(l=-1; l<=1; l++){
        if(!k && !l) weight = 5;
        else if(!k || !l) weight = -1;
        else weight = 0;

        sumr += weight * img->data[(i+k)*img->width + j + l].r;
        sumg += weight * img->data[(i+k)*img->width + j + l].g;
        sumb += weight * img->data[(i+k)*img->width + j + l].b;
      }
    }
    if(sumr >= 256) sumr = 255;
    else if(sumr < 0) sumr = 0;
    if(sumg >= 256) sumg = 255;
    else if(sumg < 0) sumg = 0;
    if(sumb >= 256) sumb = 255;
    else if(sumb < 0) sumb = 0;

    temp->data[i*temp->width + j].r = sumr;
    temp->data[i*temp->width + j].g = sumg;
    temp->data[i*temp->width + j].b = sumb;
  }
}

基本的に今までのフィルタと同じなのですが,大きく違うのが,最後に絶対値を取って代入してはいけないところです.また,sumr,sumg,sumbもunsignedにせず,int型にしています.というのも,値がマイナスになったり,255を越えたりするためです. unsignedにおいて-1を代入すると255と評価されます.またchar型に256を代入すると0と評価されます.そのためsigned型のintとして変数を宣言した上で,分岐によってマイナスを0に,256以上を255にまるめています.

Valid XHTML 1.1! home > コンピュータ > プログラミング >
リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.5_1 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-jiPowered by PHP 5.2.17HTML convert time to 0.069 sec.