9

我经常想绘制一张从某个负数到某个正数的差异图像。问题在于matlab的颜色图仅从最小值缩放到最大值,但不关心一些中间值(本例为零)。例如,我制作了peaks一个像素不同的图像:

在此处输入图像描述

原来的样子是这样的:

在此处输入图像描述

所以零值在顶部图像为蓝色,在底部为绿色......(以 jet colormap 为例)

我想构建一个颜色图,无论最小\最大值是什么,它都会自动将零值表示为相同的颜色。我怎样才能做到这一点?

4

3 回答 3

9

可以使用caxis函数(设置CLim当前坐标区对象的属性)来控制颜色映射。当然,假设是使用缩放的颜色映射,而不是直接颜色映射(读取CDataMapping属性)。通过使用以零为中心的范围作为输入,您可以确保零始终位于中间。

这是一个例子:

load penny
P = 4*(P./255) - 1;        %# not centered around zero
imagesc(P), axis image off
colormap(lbmap(64,'BrownBlue')), colorbar

skewed_range

现在我们调整颜色映射以使其围绕零对称:

c = max(abs([min(P(:)),max(P(:))]));
caxis([-c c])

对称范围

请注意,我使用的是Light Bartlein 配色方案,该配色方案被设计为一个发散的调色板,以突出两个极端之间的差异。

如果原始范围非常偏斜,您可能需要重新采样颜色图以在过度拉伸的子范围中为其提供更多值。

于 2013-05-27T23:38:28.830 回答
4

您可以 从 FEX使用此工具。它生成蓝白红颜色图,零总是对应于白色。对于您想要包含两种以上颜色的情况,请深入研究代码并根据您的需要进行调整。

FEX 中还有更多选项可以做类似的事情(这里有一个另一个)...... 在此处输入图像描述

于 2013-05-27T22:45:03.673 回答
3

我喜欢其他答案,尤其是@Amro 的答案。但它看起来很复杂:) 你的caxis参数不需要依赖于你的输入,你可以简单地从轴上抓取它们。所有这些都可以是单行的:

a = gca; % or whatever you use to access your axis handle
a.CLim = max(abs(a.CLim)) * [-1 1];

而已。这适用于 MATLAB R2014b 及更高版本,它具有新的图形处理系统(在此处查看更多详细信息)。在早期版本(以及新版本,如果您愿意)中,您可以使用

a = gca; % or whatever you use to access your axis handle
set(a, 'CLim', max(abs(get(a, 'CLim'))) * [-1 1]);

或者,使用caxis

a = gca; % or whatever you use to access your axis handle
caxis(a, max(abs(caxis(a))) * [-1 1]);

自动化这也相当容易:

a = gca; % or whatever you use to access your axis handle
addlistener(a, 'CLimMode', 'PostSet', @(h, e) caxis(e.AffectedObject, max(abs(caxis(e.AffectedObject))) * [-1 1]));

这允许您执行此操作

for ii = -5 : 5
    imagesc([-1 0 10^ii]);
    pause(0.2);
end

并且中间的条纹(代表 0)始终是颜色条的中间颜色。

于 2015-11-03T22:40:01.140 回答