// ガウシアンフィルタ用画像を生成するプログラム // プログラム名:gauss_img.cpp #include "eps-header.hh" // ガウシアンフィルタ用画像を生成する関数 void gauss_filter_img( int nr_lines, // ガウシアンフィルタのライン方向のサイズ(入力) int nr_pixels, // ガウシアンフィルタのピクセル方向のサイズ(入力) double sigma, // ガウス分布の標準偏差(入力) class image& dst) // フィルタリング画像クラス(出力) { dst.gmake(nr_lines, nr_pixels); // フィルタリング画像の配列を確保 // すべての画素値はゼロにクリアされている。 // ガウシアンフィルタの作成 // f(x, y) =(1/(2πσ^2))exp(-(x^2+y^2)/(2*σ^2)) // σ:標準偏差 // double gauss_const = (double)MAX_GRAY_LEVEL / (2.0 * PI * sigma * sigma); double gauss_const = (double)MAX_GRAY_LEVEL; for (int iy = 0; iy < nr_lines; iy ++) { for (int ix = 0; ix < nr_pixels; ix ++) { double yy = iy - (nr_lines - 1) / 2; double xx = ix - (nr_pixels - 1) / 2; double f = gauss_const * exp(- (xx * xx + yy * yy) / (2.0 * sigma * sigma)); dst.p[iy][ix] = (unsigned char)f; } } } // プログラムの開始位置 int main() { char linebuf[MAX_FILENAME_LEN]; int nr_lines; // ガウシアンフィルタのライン方向のサイズ int nr_pixels; // ガウシアンフィルタのピクセル方向のサイズ double sigma; // ガウス分布の標準偏差 class image dst; // ガウシアンフィルタ用画像クラスを宣言 printf("\nガウシアンフィルタ用画像を生成します。\n"); printf("ピクセル方向(横方向)のサイズを入力してください。"); fgets(linebuf, MAX_FILENAME_LEN - 1, esp_in); sscanf(linebuf, "%d", &nr_pixels); printf("ライン方向(縦方向)のサイズを入力してください。"); fgets(linebuf, MAX_FILENAME_LEN - 1, esp_in); sscanf(linebuf, "%d", &nr_lines); printf("ガウス分布の標準偏差を入力してください。"); fgets(linebuf, MAX_FILENAME_LEN - 1, esp_in); sscanf(linebuf, "%lf", &sigma); // ガウシアンフィルタ用画像を生成する。 gauss_filter_img( nr_lines, // ガウシアンフィルタのライン方向のサイズ(入力) nr_pixels, // ガウシアンフィルタのピクセル方向のサイズ(入力) sigma, // ガウス分布の標準偏差(入力) dst); // フィルタリング画像クラス(出力) dst.gsave(); // 処理済画像をBMPファイルに保存する // BMPファイルを指定したい場合は, // dst.gsave("パス付きBMPファイル名"); // とする。 }