python matplotlib colormap

python - ¿Cómo decodificar el mapeo de colores en el mapa de colores de matplotlib?



colormap (1)

Es posible invertir el mapeo de colores, si
(a) conoce el rango de datos que está mapeando y
(b) si conoce el mapa de colores que se ha utilizado, y
(c) si el mapa de colores no es ambiguo.

La siguiente función devolvería el valor dado un color, un mapa de colores y el rango sobre el cual se ha utilizado el mapa de colores.

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)

Tenga en cuenta que este método implica un error, por lo que solo obtiene el valor más cercano del mapa de colores y no el valor que se utilizó inicialmente para crear el color del mapa.

En el código actualizado de la pregunta, tiene el color definido como enteros entre 0 y 255 para cada canal. Por lo tanto, primero debe asignarlos al rango 0 a 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)

Sé cómo asignar un número a un color desde esta publicación: asignar valores a colores en matplotlib

Pero no sé cómo decodificar el mapeo para obtener mi color original, suponiendo que se trata de un mapeo uno a uno, que debo ser.

Estoy codificando una imagen para fines de visualización, pero necesito poder decodificarla y leer los valores de datos originales.

Como referencia, aquí están los documentos de Colormap: http://matplotlib.org/api/cm_api.html

Aquí está mi intento de la respuesta principal a continuación, que todavía no funciona correctamente.

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]