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];
Другие вопросы по тегам