具有自定义元素数量的 MATLAB 命名颜色图
MATLAB named colormap with custom number of elements
如果我调用 colormap('jet')
,我将得到一个颜色为 jet
的 256×3 矩阵。如果我这样做 jet(1000)
,我可以获得更密集的采样等效值。我碰巧需要更密集的采样颜色图,但对于任意命名的颜色图。如何按名称获取包含可变数量元素的颜色图。
我考虑过 eval(sprintf('%s(%d)', name, num))
之类的东西,例如name = 'parula'
和 num = 1000
,但这带有 eval
固有的所有问题,我想避免使用它,因为我确信有一种方法可以通过名称访问颜色图函数。
为避免 X-Y 问题,这是我的背景信息:
我正在尝试对索引图像应用伽马校正。我无法使用 imadjust
映射 [0, 1]
之外的范围。另外,我想显示一个带有映射到正确值的图像的颜色条。为此,我正在通过使用反转伽马函数将更高密度版本的颜色图重新采样到所需范围来调整颜色图:
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
如果有更好的方法完全做到这一点,请随时post而不是直接回答。
这就是 feval
的用途:
colors = feval(cmap, 10 * density);
feval
没有 eval
危险,因为它不执行任意代码,但它可以执行任意函数,因此仍应谨慎使用。它还不允许 JIT 提前知道将调用什么函数,因此会产生额外的开销。另一方面,您不需要为必须再次解析的参数创建一个字符串。
考虑在您的函数中接受函数句柄:将其称为 imdisp(img, @jet, gamma)
。现在你的 cmap
变量是一个你可以调用的函数:cmap(10 * density)
.
如果我调用 colormap('jet')
,我将得到一个颜色为 jet
的 256×3 矩阵。如果我这样做 jet(1000)
,我可以获得更密集的采样等效值。我碰巧需要更密集的采样颜色图,但对于任意命名的颜色图。如何按名称获取包含可变数量元素的颜色图。
我考虑过 eval(sprintf('%s(%d)', name, num))
之类的东西,例如name = 'parula'
和 num = 1000
,但这带有 eval
固有的所有问题,我想避免使用它,因为我确信有一种方法可以通过名称访问颜色图函数。
为避免 X-Y 问题,这是我的背景信息:
我正在尝试对索引图像应用伽马校正。我无法使用 imadjust
映射 [0, 1]
之外的范围。另外,我想显示一个带有映射到正确值的图像的颜色条。为此,我正在通过使用反转伽马函数将更高密度版本的颜色图重新采样到所需范围来调整颜色图:
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
如果有更好的方法完全做到这一点,请随时post而不是直接回答。
这就是 feval
的用途:
colors = feval(cmap, 10 * density);
feval
没有 eval
危险,因为它不执行任意代码,但它可以执行任意函数,因此仍应谨慎使用。它还不允许 JIT 提前知道将调用什么函数,因此会产生额外的开销。另一方面,您不需要为必须再次解析的参数创建一个字符串。
考虑在您的函数中接受函数句柄:将其称为 imdisp(img, @jet, gamma)
。现在你的 cmap
变量是一个你可以调用的函数:cmap(10 * density)
.