2013-06-21 21 views
19

Chciałbym utworzyć mapę kolorów w programie MATLAB. Chcę zanikać kolor według szarego poziomu pikseli.Jak programowo utworzyć niestandardowy colormap?

Na przykład

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

Spróbuj colormapeditor: http://www.mathworks.com/help/matlab/ref/colormapeditor.html – Dan

+0

Chciałbym aby zrób to samo z colormapeditor, ale chcę napisać funkcję matlab. W tym przypadku mogę ręcznie zmienić progi dla kolorów zgodnie z używanym obrazem. Przepraszam za mój angielski! – ispanico

Odpowiedz

22

Z docs:

colormap jest macierzą m po 3 liczb rzeczywistych pomiędzy 0,0 i 1,0. Każdy wiersz jest wektorem RGB, który definiuje jeden kolor. Kg wiersza barwy mapy definiuje k-kolor, gdzie mapa (k, :) = [r (k) g (k) b (k)]) określa intensywność czerwieni, zieleni i błękitu.

OK więc zacząć mamy zamiar utworzyć macierz m-by-3, w przypadku gdy m wynosi 161:

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

Teraz chcesz dolna być ciemne (jadę z czarnym) i pięćdziesiąty punkt za brązowy. ale puszczaj z czerwonym jako przykładem, bo łatwiej. Trójki RGB odpowiednio dla czerni i czerwieni: [0,0,0] i [1,0,0]

OK, więc obecnie nasz kolormap jest czarny. Wiemy, że chcemy map(50,:) = [1, 0 ,0], tzn. Czerwony, ale teraz chcemy uzyskać gradient pomiędzy prawymi? Więc pozwala wykorzystanie linspace za to (zauważ, że istnieje lepsza metoda z użyciem interp1 zamiast linspace na końcu tej odpowiedzi):

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

oddanie to na mapie:

map(1:50, 1) = R0to50; 

pozwala więc teraz użyj brown zamiast czerwonego, aby uzyskać potrójny z tego linku, podzielić każdy składnik koloru przez 255, więc nasz potrójny jest t = [101, 67, 33]./255. OK, więc teraz tylko powtórzyć tę procedurę linspace dla każdego koloru:

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; 

A teraz powtórzyć dla każdej z pozostałych węzłów.

Na przykład

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

enter image description here


alternatywa do stosowania raz na kanał linspace indywidualnie i powtórzenie tego dla każdego koloru jest użycie interpolacji liniowej.

Tworzenie się matrycy, gdzie każdy rząd jest kolor potrójne

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 

A teraz, aby wektor, z czym każdy kolor powinien wynosić (tjWektor ten określa odstępy między kolorami, oni nie muszą być regularnie/równo rozmieszczone):

x = [0 
    50 
    120 
    160 
    255]; 

I wreszcie można utworzyć całą mapę z jednego prostego interpolacji:

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

testowania

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

enter image description here

+0

Dziękuję bardzo bardzo przydatne ... ale inne pytanie ... jeśli chcę zanikać brązowy kolor na różowy? – ispanico

+2

Powinieneś być w stanie to rozwiązać na podstawie powyższej odpowiedzi. Ale zamiast 'map (1:50 ...' użyłbyś 'map (51: 120 ...' i zamiast 'linspace (0, t (1), 50)' zrobiłbyś 'linspace (t (1), t_pink (1), 70) 'etc – Dan

+0

Nie odczytałem ci odpowiedzi, ale udało mi się, działa to doskonale! Bardzo dziękuję za pomoc – ispanico

0

Alternatywnie można użyć AdvancedColormap funkcja z FEX. Jeśli potrzebujesz sprawnego colormap, można zrobić to tak:

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