2016-07-19 8 views
0

グレースケールイメージ "lena.bmp"があります。私はimread()関数を使用してこの画像をmatlabに読み込みたい。 私は以下のコードを使用して画像を読み込んで表示すると、画像が暗くなります(黒)。matlabでグレースケールイメージを読む

img = imread('lena.bmp'); 
    imshow(img); 

が、私は以下のコードを使用するときに、私が見ても問題がありません。

[img map]= imread('lena.bmp'); 
    imshow(img,map); 

私の最初のコードは(rgb2gray関数が生成するもののような)グレースケールモードで画像を読み取るない用量はと思われます。

私のイメージは次のとおりです。

enter image description here

私はこの問題を解決するために何ができますか?

+0

出力として得られる 'img'マトリックスの最大値と最小値はいくらですか? – Prakhar

答えて

3

あなたの画像は「インデックス付き」画像です。つまり、それは何よりも「ラベル」として機能する整数値を含み、これらのラベルのそれぞれは色(すなわち、RGBの三つ組)にマッピングされます。 map変数はそのマッピングを表します。 5行目には、たとえば 'label' "5"に対応するrgbトリプレットがあります。

unique(img)を実行すると、img配列の値がかなり規則的になっていることがわかります。コマンドrgbplotは、実際のカラーマップをグラフィカルに示すことができます。マップ変数にrgbplot(map)を実行すると、赤色の緑色と青色のそれぞれのマッピングが表示されます。

ここで、コンピュータ上の画像を保存してimg2と読んで、配列の値を比較してください。

enter image description here

この画像は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); 

これは、あなたのようにピクセル値を処理することを意味している場合、あなたが必要なもの、おそらくです強度。

関連する問題