端くれプログラマの備忘録 C#,画像処理 [C#] カラー画像をグレースケール化する

[C#] カラー画像をグレースケール化する

RGBをグレースケール化するにはNTSC加重平均法が使われることが多い。この方法を使うと、輝度(Y)は以下のように算出できる。

Y = ( 0.298912 * R + 0.586611 * G + 0.114478 * B )

osakana.factory – グレースケールのひみつ
http://ofo.jp/osakana/cgtips/grayscale.phtml

ColorMatrixを使ってこの数式を適用することで、画像を簡単にグレースケール化することができる。

ColorMatrix クラス (System.Drawing.Imaging)
http://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.colormatrix(v=vs.110).aspx

サンプルコード

private Bitmap grayscale(Bitmap image)
{
    Bitmap dest = new Bitmap(image.Width, image.Height);
    Graphics g = Graphics.FromImage(dest);

    ColorMatrix cm = new ColorMatrix(
            new float[][]{
            new float[]{0.299f, 0.299f, 0.299f, 0 ,0},
            new float[]{0.587f, 0.587f, 0.587f, 0, 0},
            new float[]{0.114f, 0.114f, 0.114f, 0, 0},
            new float[]{0, 0, 0, 1, 0},
            new float[]{0, 0, 0, 0, 1}
        });
    ImageAttributes ia = new ImageAttributes();
    ia.SetColorMatrix(cm);
    g.DrawImage(image,
        new Rectangle(0, 0, image.Width, image.Height),
        0, 0, image.Width, image.Height, GraphicsUnit.Pixel, ia);
        g.Dispose();
    return dest;
}

処理例

0008