彼得·科维西有一些很棒的彩色地图。他提供了一个MATLAB 函数,称为colorcet,我们可以在这里使用它来获取表示相位所需的循环颜色图。在运行下面的代码之前下载此函数。
让我们从创建一个复值测试函数开始f
,其中幅度从中心开始增加,相位等于围绕中心的角度。很像您展示的示例:
% A test function
[xx,yy] = meshgrid(-128:128,-128:128);
z = xx + yy*1i;
f = z;
接下来,我们将获取它的相位,将其转换为索引colorcet
C2 颜色图(循环),最后将其重塑回原始函数的形状。out
这里有3个维度,前两个是原始维度,最后一个是RGB。imshow
将这样的 3D 矩阵显示为彩色图像。
% Create a color image according to phase
cm = colorcet('C2');
phase = floor((angle(f) + pi) * ((size(cm,1)-1e-6) / (2*pi))) + 1;
out = cm(phase,:);
out = reshape(out,[size(f),3]);
最后一部分是使用以下值的大小来调制这些颜色的强度:f
。为了使 2 的幂不连续,我们取以 2 为底的对数,应用模运算,然后再次计算 2 的幂。一个简单的乘法out
必要时降低颜色强度:
% Compute the intensity, with discontinuities for |f|=2^n
magnitude = 0.5 * 2.^mod(log2(abs(f)),1);
out = out .* magnitude;
最后一个乘法在 Octave 和更高版本的 MATLAB 中有效。对于旧版本的 MATLAB,您需要使用bsxfun
反而:
out = bsxfun(@times,out,magnitude);
最后,使用显示imshow
:
% Display
imshow(out)
![output of code above](https://i.stack.imgur.com/67lFm.png)
请注意,此处的颜色比示例中的颜色更柔和。这colorcet
彩色地图在感知上是统一的。这意味着相同的角度变化会导致相同的颜色感知变化。例如,在您发布的示例中,黄色是一条非常窄、明亮的带。这样的带会导致函数中某些特征的错误突出显示,而这些特征可能根本不相关。感知上均匀的颜色图对于正确解释数据非常重要。另请注意,此特定颜色图在四个基本方向上具有易于命名的颜色(紫色、蓝色、绿色、黄色)。纯实值是绿色(正)或紫色(负),纯虚值是蓝色(正)或黄色(负)。