如何通过编程创建自定义颜色映射表?

22

我想在Matlab中创建一个颜色地图。我希望根据像素的灰度级别来淡化颜色。

例如:

from 255 to 160 -> white 
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark

1
尝试使用colormapeditor:http://www.mathworks.com/help/matlab/ref/colormapeditor.html - Dan
我想做colormapeditor的同样事情,但我想写一个Matlab函数。在这种情况下,我能够根据我正在使用的图像手动更改颜色的阈值。对于我的英语表示歉意! - ispanico
2个回答

27

根据文档

颜色映射是一个m×3的实数矩阵,其值介于0.0到1.0之间。 每一行都是一个RGB向量,定义了一种颜色。第k行的颜色由map(k,:) = [r(k) g(k) b(k)]指定, 其中r(k),g(k)和b(k)分别表示红、绿和蓝的强度。

好的,现在我们要创建一个m×3的矩阵,对于你的情况,m为161:

m = 161;
map = zeros(m , 3);

现在您希望底部是黑色(我选择黑色),第50个点是棕色。但我们以红色为例,因为它更容易。黑色和红色的RGB三元组分别为:[0,0,0][1,0,0]

好的,所以目前我们整个的色图都是黑色的。我们知道我们想要map(50,:) = [1, 0 ,0]即红色,但现在我们想要之间的渐变,对吧?因此,让我们使用linspace来实现这一点(请注意,在此答案的末尾使用interp1而不是linspace有更好的方法):

R0to50 = linspace(0,1,50)';

把这个放入地图中:
map(1:50, 1) = R0to50;

现在我们使用 棕色 代替红色,从链接中获取三元组,将每个颜色分量除以255,得到我们的三元组为t = [101, 67, 33]./255。好的,现在对每种颜色重复这个linspace过程:

R = linspace(0,t(1),50);
G = linspace(0,t(2),50);
B = linspace(0,t(3),50);

T = [R', G', B'];

map(1:50, :) = T;

现在,对于您的其他节点,请重复上述步骤。

例如:

I = linspace(0,1,161);
imagesc(I(:, ones(10)))
colormap(map)

使用线性插值是一种替代方案,可以避免每个通道单独使用 linspace 并针对每种颜色重复此操作。

创建一个矩阵,其中每行都是一个颜色三元组。

T = [0,   0,   0          %// dark
     101, 67,  33         %// brown
     255, 105, 180        %// pink
     255, 255, 255        %// white
     255, 255, 255]./255; %// white again  -> note that this means values between 161 and 255 will be indistinguishable

现在创建一个向量,定义每种颜色所处的范围(即此向量定义颜色的间距,它们不必是正则/等间隔的):

x = [0
     50
     120
     160
     255];

最后,您可以通过简单的插值创建整个地图:
map = interp1(x/255,T,linspace(0,1,255));

测试

I = linspace(0,1,255);
imagesc(I(ones(1,10),:)')
colormap(map)

enter image description here


非常感谢,非常有用...但是还有一个问题...如果我想将棕色渐变为粉色怎么办? - ispanico
2
你应该能够根据上面的答案解决这个问题。但是,你需要使用 map(51:120...) 替换 map(1:50...),并且需要使用 linspace(t(1), t_pink(1), 70) 替换 linspace(0,t(1),50) 等等。 - Dan
我没有看到你的回复,但是我已经做完了。它工作得非常好!非常感谢你的帮助。 - ispanico
使用 interp1 创建地图非常聪明! - Some Guy

0

或者您可以使用FEX中的AdvancedColormap函数。 如果您需要一个平滑的颜色映射,可以这样做:

map = AdvancedColormap('kbpw',256,[0 50 120 255]/255);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接