static void Main(string[] args) { // 5.画像CまたはDに対し、ソラリゼーション(入力[0-255],出 力[0-254]の濃度値の間で振幅127,周期3の余弦波 曲線)を行い、ヒストグ ラム分布の変化を確認せよ。 // ソラリゼーション用トーンカーブ作成 var curve = new ToneCurve(); for (var i = 0; i < 256; ++i) { curve[i] = (int)(127 * (Math.Cos(i * 3 * 2 * Math.PI / 256) + 1)); } foreach (var name in new List <string> { "C", "D" }) { // 画像読み込み var src = new GlayImage(name + ".pgm"); // ヒストグラム画像を生成して出力 new Histgram(src).GetHistgramImage().Write(name + "_hist.pgm"); // ソラリゼーション適用 var dest = src.Apply(curve); // 画像を出力 dest.Write(name + "_solar.pgm"); // ヒストグラム画像を生成して出力 new Histgram(dest).GetHistgramImage().Write(name + "_solar_hist.pgm"); } }
static void Do1() { // 画像読み込み var src = new GlayImage("A.pgm"); // 階調の最小値と最大値を調べる var min = 255; var max = 0; for (var y = 0; y < src.Size.Height; ++y) { for (var x = 0; x < src.Size.Width; ++x) { if (src[x, y] < min) { min = src[x, y]; } if (src[x, y] > max) { max = src[x, y]; } } } // トーンカーブ作成 var curve = new ToneCurve(); for (var i = 0; i < 256; ++i) { if (i < min) { curve[i] = 0; } else if (i > max) { curve[i] = 255; } else { curve[i] = (i - min) * (200 - 30) / (max - min) + 30; } } // 画像を変換 var dest = src.Apply(curve); // 出力 dest.Write("A_curve.pgm"); }
static void Do2() { // 画像読み込み var src = new GlayImage("A.pgm"); foreach (var item in new List <Tuple <string, double> > { Tuple.Create("2_0", 2.0), Tuple.Create("0_5", 0.5) }) { var name = item.Item1; var gamma = item.Item2; // ガンマ補正のトーンカーブ作成 var curve = new ToneCurve(); for (var i = 0; i < 256; ++i) { var val = (int)(255 * Math.Pow(curve[i] / 255.0, 1 / gamma)); if (val >= 256) { val = 255; } curve[i] = val; } // 画像を変換 var dest = src.Apply(curve); // 画像を出力 dest.Write("A_gamma_" + name + ".pgm"); // ヒストグラム画像を生成 var hist = GetHistgramImage(dest); // ヒストグラム画像を出力 hist.Write("A_gamma_" + name + "_hist.pgm"); } }