具有自定义元素数量的 MATLAB 命名颜色图

标签 matlab matlab-figure colormap

如果我调用 colormap('jet'),我将得到一个 256×3 的矩阵,其颜色为 jet。如果我执行 jet(1000),我可以获得更密集的采样等效项。我碰巧需要更密集的采样颜色图,但对于任意命名的颜色图。如何通过名称获取包含可变数量元素的颜色图。

我考虑过像 eval(sprintf('%s(%d)', name, num)) 这样的东西,例如name = 'parula'num = 1000,但这带有 eval 固有的所有问题,我想避免使用它,因为我确信有一种方法可以按名称访问颜色图函数。

为了避免 X-Y 问题,这里是我的背景信息:

我正在尝试对索引图像应用 Gamma 校正。我无法使用 imadjust 映射 [0, 1] 之外的范围。另外,我想显示一个带有映射到正确值的图像的颜色条。为此,我通过使用反转 Gamma 函数将更高密度版本的颜色图重新采样到所需范围来调整颜色图:

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

如果有更好的方法来完全做到这一点,请随时发布而不是直接回答。

最佳答案

这就是feval用于:

colors = feval(cmap, 10 * density);

feval 不像 eval 那样危险,因为它不执行任意代码,但它可以执行任意函数,因此仍应谨慎使用。它还不允许 JIT 提前知道将调用什么函数,因此会产生额外的开销。另一方面,您不需要为必须再次解析的参数创建一个字符串。

考虑在您的函数中接受函数句柄:将其称为 imdisp(img, @jet, gamma)。现在您的 cmap 变量是一个您可以调用的函数:cmap(10 * density)

关于具有自定义元素数量的 MATLAB 命名颜色图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62162875/

相关文章:

matlab - 使用accumarray进行矢量化

matlab - 对从 Matlab 编译器运行时返回的 mxArray 对象调用 mxDestroyArray

matlab - 如何阻止关闭动画后图形反复弹出

MATLAB quiver3 色彩图

matlab - 在Matlab中加速提取的音频

matlab - 如何在 MATLAB 中删除轴

matlab - 如何在 MATLAB 中通过 ROI 放大图像

python - pyplot TwoSlopeNorm LinearSegmentedColormap 中零值的唯一颜色

当使用 mpl_toolkits.axisartist.subplot 的紧凑布局时,matplotlib 颜色条会在正确的尺寸上创建一个大的空间

arrays - 计算 Matlab 中向量中包含少于 3 个连续零的元素