【C#】グレースケール画像の明るさ変更

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

明るさ変更(C#)

グレイスケール画像は、白から黒まで0~255の256階調の輝度値で色を表現します。
明るさを変更したい場合は、画像全体の256階調の輝度値を増減させます。
輝度値を増やせば明るくなり、減らせば暗くなります。
ただし、輝度値が256以上は255、0未満は0と処理を加えておく必要があります。
今回はC#を用いて上記の処理を実装して、グレースケール画像の明るさ変更をしてみました。

ソースコード

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

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

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

            // 明るさ変更
            byte[,] filterdata = BrightnessChange(data, 50);

            // 画像保存
            SaveImage(filterdata, "dst.jpg");
        }
        // 明るさ変更(brightを足して256以上は255、0未満は0)
        static byte[,] BrightnessChange(byte[,] data, int bright)
        {
            // 画像データの幅と高さを取得
            int w = data.GetLength(0);
            int h = data.GetLength(1);
            byte[,] brightdata = new byte[w, h];

            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    if ((int)data[j, i] + bright >= 256)
                    {
                        brightdata[j, i] = 255;
                    }
                    else if ((int)data[j, i] + bright < 0)
                    {
                        brightdata[j, i] = 0;
                    }
                    else
                    {
                        brightdata[j, i] = (byte)(data[j, i] + bright);
                    }
                }
            }
            return brightdata;
        }

        // 画像をグレースケール変換して読み込み
        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);
        }
    }
}

実行結果

プログラムの実行結果は下記の通りです。

■入力画像と出力画像

入力画像の輝度値を+50にしてより明るくしています。

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