Отображение изображения в градациях серого с использованием matplotlib - PullRequest
197 голосов
/ 29 сентября 2010

Я пытаюсь отобразить изображение в градациях серого, используя 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()

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

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

Ответы [ 7 ]

300 голосов
/ 29 сентября 2010

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

25 голосов
/ 29 сентября 2010

Попробуйте использовать цветовую карту в оттенках серого?

например. что-то вроде

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

Список цветовых карт см. В http://scipy -cookbook.readthedocs.org / items / Matplotlib_Show_colormaps.html

15 голосов
/ 23 июля 2012

import matplotlib.pyplot as plt

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

plt.gray()

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

im = array(Image.open('I_am_batman.jpg').convert('L'))
plt.imshow(im)
plt.show()
9 голосов
/ 02 декабря 2015

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

1002 *
8 голосов
/ 09 марта 2012

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

import pylab
from scipy import misc

pylab.imshow(misc.lena(),cmap=pylab.gray())
pylab.show()
7 голосов
/ 06 марта 2018

@ ответ 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 (): right pic

1 голос
/ 15 апреля 2019

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

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...