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画像に変換するには、最初に double
に変換してから、255でスケーリングする必要があります。
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チャネルマトリックスに変換する必要があります。