matlab - pcolor - ¿Cómo crear un mapa de color personalizado programáticamente?
pcolor matlab (2)
Me gustaría crear un mapa de colores en matlab. Quiero atenuar el color de acuerdo con el nivel de píxel gris.
Por ejemplo:
from 255 to 160 -> white
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
Alternativamente, puede usar la función AdvancedColormap
desde FEX . Si necesita un mapa de colores uniforme, puede hacerlo así:
map = AdvancedColormap(''kbpw'',256,[0 50 120 255]/255);
De los documentos :
Un mapa de color es una matriz de números reales de 0,0 a 1,0. Cada fila es un vector RGB que define un color. La fila k del mapa de colores define el color kth, donde map (k, :) = [r (k) g (k) b (k)]) especifica la intensidad de rojo, verde y azul.
De acuerdo, entonces para comenzar vamos a crear una matriz m-por-3, en su caso m es 161:
m = 161;
map = zeros(m , 3);
Ahora quiere que el fondo esté oscuro (voy con negro) y que el 50 sea marrón. pero vamos con rojo como ejemplo, ya que es más fácil. RGB triplica para negro y rojo, respectivamente: [0,0,0]
y [1,0,0]
De acuerdo, actualmente nuestro mapa de colores enitre es negro. Sabemos que queremos un map(50,:) = [1, 0 ,0]
es decir, rojo, pero ahora queremos un degradado entre ¿verdad? Así que usemos linspace para esto (tenga en cuenta que hay un método mejor al usar interp1
lugar de linspace
al final de esta respuesta):
R0to50 = linspace(0,1,50)'';
poner esto en el mapa:
map(1:50, 1) = R0to50;
Así que ahora vamos a usar marrón en lugar de rojo, para obtener el triple de ese enlace dividir cada componente de color por 255, por lo que nuestro triple es t = [101, 67, 33]./255
. OK, ahora solo repita ese procedimiento linspace para cada color:
R = linspace(0,t(1),50);
G = linspace(0,t(2),50);
B = linspace(0,t(3),50);
T = [R'', G'', B''];
map(1:50, :) = T;
Y ahora repite para cada uno de tus otros nodos.
Por ejemplo:
I = linspace(0,1,161);
imagesc(I(:, ones(10)))
colormap(map)
Una alternativa al uso de linspace
una vez por canal individualmente y repetir esto para cada color es usar interpolación lineal.
Crea una matriz donde cada fila es un color triple
T = [0, 0, 0 %// dark
101, 67, 33 %// brown
255, 105, 180 %// pink
255, 255, 255 %// white
255, 255, 255]./255; %// white again -> note that this means values between 161 and 255 will be indistinguishable
Y ahora haga un vector de qué rango debe ser cada color (es decir, este vector define el espaciado de los colores, no es necesario que estén espaciados de manera regular / equitativa):
x = [0
50
120
160
255];
Y finalmente puedes crear todo el mapa con una simple interpolación:
map = interp1(x/255,T,linspace(0,1,255));
pruebas
I = linspace(0,1,255);
imagesc(I(ones(1,10),:)'')
colormap(map)