LoginSignup
5
4

More than 5 years have passed since last update.

RGB画像をグレースケール変換する時の落とし穴

Last updated at Posted at 2016-11-18

RGB24bitのカラー画像をグレースケール8bitの白黒濃淡画像に変換する場合、
多くの人が何かしらの係数を用いた変換式を利用するでしょう。

byte value = (byte)(0.299 * R + 0.587 * G + 0.114 * B);

(係数は一例です)

この時、もし元画像自体がもともと8bitグレースケール画像で
たまたまファイル保存する時に(R == G == B)の24bit形式で保存されていたとしたらどうなるでしょう。

image

このグレースケール画像のヒストグラムは

image

でしたが、一度RGB24bit形式で保存された後に上記の変換式で再度グレースケール変換されたら以下のようになります。

image

浮動小数点の演算誤差により画素値によっては元の値に戻らない場合があるため、ヒストグラムが変わってしまうのです!

if (R == G && G == B)
{
    return R;
}
else
{
    byte value = (byte)(0.299 * R + 0.587 * G + 0.114 * B);
    return value;
}

このようにすれば可逆変換ができます。

エンジニア生活四半世紀ですが、世の中には恐ろしい落とし穴があるものだな、と最近気が付きました(笑)。

5
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4