Last-modified: Fri, 18 May 2012 08:36:39 JST
Counter:8062 Today:2 Yesterday:2 Online:4
このエントリーをはてなブックマークに追加

3.グレースケールへの変換

About

0.png

 先の章では、特定の色成分を操作して結果として表示する手法を解説しました。ここでは色成分を組み合わせて操作して、グレースケール画像を生成する手法について解説します。

Sample Program

グレースケール(Gray scale)とは

 白と黒に、その間の濃淡色(つまり灰色)を含んだ画像をグレースケール(モノクロ)と言います。美術的に言うと彩度(鮮やかさ)が"0"の画像です。RGBの値を利用して白黒灰色を表現する場合は、RGBそれぞれの値を同じ値にします。例えばある画素の成分がそれぞれR=G=B=0の時、その画素は黒になります。一方で、R=G=B=255となる時、その画素は白になります。値が大きいほど白に近づき、値が小さいほど黒になります。RGBが共通の値をとるため、保存する情報が0~255の値1つで済むことから8bitの画像として扱われることがよくあります。

画素データ参照のための前準備

 画素データを参照するために必要な前準備は先の章と同様であるため以降は解説を割愛します。byte配列として保存している所までは共通の処理です。

画素データの操作

 上述の通り、グレースケール画像はRGB成分が同じ値をとる画像です。ここでは最も単純なアルゴリズムについて解説します。RGB成分の平均値を求め、その値をグレースケールの値とし、RGBにそれぞれ代入します。

注意するべき点として、byte型データは0~255までの値しか取りませんから、RGB成分の値を合算するとその値を超える可能性が十分にあります。そこでint型として合算値を保存しておき、RGBに再度代入する際にキャストしています。

            //灰色の値
            int grayColor = 0;

            //保存したデータは 1pixel = {[B][G][R][X]} の並びで保存されている。
            //各値は0~255。ここではBとGを0にして、Rの成分だけそのままにする。
            for (int i = 0; i < dataArray.Length; i += 4)
            {
                //BGR成分の値をそれぞれ合算する
                grayColor += dataArray[i];
                grayColor += dataArray[i + 1];
                grayColor += dataArray[i + 2];
                //合算した後3で割って平均をとる(※byteは0~255の値しか取れないので注意)
                grayColor /= 3;

                //求めた値をRGBの各成分にする
                dataArray[i] = (byte)grayColor;
                dataArray[i + 1] = (byte)grayColor;
                dataArray[i + 2] = (byte)grayColor;

                //灰色の値を初期化
                grayColor = 0;
            }

 結果

 配列の編集結果を反映させる手続きについても先の章と共通なので以降は解説を割愛します。結果画像はこのページの見出しを参照してください。

ここで紹介した手法以外にも、人間の視覚特性を考慮したグレースケール化アルゴリズムなどがあります。ここで用いた平均値をとる手法は、単純で高速に処理されるので、速度を重要視するアプリケーションなどで採用されます。