2013-06-21 23 views
19

Ich möchte eine Colormap in Matlab erstellen. Ich möchte die Farbe entsprechend der Graustufe des Pixels verblassen.Wie erstellt man programmgesteuert eine benutzerdefinierte Farbpalette?

Zum Beispiel:

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

Versuchen Sie, die colormapeditor: http://www.mathworks.com/help/matlab/ref/colormapeditor.html – Dan

+0

I d‘wie zu mache dasselbe mit colormapeditor, aber ich möchte eine Matlab-Funktion schreiben. In diesem Fall bin ich in der Lage, die Schwellenwerte für die Farben entsprechend Bild, das ich verwende, manuell zu ändern. Entschuldigung für mein Englisch! – ispanico

Antwort

22

Vom docs:

A colormap ist eine m-mal-3-Matrix von reellen Zahlen zwischen 0,0 und 1,0. Jede Zeile ist ein RGB-Vektor, der eine Farbe definiert. Die k-te Zeile der Colormap definiert die k-te Farbe, wobei map (k, :) = [r (k) g (k) b (k)]) die Intensität von Rot, Grün und Blau angibt.

OK so beginnen wir eine m-mal-3-Matrix, in Ihrem Fall m schaffen werden, ist 161:

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

Jetzt wollen Sie die Unterseite dunkel zu sein (Ich werde mit Schwarz) und der 50. Punkt ist braun. aber lass uns mit rot als Beispiel gehen, da es einfacher ist. RGB-Tripel für Schwarz bzw. Rot: [0,0,0] und [1,0,0]

OK also momentan ist unsere entire colormap schwarz. Wir wissen, wir wollen map(50,:) = [1, 0 ,0], d. H. Rot, aber jetzt wollen wir einen Gradienten zwischen rechts? So verwenden linspace hierfür können (beachten Sie, dass es eine bessere Methode ist interp1 anstelle von linspace am Ende dieser Antwort):

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

dies in der Karte setzen:

map(1:50, 1) = R0to50; 

So, jetzt können Verwenden Sie brown anstelle von rot, um das Tripel von diesem Link zu erhalten, teilen Sie jede Farbkomponente durch 255, so ist unser Triple t = [101, 67, 33]./255. OK so jetzt nur wiederholen, dass linspace Prozedur für jede Farbe:

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; 

Und nun für jede Ihrer anderen Knoten wiederholen.

Zum Beispiel:

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

enter image description here


Eine Alternative zur Verwendung linspace einmal pro Kanal einzeln und dies für jede Farbe zu wiederholen ist, eine lineare Interpolation zu verwenden.

eine Matrix erstellen, wobei jede Zeile eine Farb

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 

Und jetzt triple

einen Vektor aus, was Range jede Farbe auf sein sollte machen (d.h.dieser Vektor definiert den Abstand der Farben, die sie benötigen, nicht regelmäßig/gleichem Abstand zu sein):

x = [0 
    50 
    120 
    160 
    255]; 

Und schließlich können Sie die gesamte Karte mit einer einfachen Interpolation erstellen:

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

Prüfung

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

enter image description here

+0

Vielen Dank sehr nützlich ... aber eine andere Frage ... wenn ich die braune Farbe zu rosa Farbe verblassen lassen möchte? – ispanico

+2

Sie sollten in der Lage sein, das anhand der obigen Antwort zu bearbeiten. Aber anstatt 'map' (1:50 ...' würde man 'map (51: 120 ...') verwenden und statt 'linspace (0, t (1), 50) 'würde man' linspace (t (1), t_pink (1), 70) 'etc – Dan

+0

Ich habe dich nicht gelesen Antwort, aber ich habe das. Es funktioniert perfekt! Vielen Dank für Ihre Hilfe – ispanico

0

Alternativ können SieverwendenFunktion von FEX. Wenn Sie eine glatte colormap benötigen, können Sie es wie folgt tun:

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