Как декодировать цветовое сопоставление в Colormap Matplotlib?

Я знаю, как сопоставить число с цветом из этого сообщения: значения карты для цветов в matplotlib

Но я не знаю, как декодировать отображение, чтобы получить свой первоначальный цвет, если предположить, что это сопоставление «один к одному», которое должно быть я фигурирую.

  • Ошибка цветовой схемы Matplotlib с длиной-4 массива
  • Как использовать viridis в matplotlib 1.4
  • Эквивалент Python для Demcmap Matlab (высота +/- соответствующая цветовая палитра)
  • Я кодирую изображение для целей визуализации, но мне нужно иметь возможность декодировать его и читать исходные значения данных.

    Для справки, вот документы Colormap: http://matplotlib.org/api/cm_api.html

    Вот моя попытка ответить на главный ответ ниже, который все еще не работает правильно.

    from PIL import Image import numpy as np import matplotlib import matplotlib.cm as cm values = [670, 894, 582, 103, 786, 348, 972, 718, 356, 692] minima = 103 maxima = 972 norm = matplotlib.colors.Normalize(vmin=minima, vmax=maxima, clip=True) mapper = cm.ScalarMappable(norm=norm, cmap=cm.gist_rainbow_r) c = [] for i in range(10): c.append(mapper.to_rgba(values[i], bytes=True)) print(c) # [(75, 255, 0, 255), (255, 77, 0, 255), (0, 255, 64, 255), (255, 0, 191, 255), (255, 250, 0, 255), (0, 72, 255, 255), (255, 0, 40, 255), (151, 255, 0, 255), (0, 83, 255, 255), (108, 255, 0, 255)] def get_value_from_cm(color, cmap, colrange): # color = matplotlib.colors.to_rgba(color) r = np.linspace(colrange[0], colrange[1], 10) # there are 10 values norm = matplotlib.colors.Normalize(colrange[0], colrange[1]) mapvals = cmap(norm(r))[:, :4] # there are 4 channels: r,g,b,a distance = np.sum((mapvals - color) ** 2, axis=1) return r[np.argmin(distance)] decoded_colors = [] for i in range(10): decoded_colors.append(get_value_from_cm(c[i], cm.gist_rainbow_r, colrange=[minima, maxima])) print(decoded_colors) # [778.88888888888891, 778.88888888888891, 489.22222222222223, 103.0, 778.88888888888891, 392.66666666666669, 103.0, 778.88888888888891, 392.66666666666669, 778.88888888888891] 

  • Как я могу ждать внутри __await__ будущего?
  • Python для разработчиков на C ++
  • Python CSV читатель пропускает 9 заголовков
  • Метод numpy.ma (masked) имеет средние значения несоответствующего типа
  • Python: Pandas Series - Зачем использовать loc?
  • ImportError: Ошибка загрузки DLL: указанная процедура не найдена. питон
  • One Solution collect form web for “Как декодировать цветовое сопоставление в Colormap Matplotlib?”

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

    Следующая функция вернет значение, заданное цветом, цветовой палитрой и диапазоном, по которому была использована цветовая палитра.

     import numpy as np import matplotlib.colors import matplotlib.pyplot as plt def get_value_from_cm(color, cmap, colrange=[0.,1.]): color=matplotlib.colors.to_rgb(color) r = np.linspace(colrange[0],colrange[1], 256) norm = matplotlib.colors.Normalize(colrange[0],colrange[1]) mapvals = cmap(norm(r))[:,:3] distance = np.sum((mapvals - color)**2, axis=1) return r[np.argmin(distance)] b = get_value_from_cm(plt.cm.coolwarm(0.5), plt.cm.coolwarm, [0.,1.]) c = get_value_from_cm(np.array([1,0,0]), plt.cm.coolwarm) print b # 0.501960784314 print plt.cm.coolwarm(b) # (0.86742763508627452, 0.86437659977254899, 0.86260246201960789, 1.0) print plt.cm.coolwarm(0.5) #(0.86742763508627452, 0.86437659977254899, 0.86260246201960789, 1.0) 

    Обратите внимание, что этот метод включает ошибку, поэтому вы получаете только самое близкое значение из цветовой карты, а не значение, которое первоначально использовалось для создания цвета с карты.

    В обновленном коде из вопроса у вас есть цвет, определенный как целые числа от 0 до 255 для каждого канала. Поэтому вам необходимо сначала сопоставить их с диапазоном от 0 до 1.

     from PIL import Image import numpy as np import matplotlib import matplotlib.cm as cm values = [670, 894, 582, 103, 786, 348, 972, 718, 356, 692] minima = 103 maxima = 972 norm = matplotlib.colors.Normalize(vmin=minima, vmax=maxima, clip=True) mapper = cm.ScalarMappable(norm=norm, cmap=cm.gist_rainbow_r) c = [] for i in range(10): c.append(mapper.to_rgba(values[i], bytes=True)) print(c) # [(75, 255, 0, 255), (255, 77, 0, 255), (0, 255, 64, 255), (255, 0, 191, 255), (255, 250, 0, 255), (0, 72, 255, 255), (255, 0, 40, 255), (151, 255, 0, 255), (0, 83, 255, 255), (108, 255, 0, 255)] def get_value_from_cm(color, cmap, colrange): color = np.array(color)/255. r = np.linspace(colrange[0], colrange[1], 256) norm = matplotlib.colors.Normalize(colrange[0], colrange[1]) mapvals = cmap(norm(r))[:, :4] # there are 4 channels: r,g,b,a distance = np.sum((mapvals - color) ** 2, axis=1) return r[np.argmin(distance)] decoded_colors = [] for i in range(10): decoded_colors.append(get_value_from_cm(c[i], cm.gist_rainbow_r, colrange=[minima, maxima])) print(decoded_colors) 
    Python - лучший язык программирования в мире.