RIGHT:寄稿:東條遼平 * ぼかしやエッジ抽出 [#u3aee9f9] フーリエ変換をしたデータは中心程低周波で外側程高周波成分となります。ここで高周波成分は画像において色の変化の大きい部分、つまりエッジの部分となり、低周波成分とはその他の色の変化の少ない部分ということになります。そのため低周波をカットすることでエッジ部分を抽出でき、高周波をカットすることでエッジ部分がなくなるためメリハリのないぼけた画像ができます。 基本的に [[画像をフーリエ変換してみる]] のときの main関数内を関数化したものになっていますが、カットする周波数帯域を指定出来るようにしています。 #define OR 0 #define AND 1 bitmap.hの部分でORとANDをdefineしています。これは今回作成した関数 Frequencycutfilterの引数として渡します。この関数の第二引数と第三引数で円の半径を渡していますが、第二引数で渡す半径を含め、外側をカットします。そして第三引数で渡す半径を含め、内側をカットしています。 RgbFrequencyTrans(img, re, im, DFT); for(i=0; i<img->height; i++){ for(j=0; j<img->width; j++){ x = i - img->height/2; y = j - img->width/2; if(or_and == AND){ if(x*x + y*y >= r1*r1 && x*x + y*y <= r2*r2){ re[i*img->width + j] = im[i*img->width + j] = 0; } }else{ if(x*x + y*y >= r1*r1 || x*x + y*y <= r2*r2){ re[i*img->width + j] = im[i*img->width + j] = 0; } } } } RgbFrequencyTrans(img, re, im, IDFT); ここで第四引数によって渡された値がORであれば第二引数より外側と第三引数より内側を両方カットし、ANDであれば2つの引数の重複部分をカットします。 x = i - img->height/2; y = j - img->width/2; 今回円形でカットしたいので、画像の中心を原点の方が都合がよいのですが、配列のインデックスは画像の左上が原点になっていますので x軸y軸ともに画像の半分ずつずらしています。 #ref(img20.png) 円の公式は上で表され、半径はrですのでこの公式を等号にせずに不等号にすることで if文で分岐させています。 - &ref(main.c); - &ref(bitmap.c); - &ref(bitmap.h); - &ref(calculation.c); - &ref(calculation.h);