【发布时间】:2014-08-01 21:39:20
【问题描述】:
GH问题#3343
我正在使用 matplotlib 中的 imshow 函数来可视化一些数据。我有两个数组,A 和 B,它们的大小相同。我想使用颜色图在 A 中显示标量值,我想使用 alpha 通道在 B 中显示标量值。换句话说,如果 A 和 B 中给定坐标处的值很大,则图中的像素将是亮绿色且不透明。如果它在 A 而不是 B 中很大,那么它将是亮绿色但大部分是透明的。如果它在 B 而不是 A 中很大,那么它将是不透明的,而是白色的。
但是,生成的图像不是我所期望的。我的输入数据称为d,它是通过将 A 数组与 matplotlib 颜色映射(即mpl.cm.BuGn(A))和 B em> 数组。
在这里,我将绘制完整的图像(我想要实际使用的)、RGB 图像(A,使用BuGn 映射)和提供 alpha 的数组(B,带有灰度颜色图)。
f, (ax0, ax1, ax2) = plt.subplots(1, 3, figsize=(5, 2.5))
ax0.imshow(d)
ax1.imshow(d[..., :-1])
ax2.imshow(d[..., -1])
我对完整图像中的斑点灰色垃圾的来源感到困惑,因为颜色图中没有任何值是这些颜色。为了更显着地显示这种效果,我可以更改颜色图的边界,使它们远离数据的极端并重新绘制:
我不明白为什么具有较大 alpha 值的白色像素会显示为灰色。不透明的白色应该仍然是白色的。
请注意,此行为与我绘制 RGB 组件数组并使用 alpha kwarg 降低透明度(即 ax2.imshow(d[..., :-1], alpha=.3))不同:
【问题讨论】:
-
很奇怪。也可以使用简单的渐变重现,无需颜色图:
d = np.ones((100, 100, 4)); d[..., -1] = np.linspace(0, 1, num=100); plt.imshow(d)。 -
@DanAllan 这只是由于 matplotlib 中默认的白色画布颜色。
-
这不是我用过的任何成像软件中处理透明度的方式。
-
@DanAllan 也许是预乘?见blogs.msdn.com/b/shawnhar/archive/2009/11/06/…
标签: python matplotlib