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

また

rgbImage = grayImage / 255;

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

4

2 に答える 2

23

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

  • グレースケール画像は2Dですが、RGB画像は3Dであるため、グレースケール画像データを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グレースケール画像をdoubleRGB画像に変換するには、最初に変換してから、255でスケーリングする必要がありますdouble

    rgbImage = repmat(double(grayImage)./255,[1 1 3]);
    
  • doubleグレースケール画像をuint8RGB画像に変換するには、最初に255でスケーリングしてから、次のように変換する必要がありますuint8

    rgbImage = repmat(uint8(255.*grayImage),[1 1 3]);
    
于 2010-04-12T12:41:35.857 に答える
2

定義上、RGB画像には3つのチャネルがあります。これは、画像を表すために3次元マトリックスが必要であることを意味します。したがって、正しい答えは次のとおりです。

rgbImage = repmat(255*grayImage/max(grayImage(:)),[1 1 3]);

正規化するときは注意してくださいgrayImage。その場合、操作の精度grayImageuint8いくらか失われ255*grayImage/max(grayImage(:))ます。

また、正規化grayImageはデータに依存します。あなたの質問では、2つの方法を使用しました。

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

1これは、画像の最大値がとになるようにグレースケール画像を正規化します。

rgbImage = grayImage / 255;

grayImageこれは、の値が範囲内にある場合にのみ意味があり0-255ます。

ですから、それは本当にあなたが何をしたいかによります。ただし、RGB画像が必要な場合は、シングルチャネルマトリックスを3チャネルマトリックスに変換する必要があります。

于 2010-04-12T03:21:59.423 に答える