web-dev-qa-db-ja.com

matplotlibを使って画像をグレースケールで表示する

私は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()

カラーマップを使用して画像を表示します(つまり、グレースケールではありません)。

私はここで何をしていますか?

193
Ryan

次のコードはファイル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'に切り替えます。

296
unutbu

グレースケールカラーマップを使ってみませんか?

例えば。何かのようなもの

imshow(..., cmap=pyplot.cm.binary)

カラーマップのリストは、 http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html を参照してください。

25
janneb

import matplotlib.pyplot as plt

コード内で1回実行することもできます

plt.gray()

これは画像をグレースケールでデフォルトとして表示します

im = array(Image.open('I_am_batman.jpg').convert('L'))
plt.imshow(im)
plt.show()
15

Get_cmapメソッドを使います。例:

import matplotlib.pyplot as plt

plt.imshow(matrix, cmap=plt.get_cmap('gray'))
9
Al Conrad

これを試して:

import pylab
from scipy import misc

pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
8
baco

@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

7
Stanley

補間を使用せず、グレーに設定します。

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
1
user3452134