web-dev-qa-db-ja.com

MATLABでグレースケール行列をRGB行列に変換する方法は?

rgbImage = grayImage / max(max(grayImage));

または

rgbImage = grayImage / 255;

上記のどれが正しいですか、そして理由は?

10
user198729

グレースケール画像RGB画像 に変換するには、次の2つの問題に対処する必要があります。

  • グレースケール画像 は2次元ですが、 RGB画像 は3次元であるため、グレースケール画像データを3回複製し、3つのコピーを3次元に連結する必要があります。
  • 画像データは多くの異なる データ型 に保存できるため、それに応じて変換する必要があります。 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]);
    
23
gnovice

定義上、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チャネルマトリックスに変換する必要があります。

2
Jacob