C#でグレースケールや画像の明るさ調整、輪郭抽出などの画像処理をする方法を考えます。

グレースケール画像を取得する

アプリケーションはC# WindowsFormsで作ります。デザイナで以下のようなものを作成します。

フォームがLoadされたらリソースに追加しておいた画像データをpictureBox1(左側のPictureBox)のImageプロパティにセットします。

GetGrayscaleBitmapメソッドは引数で渡したBitmapのグレースケール画像を取得します。やっていることは各ピクセルのRGBの平均値を算出し、その値を引数にしてColor.FromArgbメソッドを呼び出して生成した色をBitmap.SetPixelメソッドでセットしているだけです(赤緑青では明るさが違うので本当はこんな単純な方法では不十分なのですが)。

ボタンがクリックされたらpictureBox1.ImageをGetGrayscaleBitmapメソッドに渡して新しいBitmapを取得し、これをpictureBoxBitmap2プロパティにセットしています。

画像の明るさ調整

画像の明るさ調整をします。TrackBarがスライドされると画像を明るくしたり暗くさせます。

GetBrightenedBitmapメソッドは第一引数で渡されたBitmapを第二引数分だけ明るくします。負数の場合は暗くします。

この部分はもっと工夫の余地があるのですが、ここでは各ピクセルのColorを取得して、ColorのRGBプロパティを第二引数分だけ増減させるという簡単な処理をしています。0よりも小さくなる場合は0、255より大きくなる場合は255にします。

チェックボックスがオンになっている場合だけTrackBarを操作可能にします。そしてtrackBarBrightness.Valueが変更されたら画像の明るさ調整をして、これを右側のPictureBoxに表示させます。

輪郭抽出をする

輪郭抽出をするための処理ですが、隣のピクセルと大きく色が異なる場合、そこは輪郭であると判断します。

画像の明るさ調整をします。TrackBarがスライドされると画像を明るくしたり暗くさせます。

GetEdgeBitmapメソッドは第一引数で渡されたBitmapにグレイスケール処理をして、右隣または下のピクセルのColor.Rプロパティの値が第二引数以上変化しているなら、そこに輪郭線を描画します。

チェックボックスがオンになっている場合だけTrackBarを操作可能にします。そしてtrackBarBoundaryValue.Valueが変更されたら輪郭抽出の処理をして、これを右側のPictureBoxに表示させます。