あなたの画像は「インデックス付き」画像です。つまり、それは何よりも「ラベル」として機能する整数値を含み、これらのラベルのそれぞれは色(すなわち、RGBの三つ組)にマッピングされます。 map
変数はそのマッピングを表します。 5行目には、たとえば 'label' "5"に対応するrgbトリプレットがあります。
unique(img)
を実行すると、img
配列の値がかなり規則的になっていることがわかります。コマンドrgbplot
は、実際のカラーマップをグラフィカルに示すことができます。マップ変数にrgbplot(map)
を実行すると、赤色の緑色と青色のそれぞれのマッピングが表示されます。
ここで、コンピュータ上の画像を保存してimg2
と読んで、配列の値を比較してください。
この画像はphotoeditingソフトウェアを用いて、「グレースケール」一方(GIMP)に、あなたに連結された「索引付け」画像から変換して生成しました。違いは、グレースケール画像の です。ピクセル値は整数のラベルではなく、実際の輝度を表します。 Imreadはグレースケールイメージをデフォルトでuint8
イメージとして読み込みます。つまり、0(黒)から255(白)の範囲のピクセルに輝度値を割り当てます。これらの値は整数であるため、あなたは依然として不正行為をして「ラベル」として扱い、カラーマッピングを強制することができます。しかし、「線形マップ」(値1 =強度1、値2 =強度2など)を割り当てると、イメージは期待どおりになります。
unique(img2)
の値がかなり異なることがわかります。 imshow(img2)
の場合、期待どおりに表示されます。 imshowのカラーマップを指定しない場合、マップは画像配列の最小値から最大値までの線形マッピングであるとみなされます。なぜなら、値が決して対応していなかった強度へ。
また、これを表示するが、現在のカラーマップを使用するimagesc(img2)
を試してください。 imagesc
は、カラーマップを「拡大縮小」するので、最も低い色が画像内の最も低い値になり、同様に最も高い色になります。 デフォルトのカラーマップはjet
です。サイケデリックなイメージが見えるはずですが、lenaをはっきりと描くことができるはずです。 colormap gray
を試すと、グレーのバージョンが再び表示されます。またcolormap hot
を試してください。カラーマップを理解するには、rgbplot
コマンドを試してください(例:rgbplot(gray)
、rgbplot(hot)
など)。
imshowに戻って、imshowは基本的にインデックス付きイメージを表示し、それを表示するために使用するカラーマップを指定します。カラーマップを指定しない場合は、最小値から最大値までの線形補間をマップとして使用します。したがって、imshow(img)は、灰色のカラーマップでimagesc(img)と同じようにイメージを表示します。あなたの最初のimg
の値は、実際の強度ではなく、均等に間隔を置いた「ラベル」を表しているので、ゴミの画像が出ます。
EDIT:あなたのインデックス付きイメージをグレースケール画像に変換したい場合は、MATLABは例えば、ind2gray
機能を提供します。
[img, map] = imread('lena.bmp');
img_gray = ind2gray(img, map);
これは、あなたのようにピクセル値を処理することを意味している場合、あなたが必要なもの、おそらくです強度。
出力として得られる 'img'マトリックスの最大値と最小値はいくらですか? – Prakhar