私はmatplotlib.pyplot.imshow()を使ってグレースケール画像を表示しようとしています。私の問題は、グレースケール画像がカラーマップとして表示されることです。画像の上にカラーで描画したいので、グレースケールが必要です。
画像を読み込み、PILのImage.open()。convert( "L")を使ってグレースケールに変換します。
image = Image.open(file).convert("L")
それから画像を行列に変換するので、簡単に画像処理をすることができます。
matrix = scipy.misc.fromimage(image, 0)
しかし、私がするとき
figure()
matplotlib.pyplot.imshow(matrix)
show()
カラーマップを使用して画像を表示します(つまり、グレースケールではありません)。
私はここで何をしていますか?
次のコードはファイルimage.png
から画像をロードしてグレースケールで表示します。
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
fname = 'image.png'
image = Image.open(fname).convert("L")
arr = np.asarray(image)
plt.imshow(arr, cmap='gray', vmin=0, vmax=255)
plt.show()
逆グレースケールを表示したい場合は、cmapをcmap='gray_r'
に切り替えます。
グレースケールカラーマップを使ってみませんか?
例えば。何かのようなもの
imshow(..., cmap=pyplot.cm.binary)
カラーマップのリストは、 http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html を参照してください。
import matplotlib.pyplot as plt
コード内で1回実行することもできます
plt.gray()
これは画像をグレースケールでデフォルトとして表示します
im = array(Image.open('I_am_batman.jpg').convert('L'))
plt.imshow(im)
plt.show()
Get_cmapメソッドを使います。例:
import matplotlib.pyplot as plt
plt.imshow(matrix, cmap=plt.get_cmap('gray'))
これを試して:
import pylab
from scipy import misc
pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
@unutbuの答えは正しい答えに非常に近いです。
デフォルトでは、plt.imshow()は(M×N)配列データを0.0〜1.0にスケールしようとします。そして、0〜255にマッピングします。最も自然に撮影された画像の場合、これは問題ありません、あなたは違うものを見ることはありません。ただし、狭い範囲のピクセル値の画像がある場合は、最小ピクセルが156、最大ピクセルが234であるとします。グレーの画像はまったく違って見えます。画像をグレーで表示する正しい方法は、
from matplotlib.colors import NoNorm
...
plt.imshow(img,cmap='gray',norm=NoNorm())
...
例を見てみましょう。
これが元の画像です。 オリジナル
これはデフォルトのノルム設定を使用しています、それはなしです: 間違った写真
これはNoNorm()であるNoNorm設定を使用しています。 right pic
補間を使用せず、グレーに設定します。
import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')