web-dev-qa-db-fra.com

Comment créer une palette de couleurs personnalisée par programme?

Je voudrais créer une palette de couleurs dans matlab. Je veux estomper la couleur en fonction du niveau de gris du pixel.

Par exemple:

from 255 to 160 -> white 
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
20
ispanico

De la docs :

Une palette de couleurs est une matrice m-par-3 de nombres réels compris entre 0,0 et 1,0. Chaque ligne est un vecteur RVB qui définit une couleur. La kième ligne de la palette de couleurs définit la kième couleur, où map (k, :) = [r (k) g(k) b (k)]) spécifie l'intensité du rouge, du vert et bleu.

OK donc pour commencer nous allons créer une matrice m-par-3, dans votre cas m est 161:

m = 161;
map = zeros(m , 3);

Maintenant, vous voulez que le fond soit sombre (je vais avec du noir) et le 50e point soit marron. mais laisse aller avec le rouge comme exemple car c'est plus facile. RVB triple respectivement pour le noir et le rouge: [0,0,0] Et [1,0,0]

OK donc actuellement notre palette de couleurs enitre est noire. Nous savons que nous voulons map(50,:) = [1, 0 ,0] c'est-à-dire rouge mais maintenant nous voulons un dégradé entre les deux à droite? Permet donc d'utiliser linspace pour cela (notez qu'il existe une meilleure méthode en utilisant interp1 Au lieu de linspace à la fin de cette réponse):

R0to50 = linspace(0,1,50)';

mettre cela dans la carte:

map(1:50, 1) = R0to50;

Alors maintenant, utilisons marron au lieu du rouge, pour obtenir le triple de ce lien, divisez chaque composant de couleur par 255, de sorte que notre triple est t = [101, 67, 33]./255. OK alors répétez maintenant cette procédure linspace pour chaque couleur:

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;

Et maintenant, répétez pour chacun de vos autres nœuds.

Par exemple:

I = linspace(0,1,161);
imagesc(I(:, ones(10)))
colormap(map)

enter image description here


Une alternative à l'utilisation de linspace une fois par canal individuellement et en répétant cela pour chaque couleur est d'utiliser l'interpolation linéaire.

Créez une matrice où chaque ligne est un triple de couleur

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

Et maintenant, faites un vecteur de la plage de chaque couleur (c'est-à-dire que ce vecteur définit l'espacement des couleurs, elles n'ont pas besoin d'être régulièrement/également espacées):

x = [0
     50
     120
     160
     255];

Et enfin, vous pouvez créer la carte entière avec une simple interpolation:

map = interp1(x/255,T,linspace(0,1,255));

essai

I = linspace(0,1,255);
imagesc(I(ones(1,10),:)')
colormap(map)

enter image description here

23
Dan

Vous pouvez également utiliser la fonction AdvancedColormap de FEX . Si vous avez besoin d'une palette de couleurs lisse, vous pouvez le faire comme ceci:

map = AdvancedColormap('kbpw',256,[0 50 120 255]/255);
0
anandr