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