rgbImage = grayImage / max(max(grayImage));
また
rgbImage = grayImage / 255;
上記のどれが正しいですか、そして理由は?
グレースケール画像をRGB画像に変換するには、次の2つの問題に対処する必要があります。
double
、画像のピクセル値は0〜1の範囲の浮動小数点数である必要があります。uint8
データ型として保存する場合、画像のピクセル値は0〜255の範囲の整数である必要があります。関数を使用した画像マトリックスのデータ型class
。発生する可能性のある3つの典型的な条件は次のとおりです。
uint8
またはdouble
グレースケール画像を同じデータ型のRGB画像に変換するには、次の関数を使用できrepmat
ますcat
。
rgbImage = repmat(grayImage,[1 1 3]);
rgbImage = cat(3,grayImage,grayImage,grayImage);
uint8
グレースケール画像をdouble
RGB画像に変換するには、最初に変換してから、255でスケーリングする必要がありますdouble
。
rgbImage = repmat(double(grayImage)./255,[1 1 3]);
double
グレースケール画像をuint8
RGB画像に変換するには、最初に255でスケーリングしてから、次のように変換する必要がありますuint8
。
rgbImage = repmat(uint8(255.*grayImage),[1 1 3]);
定義上、RGB画像には3つのチャネルがあります。これは、画像を表すために3次元マトリックスが必要であることを意味します。したがって、正しい答えは次のとおりです。
rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]);
正規化するときは注意してくださいgrayImage
。その場合、操作の精度grayImage
がuint8
いくらか失われ255*grayImage/max(grayImage(:))
ます。
また、正規化grayImage
はデータに依存します。あなたの質問では、2つの方法を使用しました。
rgbImage = grayImage / max(max(grayImage));
1
これは、画像の最大値がとになるようにグレースケール画像を正規化します。
rgbImage = grayImage / 255;
grayImage
これは、の値が範囲内にある場合にのみ意味があり0-255
ます。
ですから、それは本当にあなたが何をしたいかによります。ただし、RGB画像が必要な場合は、シングルチャネルマトリックスを3チャネルマトリックスに変換する必要があります。