Відобразить зображення у масштабі сірого за допомогою matplotlib


231

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

Я читаю на зображенні та перетворюю в масштаб сірого за допомогою PIL's Image.open (). Convert ("L")

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

Потім я перетворюю зображення в матрицю, щоб я міг легко виконати деяку обробку зображення, використовуючи

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

Однак коли я

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

він відображає зображення за допомогою кольорової карти (тобто це не відтінки сірого).

Що я тут роблю неправильно?

Відповіді:


368

Наступний код завантажить зображення з файлу 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'.


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



4

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

import matplotlib.pyplot as plt
plt.imshow(img[:,:,1], cmap='gray',interpolation='none')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.