Отображение изображения в градациях серого с помощью matplotlib

232

Я пытаюсь отобразить изображение в градациях серого с помощью matplotlib.pyplot.imshow () . Моя проблема в том, что изображение в градациях серого отображается в виде цветовой карты. Мне нужна оттенки серого, потому что я хочу рисовать поверх изображения цветом.

Я прочитал изображение и преобразовал его в оттенки серого, используя Image.open (). Convert ("L") в PIL

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

Затем я преобразую изображение в матрицу, чтобы я мог легко выполнить некоторую обработку изображения, используя

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

Тем не менее, когда я делаю

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

он отображает изображение с использованием карты цветов (то есть это не шкала серого).

Что я здесь не так делаю?

Райан
источник

Ответы:

369

Следующий код загрузит изображение из файла 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='gray_r'.

unutbu
источник
4
@jay: Для этой строки документа : «Обратите внимание, что любая цветовая карта, перечисленная здесь, может быть изменена путем добавления _r».
unutbu
31
Предупреждение matplotlib отрегулируйте интенсивность в пиксельной шкале, если вы не хотите использовать:plt.imshow(im_gray,cmap='gray', vmin = 0, vmax = 255)
themadmax
17

import matplotlib.pyplot as plt

Вы также можете запустить один раз в своем коде

plt.gray()

Это покажет изображения в оттенках серого по умолчанию

im = array(Image.open('I_am_batman.jpg').convert('L'))
plt.imshow(im)
plt.show()
Элиэль Ван Хойман
источник
Какую библиотеку вы используете для gray()или grey()?
SherylHohman
@SherylHohman, это gray... серый - стандартное американское правописание, а серый - британское правописание для того же цвета.
Облако Чо
12

Я бы использовал метод get_cmap. Напр .:

import matplotlib.pyplot as plt

plt.imshow(matrix, cmap=plt.get_cmap('gray'))
Аль Конрад
источник
11

Ответ @ unutbu довольно близок к правильному ответу.

По умолчанию plt.imshow () будет пытаться масштабировать данные вашего массива (MxN) до 0,0 ~ 1,0. А затем сопоставьте с 0 ~ 255. Для большинства естественных снятых изображений это хорошо, вы не увидите другого. Но если у вас узкий диапазон значений изображения в пикселях, скажем, минимальный пиксель равен 156, а максимальный - 234. Серое изображение будет выглядеть совершенно неправильно. Правильный способ показать изображение в сером

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

Давайте посмотрим на пример:

это оригинальное изображение: оригинал

это использует настройку по умолчанию, которая является None: неправильный рис

это использует установку NoNorm, которая является NoNorm (): правая картинка

Стэнли
источник
9

попробуй это:

import pylab
from scipy import misc

pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
Baco
источник
нет pylab.grey(), может быть его убрали?
Линдон Уайт
4

Не используйте интерполяцию и установите серый.

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
user3452134
источник