2013-06-21 29 views
19

Tôi muốn tạo bản đồ màu trong MATLAB. Tôi muốn làm mờ màu theo mức độ xám của pixel.Làm cách nào để tạo bản đồ màu tùy chỉnh theo lập trình?

Ví dụ:

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

Thử colormapeditor: http://www.mathworks.com/help/matlab/ref/colormapeditor.html – Dan

+0

tôi muốn đến làm điều tương tự của colormapeditor nhưng tôi muốn viết một funcion matlab. Trong trường hợp này tôi có thể thay đổi bằng tay các ngưỡng cho màu theo hình ảnh tôi đang sử dụng. Xin lỗi vì tiếng Anh của tôi! – ispanico

Trả lời

22

Từ docs:

Một bản đồ màu là một m-by-3 ma trận các số thực giữa 0.0 và 1.0. Mỗi hàng là một vector RGB xác định một màu. Hàng thứ k của màu xác định màu thứ k, trong đó bản đồ (k, :) = [r (k) g (k) b (k)]) chỉ định cường độ của màu đỏ, xanh lục và xanh lam.

OK để bắt đầu chúng ta sẽ tạo ra một m-by-3 ma trận, trong trường hợp của bạn m là 161:

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

Bây giờ bạn muốn phía dưới để được tối (Tôi sẽ với màu đen) và điểm thứ 50 là màu nâu. nhưng cho phép đi với màu đỏ làm ví dụ vì nó dễ dàng hơn. Bộ ba RGB cho màu đen và đỏ tương ứng: [0,0,0][1,0,0]

OK vậy hiện tại bản đồ màu của chúng tôi là màu đen. Chúng tôi biết chúng tôi muốn map(50,:) = [1, 0 ,0] tức là màu đỏ nhưng bây giờ chúng tôi muốn có độ dốc ở giữa phải không? Vì vậy, cho phép sử dụng linspace cho điều này (lưu ý rằng có một phương pháp tốt hơn sử dụng interp1 thay vì linspace ở phần cuối của câu trả lời này):

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

đặt này trong bản đồ:

map(1:50, 1) = R0to50; 

Vì vậy, bây giờ cho phép sử dụng brown thay vì màu đỏ, để nhận được gấp ba từ liên kết đó chia từng thành phần màu cho 255 để số ba của chúng tôi là t = [101, 67, 33]./255. OK nên bây giờ, chỉ cần lặp lại quy trình khoảng trống đó cho mỗi màu:

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; 

Và bây giờ lặp lại cho mỗi nút khác của bạn.

Ví dụ:

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

enter image description here


Một thay thế cho việc sử dụng linspace một lần cho mỗi kênh riêng và lặp đi lặp lại điều này cho mỗi màu là sử dụng phép nội suy tuyến tính.

Tạo một ma trận mà mỗi hàng là một màu ba

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 

Và bây giờ làm cho một vector của những gì phạm vi mỗi màu nên có (ví dụ:vector này xác định khoảng cách của các màu sắc, họ không cần phải được thường xuyên/cách đều nhau):

x = [0 
    50 
    120 
    160 
    255]; 

Và cuối cùng bạn có thể tạo bản đồ toàn bộ với một suy đơn giản:

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

thử nghiệm

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

enter image description here

+0

Cảm ơn bạn rất nhiều rất hữu ích ... nhưng một câu hỏi khác ... nếu tôi muốn phai màu nâu thành màu hồng? – ispanico

+2

Bạn có thể làm việc đó dựa trên câu trả lời ở trên. Nhưng thay vì 'map (1:50 ...' bạn sẽ sử dụng 'map (51: 120 ...' và thay vì 'linspace (0, t (1), 50)' bạn sẽ đi 'linspace (t (1), t_pink (1), 70) 'etc – Dan

+0

Tôi không đọc bạn trả lời, nhưng tôi đã làm điều đó. Nó hoạt động hoàn hảo! Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn – ispanico

0

Hoặc bạn có thể sử dụngChức năngtừ FEX. Nếu bạn cần một bản đồ màu trơn, bạn có thể làm điều đó như thế này:

map = AdvancedColormap('kbpw',256,[0 50 120 255]/255); 
Các vấn đề liên quan