RGBをグレースケール化するにはNTSC加重平均法が使われることが多い。この方法を使うと、輝度(Y)は以下のように算出できる。
1 |
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
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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; } |