isp*_*ico 20 matlab color-mapping
我想在matlab中创建一个色彩映射表.我想根据像素的灰度级淡化颜色.
例如:
from 255 to 160 -> white
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
Run Code Online (Sandbox Code Playgroud)
Dan*_*Dan 24
来自文档:
色图是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);
Run Code Online (Sandbox Code Playgroud)
现在你希望底部是黑暗的(我要用黑色),第50点是棕色的.但是让我们以红色为例,因为它更容易.分别为黑色和红色的RGB三元组:[0,0,0]和[1,0,0]
好的,目前我们的enitre色彩图是黑色的.我们知道我们想要map(50,:) = [1, 0 ,0]红色,但现在我们想要一个正确的渐变?所以让我们使用linspace(注意有一个更好的方法,interp1而不是linspace在这个答案的最后):
R0to50 = linspace(0,1,50)';
Run Code Online (Sandbox Code Playgroud)
把它放在地图上:
map(1:50, 1) = R0to50;
Run Code Online (Sandbox Code Playgroud)
因此,现在让我们使用棕色而不是红色,从该链接获得三元组将每个颜色分量除以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;
Run Code Online (Sandbox Code Playgroud)
现在重复每个其他节点.
例如:
I = linspace(0,1,161);
imagesc(I(:, ones(10)))
colormap(map)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
现在制作一个每种颜色应该在哪个范围内的矢量(即这个矢量定义了颜色的间距,它们不需要定期/等间距):
x = [0
50
120
160
255];
Run Code Online (Sandbox Code Playgroud)
最后,您可以使用一个简单的插值创建整个地图:
map = interp1(x/255,T,linspace(0,1,255));
Run Code Online (Sandbox Code Playgroud)
测试
I = linspace(0,1,255);
imagesc(I(ones(1,10),:)')
colormap(map)
Run Code Online (Sandbox Code Playgroud)
