【C#】画像のグレースケール変換

C#を用いて、カラー画像をグレースケール画像に変える方法について紹介します。

グレースケール変換(C#)

グレイスケール画像は、白から黒まで0~255の256階調の輝度値で色を表現します。
カラー画像をグレースケール画像に変換したい場合は、RGBの輝度値を足し合わせて3で割ります。
今回はC#を用いて上記の処理を実装して、グレースケール画像への変換をしてみました。

グレースケールの原理についてはこちら
参考 【画像処理】グレースケールの原理・特徴・計算式

ソースコード

プログラムのソースコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace Main
{
    class Program
    {
        static void Main(string[] args)
        {
            // 画像の読み込み(グレースケールに変換して)
            byte[,] data = LoadImageGray("src.jpg");

            // 画像保存
            SaveImage(data, "dst.jpg");
        }

        // 画像をグレースケール変換して読み込み
        static byte[,] LoadImageGray(string filename)
        {

            Bitmap bitmap = new Bitmap(filename);
            int w = bitmap.Width;
            int h = bitmap.Height;
            byte[,] data = new byte[w, h];

            // bitmapクラスの画像ピクセル値を配列に挿入
            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                 // グレイスケールに変換
                     data[j, i] = (byte)((bitmap.GetPixel(j, i).R + bitmap.GetPixel(j, i).B + bitmap.GetPixel(j, i).G) / 3);
                }
            }
            return data;
        }

        static void SaveImage(byte[,] data, string filename)
        {
            // 画像データの幅と高さを取得
            int w = data.GetLength(0);
            int h = data.GetLength(1);

            Bitmap bitmap = new Bitmap(w, h);

            // ピクセル値のセット
            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    bitmap.SetPixel(j,i,Color.FromArgb(data[j, i], data[j, i], data[j, i]));
                }
            }

            // 画像の保存
            bitmap.Save(filename);
        }
    }
}

実行結果

プログラムの実行結果です。
【入力画像】

【出力画像】

- 関連ページ
1 C#で画像処理入門
2 C#入門】基礎文法とサンプル集
関連記事