为了账号安全,请及时绑定邮箱和手机立即绑定

如何以编程方式创建自定义色彩映射?

如何以编程方式创建自定义色彩映射?

浮云间 2019-08-28 10:49:01
如何以编程方式创建自定义色彩映射?我想在matlab中创建一个色彩映射表。我想根据像素的灰度级淡化颜色。例如:from 255 to 160 -> white from 159 to 120 -> pinkfrom 119 to 50 -> brownfrom 49 to 0 -> dark
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

来自文档

色图是m到3的实数矩阵,介于0.0和1.0之间。每行是定义一种颜色的RGB矢量。色图的第k行定义第k个颜色,其中map(k,:) = [r(k)g(k)b(k)])指定红色,绿色和蓝色的强度。

好的,首先我们要创建一个m-by-3矩阵,在你的情况下,m是161:

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

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

好的,目前我们的enitre色彩图是黑色的。我们知道我们想要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)


查看完整回答
反对 回复 2019-08-28
?
慕容森

TA贡献1853条经验 获得超18个赞

或者,您可以使用FEX的AdvancedColormap功能。如果您需要平滑的色彩映射,可以这样做:

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


查看完整回答
反对 回复 2019-08-28
  • 2 回答
  • 0 关注
  • 575 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信