MATLAB: создание цветовой карты с тремя цветами
Я пытаюсь сгенерировать цветовую карту в MATLAB, используя три цвета: высокий экстремум, ноль и низкий экстремум. Мой мыслительный процесс состоял в том, чтобы проходить от верхнего крайнего значения к середине и сохранять каждый шаг в матрице 3xN (первый столбец - R, второй - G, а третий - B). Итак, я использую:
%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
Затем я сделал бы то же самое, переходя от нулевого значения к низкому экстремуму. Однако мой код не дает мне никакой полезной матрицы. Сможет ли кто-нибудь помочь мне с этим?
3 ответа
Вы можете использовать линейную интерполяцию, чтобы расширить цвет
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
Вдохновленный ответом @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 в карту цветов).
Я считаю, что это именно то, что вы ищете. И "смотри, ма, петель нет!"
Я бы использовал linspace:
cmap=[linspace(oldRed,newRed,steps)' ...
linspace(oldGreen,newGreen,steps)' ...
linspace(oldBlue,newBlue,steps)'];
Затем сделайте то же самое для следующего шага и объедините их:
cmap_full = [cmap;cmap2];