MATLAB:生成给定三种颜色的颜色贴图
我试图在MATLAB中生成一个给定三种颜色的颜色映射,一种是高极限,一种是零极限,另一种是低极限。我的思维过程是从最高点循环到中间点,并将每个步骤存储到一个3xN(第一列是R,第二列是G,第三列是B)矩阵。所以我使用:MATLAB:生成给定三种颜色的颜色贴图,matlab,image-processing,colors,Matlab,Image Processing,Colors,我试图在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=oldRe
%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
然后我会做同样的事情,从零值到低极值。然而,我的代码并没有给我任何有用的矩阵。有人能帮我解决这个问题吗?我会使用linspace:
cmap=[linspace(oldRed,newRed,steps)' ...
linspace(oldGreen,newGreen,steps)' ...
linspace(oldBlue,newBlue,steps)'];
然后对下一步执行相同的操作,并将它们连接起来:
cmap_full = [cmap;cmap2];
可以使用线性插值来展开颜色
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阵列。进一步说,有三种颜色要表示曲线上的三个“断点”。这叫“插值”
这确保了具有256种颜色的贴图从最低值的lowColor
(索引1进入颜色贴图)平滑过渡到最高值的highColor
(索引255进入颜色贴图)
我相信这正是你想要的。还有“看,妈妈,没有回路!” 首先,既然可以使用元素算术,为什么还要使用循环呢?我不知道你的意思。我可以使用什么算术表达式在颜色之间淡入淡出?使用
linspace
或colon
运算符(:
)。你在循环中所做的每件事都可以使用矢量化表达式在没有循环的情况下重写。中间颜色mid
?在你发布更好的答案时添加了它。非常及时的问答,因为我早上读了这个问题,下午我不得不生成一些新的颜色贴图。我对该解决方案所做的一个更改是将其稍加扩展以处理任意数量的控制点,方法是将n个点的控制点ControlPoints=[r1 b1 g1;r2 b2 g2;rn bn gn]/255
替换为实际数。然后[m,~]=大小(控制点)代码>和zi=(0:m-1)/(m-1)代码>。然后可以将zi
和ControlPonts(:,ci)
插入到最后一行的下一行。这样,我就可以预先设置一个开关…case
块来定义多个地图。@craigim很高兴我的解决方案帮助了您。很抱歉,我花了这么长时间才做出响应。非常感谢。这正是我一直在寻找的解决方案!
% 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));