Отображать изображение в оттенках серого с использованием 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()

он отображает изображение с помощью цветовой карты (то есть не в оттенках серого).

Что я здесь делаю неправильно?

Ответ 1

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

Ответ 3

import matplotlib.pyplot as plt

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

plt.gray()

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

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

Ответ 4

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

import matplotlib.pyplot as plt

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

Ответ 5

попробуйте следующее:

import pylab
from scipy import misc

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

Ответ 6

@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(): правая картинка

Ответ 8

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

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