グレースケール

フルカラー画像を 256 階調のグレースケール画像に変換する方法です。様々な方法が考えられていますが、ここでは代表的な 3 手法を相互に比較しながら紹介します。

彩度を下げる方法

グレースケールとはつまりは無彩色*1だけからなる画像のことです。そこで変換の方法としては、各ピクセルの彩度を 0 に落としてやる方法が考えられます。
原画像 彩度を 0 に落とした画像

無彩色では色相は意味を持たず、明度のみによってグレーの濃淡が決まるので、この場合、任意の RGB 成分を持つ画素からグレースケールへ変換するには以下の式*2が利用できます。

出力画素 = (最大成分 + 最小成分) / 2

先の写真画像によるとこの方法は一見問題なさそうですが、実は、下のようなスペクトルを変換すると単一のグレーになってしまい結果が芳しくありません。
スペクトル

この方法は非常に直感的で簡単なのですが、意図的な場合を除いて、RGB 各成分の値が何らかの形で反映される変換方法を用いた方が良さそうです。

RGB 値の平均をとる方法

そこで次に考えられるのが、RGB 成分の平均値を新しい画素値にするという方法です。RGB 成分の値が 3 つとも同じであるとき、その色が彩度 0 のグレーとなることを利用します。
原画像 RGB 値の平均による変換画像

出力画素 = (R成分 + G成分 + B成分) / 3

写真画像では彩度を落とす方法との違いが判りにくいかもしれませんが、スペクトルを見ると、RGB 成分の値によってちゃんとグレーに濃淡ができています。
スペクトル

しかしながら、心理的な明るさが異なる Green と Blue が同じ濃度であったりと、人間の視覚の色に対する感度の違いを考慮に入れていないのが問題です。

重み付き平均をとる方法

それでは、生理的な特性を考慮に入れて RGB 各成分に重み付けをして平均をとる方法はどうでしょうか。
原画像 重み付け平均による変換画像

左側の女の子のコートに注目してみてください。これまでの 2 つと比べて、やや濃い目のグレーになっていますね。原画像の雰囲気がちゃんと残っています。

以下に示す変換式はテレビ放送の規格 NTSC*3 で使用されている YIQ カラーモデル*4に基づくものです。カラー映像を白黒テレビで映すのと同じ処理をします。

出力画素 = (0.299 * R成分 + 0.587 * G成分 + 0.114 * B成分)

スペクトルの変換結果は以下の通り。RGB 値の単純な平均では問題のあった Green と Blue にも濃度差があって、心理的に納得できる形になっています。
スペクトル

実際にこの変換式をプログラミングで利用する場合、小数を含む計算は比較的時間がかかるので、係数を 256 倍して整数だけの計算にすると、ある程度高速化を図ることもできます。

ダウンロード

サンプルプログラムでは、ここで紹介した 3 種類のグレースケール化を実際に比較することができます。同梱の写真画像では違いが判りづらい場合は、適宜置き換えて試してみてください。

Download LPSGrayscale.lzh (74KB)

Note.

*1 色の鮮やかさ、つまり彩度が 0 であるような色のことです。逆に最も鮮やかな場合を純色と呼びます。詳しくは『色相・彩度・明度』を参照してください。
*2 この変換式は RGB カラーモデルを HSB カラーモデルに変換するときの明度を求める式と同じです。
*3 NTSC は "National Television System Committee" の略。
*4 Y は輝度信号、I は間隔信号(Orange-Cyan)、Q は対角信号(Yellow-Magenta)。ここでは Y 成分を使用します。