// グレイスケール画像にメディアンフィルタをかけるプログラム // プログラム名:median.cpp #include "eps-header.hh" // 元画像(src)にメディアンフィルタをかけて,処理済画像(dst)に入れる関数 void median_filter( class image& src, // 元画像クラス(入力) class image& dst, // 処理済画像クラス(出力) int mf_size) // メディアンフィルタのサイズ(入力) { if (src.p == NULL) { printf("元画像がありません。"); return; } printf("\nグレイスケール画像にメディアンフィルタをかけます。\n"); printf(" メディアンフィルタのマスクの大きさは,%d×%dです。\n", mf_size, mf_size); int nr_lines = src.get_nr_lines(); // 元画像のライン数 (縦の画素数) int nr_pixels = src.get_nr_pixels(); // 元画像のピクセル数 (横の画素数) dst.gmake(nr_lines, nr_pixels); // 処理済画像の配列を確保 int * px = new int [mf_size * mf_size]; int k; for (int iy = 0; iy < nr_lines; iy ++) { for (int ix = 0; ix < nr_pixels; ix ++) { // メディアンフィルタの階調値を配列に入れる。 k = 0; for (int imy = - (int)(mf_size / 2); imy <= (int)(mf_size / 2); imy ++) { for (int imx = - (int)(mf_size / 2); imx <= (int)(mf_size / 2); imx ++) { int y = iy + imy; int x = ix + imx; if (y < 0) y = 0; if (y >= nr_lines) y = nr_lines - 1; if (x < 0) x = 0; if (x >= nr_pixels) x = nr_pixels - 1; px[k ++] = src.p[y][x]; } } // メディアンフィルタの階調値をソートする。 for (int k1 = 0; k1 < mf_size * mf_size - 1; k1 ++) { for (int k2 = k1 + 1; k2 < mf_size * mf_size; k2 ++) { if (px[k1] < px[k2]) { int w = px[k1]; px[k1] = px[k2]; px[k2] = w; } } } // 中央値を処理済画像とする。 dst.p[iy][ix] = px[(mf_size * mf_size) / 2]; } } delete [] px; } // プログラムの開始位置 int main() { class image src; // 元画像クラスを宣言 class image dst; // 処理済画像クラスを宣言 src.gload(); // 元画像をBMPファイルから読み込む // BMPファイルを指定したい場合は, // src.gload("パス付きBMPファイル名"); // とする。 // 元画像(src)にメディアンフィルタをかけて,処理済画像(dst)に入れる。 median_filter( src, // 元画像クラス(入力) dst, // 処理済画像クラス(出力) 3); // メディアンフィルタのサイズ(入力) dst.gsave(); // 処理済画像をBMPファイルに保存する // BMPファイルを指定したい場合は, // dst.gsave("パス付きBMPファイル名"); // とする。 }