Отображать изображение в оттенках серого с использованием 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'
.
Ответ 2
Попробуйте использовать цветную шкалу оттенков серого?
например. что-то вроде
imshow(..., cmap=pyplot.cm.binary)
Список цветовых карт см. в http://scipy-cookbook.readthedocs.org/items/Matplotlib_Show_colormaps.html
Ответ 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(): правая картинка
Ответ 7
Пожалуйста, ответьте следующим образом, введите ссылку здесь
plt.imshow(im, cmap = grey)
Ответ 8
Не используйте интерполяцию и установите серый.
import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')