チーム12B4
課題名
画像に対するDFT、LPF、HPF
研究者名
3年14組 18番 後藤 祐輔
3年14組 65番 周 劼亮
概要
紹介:
MFCで画像処理ソフトウェアの開発。
機能:
1.8bit又は24bit画像の読み込み(24bitは8bitに変換して表示)。
2.ダイアログの各機能ボタンを押すと:
1)画像を離散フーリエ変換
2)HPFで低周波成分を除去。
3)LPFで高周波成分を除去(スムージング)。
機能紹介[#ca23e4cc]
各機能のプレビュー
Step1.8bit画像の読み込み
Step2.離散フーリエ変換
Step3.LPF
Step4.LPFに通した画像のIDFT
Step5.HPF
Step4.HPFに通した画像のIDFT
見出しN
プログラムの説明
1.DFT
bool DFT(CDIB& img, DFTImage& dft_img,DFTImage & _dft_img)
{
// 画像が取得できない場合エラー if (img.getDIB() == NULL) return 1; if (!img.isGray()) return 1; if (dft_img.real_number != NULL | | dft_img.virtual_number != NULL) dft_img.clear();
//画像の幅、高さを取得 int h = img.getDIB()->h; int w = img.getDIB()->w; dft_img.height = h; dft_img.width = w;
// 画素の実数と虚数を配列に格納 dft_img.real_number = new double [h * w]; dft_img.virtual_number = new double [h * w]; if (dft_img.real_number == NULL | | dft_img.virtual_number == NULL){ dft_img.clear(); return 1; }
// 二次元に探索 for (int v = 0; v < h; v++){ for (int u = 0; u < w; u++){ double rn = 0; double vn = 0; // for (int y = 0; y < h; y++){ for (int x = 0; x < w; x++){ // 角度の取得 double angle = -(double(u*x)/w + double(v*y)/h) * 2 * PI; // 値の正負を判別 int s = (x + y) % 2; if(s == 1) s = -1; else s = 1; // 実数部分の畳み込み演算 rn += s * (img.pix8(x, y) * cos(angle));
// 虚数部分の畳み込み vn += s * (img.pix8(x, y) * sin(angle)); } } //rn /= (w*h); //vn /= (w*h);
// 値の代入 dft_img.real_number[v*w + u] = rn; dft_img.virtual_number[v*w + u] = vn; } } _dft_img=dft_img; return 0;
}
2.LPF
bool SmoothImage(CDIB& src_img, CDIB& dst_img)
{
int i,j; int result;//結果を保存する変数 if(src_img.getDIB()==0) return 0; if(src_img.isGray()==0) return 0; else { int w=src_img.getDIB()->w; int h=src_img.getDIB()->h; dst_img.create(w, h, 8); for(j=1;j<h-1;j++) for(i=1;i<w-1;i++) { //画素の周囲8画素との平均をとることでフィルタリング result=(src_img.pix8(i,j)+src_img.pix8(i+1,j)+src_img.pix8(i-1,j)+src_img.pix8(i,j+1)+src_img.pix8(i,j-1) +src_img.pix8(i-1,j-1)+src_img.pix8(i+1,j+1)+src_img.pix8(i-1,j+1)+src_img.pix8(i+1,j-1)); result=result/9; if(result>255) result=255; dst_img.pix8(i,j)=result;
} } return 0;
}
3.HPF--sobel Filter
bool SharpenImage(CDIB& src_img, CDIB& dst_img)
{
int i,j; unsigned int *t; int v1,v2; int max,min; if(!src_img.getDIB()) return 0; if(!src_img.isGray()) return 0; else { int w=src_img.getDIB()->w;//画像の幅と高さの取得 int h=src_img.getDIB()->h; int *t=new int [w*h];//フィルタ後画素値格納用 for(i=0;i<w*h;i++) t[i]=0; for(i=1;i<w-1;i++) for(j=1;j<h-1;j++) { //High Pass Filter の実現 v1=abs( (src_img.pix8(i+1,j-1) + 2*src_img.pix8(i+1,j) + src_img.pix8(i+1,j+1)) - (src_img.pix8(i-1,j-1) + 2*src_img.pix8(i-1,j) + src_img.pix8(i-1,j+1)) ); v2=abs( (src_img.pix8(i-1,j+1) + 2*src_img.pix8(i,j+1) + src_img.pix8(i+1,j+1)) - (src_img.pix8(i-1,j-1) + 2*src_img.pix8(i,j-1) + src_img.pix8(i+1,j-1)) ); t[j*w + i] = v1 + v2; } dst_img.create(w,h,8); max=min=0; for(i=1;i<w*h;i++){ max=(max<t[i])? t[i]:max; min=(min>t[i])? t[i]:min; } double s;//新画素値 double k = 255.0 / max; for (i=1;i<w;i++){ for (j= 1; j< h; j++){ s = (t[j*w+i] - min ) * k + 0.5; if(s < 0) s = 0; if(s > 255) s = 255; dst_img.pix8(i,j) = (unsigned)s; }
} }
return 0;
}
考察
1.画像を離散フーリエ変換したことで、低周波成分を画像の中心部分、高周波成分を外周部分に変換した。
2.LPFに通すことで、画像の高周波成分を除去し、画像をよりスムーズに処理することができた。(画素値の変化が激しい部分をフィルタによって除去したことによってボヤけた印象の画像が得られた)
3.HPFに通すことで、画像の低周波成分を除去し、画像の輪郭を抽出できた。(画像の輪郭は画素値の変化が激しいので、高周波成分として取り出せると考えた)
- 最終更新:2012-12-17 16:58:18