2013-06-24 36 views
4

我試圖給出產生三種顏色在MATLAB一個顏色表,高極端,零和低極致色彩表。我的思維過程是從高端循環到中間,並將每一步存儲爲3xN(第一列是R,第二列是G,第三列是B)矩陣。所以我使用:MATLAB:生成給出三種顏色

%fade from high to zero 
oldRed=high(1); 
oldGreen=high(2); 
oldBlue=high(3); 
newRed=mid(1); 
newGreen=mid(2); 
newBlue=mid(3); 

currentRed=oldRed; currentGreen=oldGreen; currentBlue=oldBlue; 
for x=1:steps 
    currentRed=oldRed+((x*(newRed-oldRed))/(steps-1)); 
    currentGreen=oldGreen+((x*(newRed-oldRed))/(steps-1)); 
    currentBlue=oldBlue+((x*(newRed-oldRed))/(steps-1)); 
    cmap=[cmap;[currentRed currentGreen currentBlue]]; 
end 

然後我會做從零值要低極端同樣的事情。但是我的代碼並沒有給我任何有用的矩陣。有人能夠幫我解決這個問題嗎?

+1

首先,爲什麼要用循環時,您可以使用逐元素的算術? –

+0

我不確定你的意思。我可以使用什麼算術表達式在顏色之間淡化? – Sam

+0

使用'linspace'或'colon'運算符(':')。您在循環中執行的所有操作都可以使用矢量化表達式在沒有循環的情況下重寫。 –

回答

5

可以使用線性插值來擴大色

nCol = 256; % number of colors for the resulting map 
cmap = zeros(nCol, 3); % pre-allocate 
xi = linspace(0, 1, nCols); 
for ci=1:3 % for each channel 
    cmap(:,ci) = interp1([0 .5 1], [low(ci) mid(ci) high(ci)], xi)'; 
end 
+1

非常及時的問答,我在早上閱讀這個問題,然後今天下午我不得不生成一些新的顏色映射。我對這個解決方案做出的一個改變是稍微擴展它來處理任意數量的控制點,通過ControlPoints = [r1 b1 g1; r2 b2 g2; <...>; rn bn gn]/255'代表n個點,rn/gn/bn用實際數字代替。然後'[m,〜] = size(ControlPoints);'和'zi =(0:m-1)/(m-1);'。然後可以將'zi'和'ControlPonts(:,ci)'插入倒數第二行。這樣,我可以預先設置一個「switch ... case」塊來定義多個地圖。 – craigim

+0

@craigim很高興我的解決方案爲您提供幫助。 – Shai

+0

對不起,花了這麼長時間回覆。謝謝!這正是我尋找的解決方案! – Sam

1

我會用linspace:

cmap=[linspace(oldRed,newRed,steps)' ... 
linspace(oldGreen,newGreen,steps)' ... 
linspace(oldBlue,newBlue,steps)']; 

然後爲下一步做同樣的,並且將它們連接起來:

cmap_full = [cmap;cmap2]; 
+0

那中間的顏色'mid'呢? – Shai

+0

添加它,因爲你發佈了更好的答案。 –

3

受@ Shai的回答啓發,這裏是他的解決方案的一個小小的轉折(我更喜歡 - 它更靈活,並避免使用for循環)。

你想要的形式是cmap是一個nx3數組。此外,你說你有三種顏色可以代表曲線上的三個「斷點」。這尖叫「插值」!

% set the "breakpoints" for the color curve: 
lowValue = 0; 
midValue = 128; 
highValue = 255; 

% pick "any" three colors to correspond to the breakpoints: 
lowColor = [255 0 0]; 
midColor = [40 40 40]; 
highColor = [0 255 255]; 

% create the colormap: 
myMap = interp1([lowValue midValue highValue], ... 
    [lowColor; midColor; highColor]/255, ... 
    linspace(lowValue, highValue, 256)); 

這確保了與256點的色彩,順利從lowColor在最低值(索引1到顏色映射),以highColor在最高值(索引255到顏色映射)的映射圖。

我相信這是你在尋找什麼。 「看,媽媽,沒有循環!」。