Tampilkan gambar sebagai skala abu-abu menggunakan matplotlib

231

Saya mencoba untuk menampilkan gambar grayscale menggunakan matplotlib.pyplot.imshow () . Masalah saya adalah bahwa gambar grayscale ditampilkan sebagai colormap. Saya perlu skala abu-abu karena saya ingin menggambar di atas gambar dengan warna.

Saya membaca gambar dan mengkonversi ke skala abu-abu menggunakan Image.open PIL (). Convert ("L")

image = Image.open(file).convert("L")

Lalu saya mengonversi gambar ke matriks sehingga saya dapat dengan mudah melakukan pemrosesan gambar menggunakan

matrix = scipy.misc.fromimage(image, 0)

Namun, ketika saya melakukannya

figure()  
matplotlib.pyplot.imshow(matrix)  
show()

ini menampilkan gambar menggunakan colormap (artinya bukan skala abu-abu).

Apa yang saya lakukan salah di sini?

Ryan
sumber

Jawaban:

368

Kode berikut akan memuat gambar dari file image.pngdan akan menampilkannya sebagai skala abu-abu.

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

Jika Anda ingin menampilkan skala abu-abu terbalik, alihkan cmap ke cmap='gray_r'.

unutbu
sumber
4
@ Jay: Per string dokumen ini , "Perhatikan bahwa colormap apa pun yang tercantum di sini dapat dibalik dengan menambahkan _r."
unutbu
31
Matplotlib peringatan menyesuaikan intensitas skala piksel jika Anda tidak ingin menggunakan:plt.imshow(im_gray,cmap='gray', vmin = 0, vmax = 255)
themadmax
17

import matplotlib.pyplot as plt

Anda juga dapat menjalankan satu kali dalam kode Anda

plt.gray()

Ini akan menampilkan gambar dalam skala abu-abu sebagai standar

im = array(Image.open('I_am_batman.jpg').convert('L'))
plt.imshow(im)
plt.show()
Eliel Van Hojman
sumber
Pustaka mana yang Anda gunakan untuk gray()atau grey()?
SherylHohman
@ SherylHohman, itu gray... abu-abu adalah ejaan standar Amerika dan abu-abu adalah ejaan Inggris untuk warna yang sama.
Cloud Cho
12

Saya akan menggunakan metode get_cmap. Ex.:

import matplotlib.pyplot as plt

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

@ Jawaban unutbu cukup dekat dengan jawaban yang benar.

Secara default, plt.imshow () akan mencoba menskala data array (MxN) Anda menjadi 0,0 ~ 1.0. Dan kemudian memetakan ke 0 ~ 255. Untuk sebagian besar gambar yang diambil secara alami, ini bagus, Anda tidak akan melihat yang berbeda. Tetapi jika Anda memiliki kisaran sempit nilai gambar piksel, misalkan piksel min adalah 156 dan piksel maks adalah 234. Gambar abu-abu akan terlihat benar-benar salah. Cara yang tepat untuk menampilkan gambar berwarna abu-abu adalah

from matplotlib.colors import NoNorm
...
plt.imshow(img,cmap='gray',norm=NoNorm())
...

Mari kita lihat sebuah contoh:

ini adalah gambar asli : asli

ini menggunakan pengaturan norma defaul, yaitu None: salah pic

ini menggunakan pengaturan NoNorm, yaitu NoNorm (): gambar kanan

Stanley
sumber
9

coba ini:

import pylab
from scipy import misc

pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
baco
sumber
tidak ada pylab.grey(), mungkin sudah dihapus?
Lyndon White
4

Gunakan tanpa interpolasi dan atur menjadi abu-abu.

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