MATLAB で色が正しく表示されないことがあります。これが私の側のプログラミング エラーなのか、それとも MATLAB の実際のバグなのかはわかりません。昨年かそこらで、この動作に一定の規則性があることに気付きました。
今回は、問題のエラーのある Figure のスナップショットを作成することにしました (Windows 7、64 ビットの MATLAB 2011b で取得)。
問題の画像を表示するコードは次のとおりです。
figure;
clf;
cla;
imshow(matrix, []);
colormap(cmap);
set(gca, 'Clim', [0 highest_index]);
どこ:
matrix
タイプです(ただし、を呼び出す前にuint32
明示的にキャストしようとmatrix
しましたが)double
imshow
matrix
~の範囲0
の値900
cmap
901
エントリがありますhighest_index
は900
259
の値のRGB エントリは、matrix
上[1, 0, 0.1]
の画像とカラーマップ配列の両方にあります(cmap
つまり、カラーマップの最初のエントリはマトリックス値のためであるため、マトリックス値はカラーマップでインデックスを取得するcmap(300, :) = [1, 0, 0.1]
ことに注意してください)。259
300
0
質問:
なぜこれが起こるのですか?エラーですか?私が間違っていることはありますか?
更新 1:
- またはに切り替え
CDataMapping
てみましたが、違いはありませんでした。direct
scaled
imagesc
の代わりに も使用してみimshow
ましたが、違いはありませんでした。最初に画像を RGB に変換すると (つまり、
indexed image
を画像に変換しtrue color
ます。詳細については、こちらを参照してください)、つまり を使用するi_rgb = ind2rgb(i_indexed, cmap)
と、エラーがなくなり、画像が正しく表示されます。残念ながら、
true color
画像を表示すると、データ ヒントは各色の元のマトリックスのインデックスを明らかにせず、代わりに RGB ベクトルを表示するだけです (つまり、MATLAB は元のインデックスを認識していないため、これは論理的です)。
更新 2:
サンプルコードは次のとおりです。
h_f = figure(1);
clf;
i_spiral = spiral(40);
h_i = image(i_spiral);
% Synthesize a colormap first in HSV and then transform it to RGB:
max_i_spiral = max(i_spiral(:));
m = max_i_spiral;
h = (0:m-1)'/max(m,1);
cmap_spiral = hsv2rgb([h ones(m,2)]);
colormap(cmap_spiral);
% If I comment out the following two lines or use imshow instead of image,
% it makes no difference (I still get the same error):
set(gca, 'Clim', [1 max_i_spiral]);
set(h_i, 'CDataMapping', 'direct');
上記のコードの結果は次のとおりです。