Я рисую версию этого изображения в оттенках серого: занятый кот

ИСТОЧНИК: http://matplotlib.org/examples/pylab_examples/griddata_demo.html

Я использовал следующий код:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from PIL import Image

file_name = 'griddata_demo.png'
def func_grey(fname):
    image = Image.open(fname).convert("L")
    arr = np.asarray(image)
    plt.imshow(arr, cmap = cm.Greys_r)
    plt.show()

func_grey(file_name)

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

Установка, над которой я работаю, имеет python 2.7 и Pandas, и я установил Pillow с простой установкой.

Справочная информация об изображении и требованиях:

  1. Изображение взято из данных, найденных здесь. В идеале оттенки серого версия этого изображения должна быть сгенерирована непосредственно из этого необработанного данные. т.е. не сохраняйте его как цветное изображение, а затем пытайтесь преобразовать в оттенки серого - скорее, просто создайте версию графика в оттенках серого.
  2. Я не знаю цвета, соответствующие z-значениям - эти цвета можно устанавливать произвольно.
  3. Цветовая карта изображения также может быть выбрана произвольно - никаких предпочтений. Это версия в оттенках серого, которая вызывает беспокойство.

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

После выполнения вышеуказанного кода создается изображение в оттенках серого. На цветной полосе изображения в оттенках серого уровень интенсивности -0,36 - темно-серый. При 0,00 он светло-серый. Но тогда 0,48 тоже темно-серый.

Вопрос: Можно ли изменить цветовую карту так, чтобы -0,36 был светло-серым, а 0,48 - темно-серым? Я имею в виду, можно ли отображать на шкале палитры от светлого к темному?

0
edesz 6 Окт 2014 в 18:22
Это хорошо известная проблема с цветовой картой исходного изображения: то есть она не имеет монотонной яркости (в вашем случае зеленый в 0 ярче, чем красный или синий в крайних точках .. вы можете просто увидеть это, так что не вините свой конвертер). Поэтому вместо преобразования с использованием яркости вам нужно инвертировать исходную палитру. Или, если вы можете создать цветное изображение с нуля и вам не нужно создавать существующее изображение, выберите другую карту цветов, например hot, или кубическую спираль и т. д.
 – 
tom10
7 Окт 2014 в 06:39
@tom10: Спасибо. Я действительно смотрю на ваш первый ответ. Я также прочитаю ваш второй комментарий, основанный на ссылке, и отпишусь здесь, как только попробую.
 – 
edesz
7 Окт 2014 в 15:59
Главный вопрос будет заключаться в том, какова ваша исходная цветовая карта? Поскольку вышеприведенное является просто демонстрацией, а детали карты цветов имеют решающее значение (в том смысле, что некоторые из них тривиальны, а некоторые сложны), важно знать их с самого начала.
 – 
tom10
7 Окт 2014 в 18:12
@tom10: (Если вы считаете, что было бы уместно обсудить это в чате, пожалуйста, дайте мне знать - я опубликую здесь результаты этого, чтобы ответить на исходный пост.) Итак, я проверил свою палитру с помощью " напечатайте cm.get_cmap ()», и я получил «объект ». Похоже, мне нужно выбрать серый цвет карты, который находится в списке цветовых карт Sequential2. Как изменить категорию и выбрать одну карту из списка новой категории?
 – 
edesz
8 Окт 2014 в 16:07
Чат меня устраивает, хотя я не знаю, как туда попасть, поэтому, пожалуйста, инициируйте его, если знаете. Когда вы говорите об этой проблеме, важно четко понимать, какая у вас исходная цветовая карта по сравнению с вашим пунктом назначения. Что бы это ни было, пожалуйста, уточните исходное изображение, которое вам нужно преобразовать: 1) есть ли у вас какой-либо контроль над ним (например, вы можете выбрать его цветовую карту)?, знаете ли вы, какие цвета соответствуют какие ценности и откуда вы это знаете? и т.д.
 – 
tom10
8 Окт 2014 в 17:32

2 ответа

Лучший ответ

Я думаю, что этот вопрос может быть о том, как использовать палитру в оттенках серого в matplotlib. Если так, то все просто. Вот пример использования разных цветовых карт (на основе кода для операционного изображения):

enter image description here

from numpy.random import uniform, seed
from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy as np
# make up data.
#npts = int(raw_input('enter # of random points to plot:'))

def f(spi, the_colormap):
    plt.subplot(spi)
    seed(0)
    npts = 200
    x = uniform(-2, 2, npts)
    y = uniform(-2, 2, npts)
    z = x*np.exp(-x**2 - y**2)
    xi = np.linspace(-2.1, 2.1, 100)
    yi = np.linspace(-2.1, 2.1, 200)
    zi = griddata(x, y, z, xi, yi, interp='linear')

    CS = plt.contour(xi, yi, zi, 15, linewidths=0.5, colors='k')
    CS = plt.contourf(xi, yi, zi, 15, cmap=the_colormap,
                      vmax=abs(zi).max(), vmin=-abs(zi).max())
    plt.colorbar()  # draw colorbar
    # plot data points.
    plt.scatter(x, y, marker='o', c='b', s=5, zorder=10)
    plt.xlim(-2, 2)
    plt.ylim(-2, 2)
    plt.title('griddata test (%d points)' % npts)

f(131, plt.cm.rainbow)
f(132, plt.cm.gray)
f(133, plt.cm.hot)

plt.show()

Если кто-то действительно хочет преобразовать в оттенки серого с помощью PIL (гораздо менее благоприятная, но иногда необходимая задача), лучше всего начать с цветовой карты, которая имеет монотонную яркость, как hot выше, но не rainbow. Кроме того, в комментариях я предложил использовать cubehelix, но это не стандартно для matplotlib, вместо этого см. здесь . См. здесь для изображения доступных цветовых карт matplotlib.

2
tom10 8 Окт 2014 в 18:27
Да, это отвечает на вопрос. Я обновлю исходный вопрос, чтобы отразить более подходящую формулировку. По сути, как вы и сказали, нет необходимости создавать изображение и сохранять его, а затем импортировать его просто для изменения цветовой карты. Все это должно быть сделано непосредственно из необработанных данных. Спасибо за ваше терпение и за ответ. Это ответ, который у меня было много проблем с поиском в Интернете.
 – 
edesz
8 Окт 2014 в 18:23
Просто продолжение вашего третьего сюжета - вы использовали «горячий» в качестве цветовой карты. Я предполагаю, что по умолчанию он выбрал красный цвет - можно ли установить его на другие цвета?
 – 
edesz
8 Окт 2014 в 18:27
Я добавил ссылку, где вы можете увидеть все включенные цветовые карты. Вы также можете довольно легко создать свою собственную с нуля, если они простые (например, горячие), и если вы хотите это сделать, поищите linearsegmentedcolormap, но включенные, вероятно, сейчас подходят. (Но для вашего конкретного вопроса, афаик, вы не можете изменить «горячий», чтобы использовать другой цвет.)
 – 
tom10
8 Окт 2014 в 18:30
Еще раз спасибо. Все вопросы в полном посте и ответы.
 – 
edesz
8 Окт 2014 в 18:36

Это решение работает для меня и намного проще

from PIL import Image
im = Image.open("image.png")
im.convert('L').show()
im.convert('L').save("image.png")

Обратите внимание, что если вы хотите смешивать типы файлов, вы можете (например, .png в .jpg)

0
RandomSqueaker 23 Янв 2020 в 07:40