RGB24bitのカラー画像をグレースケール8bitの白黒濃淡画像に変換する場合、
多くの人が何かしらの係数を用いた変換式を利用するでしょう。
byte value = (byte)(0.299 * R + 0.587 * G + 0.114 * B);
(係数は一例です)
この時、もし元画像自体がもともと8bitグレースケール画像で
たまたまファイル保存する時に(R == G == B)の24bit形式で保存されていたとしたらどうなるでしょう。
このグレースケール画像のヒストグラムは
でしたが、一度RGB24bit形式で保存された後に上記の変換式で再度グレースケール変換されたら以下のようになります。
浮動小数点の演算誤差により画素値によっては元の値に戻らない場合があるため、ヒストグラムが変わってしまうのです!
if (R == G && G == B)
{
return R;
}
else
{
byte value = (byte)(0.299 * R + 0.587 * G + 0.114 * B);
return value;
}
このようにすれば可逆変換ができます。
エンジニア生活四半世紀ですが、世の中には恐ろしい落とし穴があるものだな、と最近気が付きました(笑)。