Mad*_*ist 3 matlab matlab-figure colormap
如果我调用colormap('jet'),我将得到一个 256×3 的矩阵,其颜色为jet。如果我这样做jet(1000),我可以获得更密集的采样等价物。我碰巧需要更密集采样的颜色图,但对于任意命名的颜色图。如何按名称获取具有可变数量元素的颜色图。
我已经考虑过类似eval(sprintf('%s(%d)', name, num)), where egname = 'parula'和 的东西num = 1000,但这带来了 , 固有的所有问题eval,我想避免使用它,因为我确信有一种方法可以按名称访问颜色映射函数。
为了避免XY问题,这是我的背景信息:
我正在尝试将伽马校正应用于索引图像。我无法[0, 1]使用imadjust. 另外,我想显示一个带有映射到正确值的图像的颜色条。为此,我通过使用反向伽马函数将其更高密度版本重新采样到所需范围来调整颜色图:
function imdisp(img, cmap, gamma)
density = 1000; % not really a good name, but w/e
x = linspace(0, 1, 10 * density);
y = x.^(1 / gamma);
z = linspace(0, 1, density);
ind = round(interp1(y, x, z, 'nearest', 'extrap') * (10 * density - 1) + 1);
% this is the problem line
colors = eval(sprintf('%s(%d)', cmap, 10 * density));
colors = colors(ind);
imshow(img, []);
colormap(colors);
colorbar();
end
Run Code Online (Sandbox Code Playgroud)
如果有更好的方法可以完全做到这一点,请随时发布而不是直接回答。
这feval是为了:
colors = feval(cmap, 10 * density);
Run Code Online (Sandbox Code Playgroud)
feval不像 那样危险eval,因为它不执行任意代码,但它可以执行任意函数,因此仍应谨慎使用。它也不允许 JIT 提前知道将调用什么函数,因此存在额外的开销。另一方面,您不需要为随后必须再次解析的参数创建字符串。
考虑在您的函数中接受一个函数句柄:将其调用为imdisp(img, @jet, gamma). 现在你的cmap变量是一个功能,您可以拨打:cmap(10 * density)。