// グレイスケール画像のヒストグラムを線形変換するプログラム // プログラム名:linear.cpp #include "eps-header.hh" // 元画像(src)のヒストグラムを線形変換させて,処理済画像(dst)に入れる関数 void linear_img( class image& src, // 元画像クラス(入力) class image& dst) // 処理済画像クラス(出力) { if (src.p == NULL) { printf("元画像がありません。"); return; } printf("\nグレイスケール画像のヒストグラムを線形変換します。\n"); int nr_lines = src.get_nr_lines(); // 元画像のライン数 (縦の画素数) int nr_pixels = src.get_nr_pixels(); // 元画像のピクセル数 (横の画素数) dst.gmake(nr_lines, nr_pixels); // 処理済画像の配列を確保 // ヒストグラムの分布を計測するため輝度値の最大値と最小値を求める。 int g_min = dst.p[0][0]; // 輝度値の最小値 int g_max = dst.p[0][0]; // 輝度値の最大値 int g; for (int iy = 0; iy < nr_lines; iy ++) { for (int ix = 0; ix < nr_pixels; ix ++) { g = src.p[iy][ix]; if (g_min > g) g_min = g; if (g_max < g) g_max = g; } } printf("輝度値の最小値 : %4d\n", g_min); printf("輝度値の最大値 : %4d\n", g_max); for (int iy = 0; iy < nr_lines; iy ++) { for (int ix = 0; ix < nr_pixels; ix ++) { g = (int)(MAX_GRAY_LEVEL * (double)(src.p[iy][ix] - g_min) / (g_max - g_min) + 0.5); if (g < MIN_GRAY_LEVEL) g = MIN_GRAY_LEVEL; if (g > MAX_GRAY_LEVEL) g = MAX_GRAY_LEVEL; dst.p[iy][ix] = g; } } } // プログラムの開始位置 int main() { class image src; // 元画像クラスを宣言 class image dst; // 処理済画像クラスを宣言 src.gload(); // 元画像をBMPファイルから読み込む // BMPファイルを指定したい場合は, // src.gload("パス付きBMPファイル名"); // とする。 // 元画像(src)のヒストグラムを線形変換させて,処理済画像(dst)に入れる。 linear_img( src, // 元画像クラス(入力) dst); // 処理済画像クラス(出力) dst.gsave(); // 処理済画像をBMPファイルに保存する // BMPファイルを指定したい場合は, // dst.gsave("パス付きBMPファイル名"); // とする。 }