【问题标题】:How to create a custom colormap programmatically?如何以编程方式创建自定义颜色图?
【发布时间】:2013-06-21 08:33:00
【问题描述】:

我想在 matlab 中创建一个颜色图。 我想根据像素的灰度来淡化颜色。

例如:

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

【问题讨论】:

  • 我想对 colormapeditor 做同样的事情,但我想写一个 matlab 函数。在这种情况下,我可以根据我使用的图像手动更改颜色的阈值。对不起我的英语!

标签: matlab color-mapping


【解决方案1】:

来自docs

颜色图是一个由 0.0 到 1.0 之间的实数组成的 m×3 矩阵。 每行是一个定义一种颜色的 RGB 矢量。第 k 行 colormap 定义第 k 个颜色,其中 map(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;

所以现在让我们使用brown 而不是红色,从该链接获得三元组,将每个颜色分量除以 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(0,t(1),50)你会去linspace(t(1), t_pink(1), 70)
  • 我没有看到你的回复,但我已经做到了。它完美地工作!非常感谢您的帮助
  • 使用interp1 创建地图很聪明!
【解决方案2】:

您也可以使用FEX 中的AdvancedColormap 函数。 如果你需要一个平滑的颜色图,你可以这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多