pylab中的可变alpha混合

7 投票
1 回答
5095 浏览
提问于 2025-04-15 20:43

在pylab中,如何控制2D图像的透明度呢?我想给一个函数,比如imshow,提供两组值(X,Y,Z,T),其中X,Y是位置的数组,Z是颜色值,而T是透明度。不过,似乎这个函数只接受一个单一的透明度值(alpha)。举个具体的例子,下面的代码试图显示两个高斯分布。值越接近零,我希望图表越透明。

from pylab import *

side = linspace(-1,1,100)
X,Y  = meshgrid(side,side)

extent = (-1,1,-1,1)

Z1  = exp(-((X+.5)**2+Y**2))
Z2  = exp(-((X-.5)**2+(Y+.2)**2))

imshow(Z1, cmap=cm.hsv, alpha=.6, extent=extent)
imshow(Z2, cmap=cm.hsv, alpha=.6, extent=extent)
show()

注意:我并不是想要Z1+Z2的图(那太简单了),而是想要一种通用的方法来在图像中指定透明度混合。

1 个回答

8

你可以做的一件事是修改你放入 imshow 的内容。第一个变量可以是灰度值,就像你之前用的那样,也可以是 RGB 或 RGBA 值。如果你使用 RGB/RGBA 值,那么 cmap 就会被忽略。所以举个例子,

imshow(Z1, cmap=cm.hsv, alpha=.6, extent=extent)

会生成和下面这个一样的图像:

imshow(cm.hsv(Z1), alpha=.6, extent=extent)

因为 cm.hsv() 只是返回 RGBA 值。如果你看看它返回的值,你会发现它们的 A 值(透明度)都是 1.0。所以,制作可变透明度的一种方法可以是这样的:

def mycmap(x):
    tmp = cm.hsv(x)
    for i in xrange(tmp.shape[0]):
        for j in xrange(tmp.shape[0]):
            tmp[i,j][3] = somefunction of x[i,j] that generates the transparency
    return tmp

imshow(mycmap(Z1), extent=extent)
imshow(mycmap(Z2), extent=extent)

你可能会找到更优雅的做法,但希望你能明白这个思路。

撰写回答