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
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)
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)
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);