4

我正在尝试在给定三种颜色的 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

然后我会做同样的事情,从零值到极低值。但是我的代码没有给我任何有用的矩阵。有人可以帮助我解决这个问题吗?

4

3 回答 3

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
于 2013-06-24T15:38:18.290 回答
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)平滑。

我相信这正是您正在寻找的。和“看,没有循环!”。

于 2013-06-24T16:01:54.980 回答
1

我会使用 linspace:

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

然后为下一步做同样的事情,并将它们连接起来:

cmap_full = [cmap;cmap2];
于 2013-06-24T15:36:54.830 回答