要回答第一个问题,有很多事情需要注意。
首先,唯一的方法是单一值可以使用颜色图来表示颜色,该颜色图将标量映射到颜色。然而,麦克斯韦三角形不能简化为单个值。
这并不意味着麦克斯韦三角形不能用作一种 3D 颜色图,将 3 个值映射到一种颜色。事实上这是很自然的,因为麦克斯韦使用了 3 个值a
, b
and c
这样颜色就可以用 RGB 坐标表示为(a,b,c)
。唯一缺少的是标准化。
在提供的链接中,麦克斯韦三角形的定义如下a+b+c=1
。然而,matplotlib 接受 RGB 坐标,因为 3 在 0 和 1 之间浮动,其中白色显然是1,1,1
, 代替1/3,1/3,1/3
。因此,每个i,j
考虑到这一点,将具有必须转换为 0 到 1 之间的 3 个浮点数的三个值。
因此,不要将除以总和标准化(得到a+b+c=1
)我们必须将除以每个三重奏的最大值进行归一化。
最终,可以使用以下命令显示生成的图像imshow.
def colorTriangle(r,g,b):
image = np.stack([r,g,b],axis=2)
return image/image.max(axis=2)[:,:,None]
size = 200
X,Y = np.meshgrid(np.linspace(0,1,200),np.linspace(0,1,200))
u = np.full_like(X,.2)
v = Y
w = X**2
plt.imshow(colorTriangle(v,u,w),origin='lower',extent=(0,1,0,1))
# Note that v is first in order to be represented by red
输出图像如下:
这里可以清楚地看出,对于较小的 x 和 y 值,其中v
and w
为零,颜色为绿色,如u
不同于零并且远大于v
and w
。对于大 x 和小 y,w
占主导地位,颜色确实是蓝色,当v
占主导地位(大 y 和小 x),颜色为红色。还表明,对于所有三个矩阵的相同值,所得颜色为白色。