我想在Matlab中创建一个颜色地图。我希望根据像素的灰度级别来淡化颜色。
例如:
from 255 to 160 -> white
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
我想在Matlab中创建一个颜色地图。我希望根据像素的灰度级别来淡化颜色。
例如:
from 255 to 160 -> white
from 159 to 120 -> pink
from 119 to 50 -> brown
from 49 to 0 -> dark
根据文档:
颜色映射是一个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)
map(51:120...)
替换 map(1:50...)
,并且需要使用 linspace(t(1), t_pink(1), 70)
替换 linspace(0,t(1),50)
等等。 - Daninterp1
创建地图非常聪明! - Some Guy或者您可以使用FEX中的AdvancedColormap
函数。
如果您需要一个平滑的颜色映射,可以这样做:
map = AdvancedColormap('kbpw',256,[0 50 120 255]/255);