使用matplotlib生成半透明覆盖时出现灰色而非颜色
我想用两张灰度图像制作一个颜色叠加效果,每张图像都显示一个“信号峰值”。为了让叠加图中只显示峰值而不显示背景,我创建了一个蓝色的色彩图,并且设置了一个从0到1渐变的透明度通道。使用imshow()
时,我本来希望能看到透明的颜色,但却在峰值周围看到了一个灰色的光晕。我尝试了很久这个问题,但就是搞不清楚该怎么做才能去掉这个灰色光晕。任何关于如何制作这种叠加效果的帮助都非常感谢。
下面是产生这个问题的代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as cols
n = 41
# make Gaussian signal peaks
x = np.linspace(-1,1,n)
xx, yy = np.meshgrid(x,x)
b = 0.3
d = -0.3 # diagonal displacement
p1 = np.exp(-((xx-d)**2 + (yy-d)**2)/b**2)
p2 = np.exp(-((xx+d)**2 + (yy+d)**2)/b**2)
# make custom colormap
cdict = {'red': ((0.0, 0.0, 0.0),
(1.0, 0.3, 0.3)),
'green': ((0.0, 0.0, 0.0),
(1.0, 0.5, 0.5)),
'blue': ((0.0, 0.0, 0.0),
(1.0, 1.0, 1.0))}
myBu = cols.LinearSegmentedColormap('myBu',cdict,256)
# add ramp alpha channel
myBuT = cols.LinearSegmentedColormap('myBuT',cdict,256)
myBuT._init()
alphas = np.linspace(0, 1, 256+3)
myBuT._lut[:,-1] = alphas
# plot
plt.close('all')
plt.subplot(1,3,1)
plt.imshow(p1, cmap='copper')
plt.subplot(1,3,2)
plt.imshow(p2, cmap=myBu)
plt.subplot(1,3,3)
plt.imshow(p1, cmap='copper')
plt.imshow(p2, cmap=myBuT)
plt.show()
你可以在代码生成的最右边的图像中看到蓝点周围的光晕。
这是我得到的结果:

我使用的是python 2.7.3和matplotlib 1.2.0,尝试了不同的图形界面(qt、wx、gtk),但没有任何变化。
更新: 升级到python 2.7.5和matplotlib 1.3.1后,问题解决了。
1 个回答
1
你的代码在我这儿运行得很好,没有出现任何灰色的光晕。请看附上的图片。
我使用的是WinPython自带的python 2.7.6,并在ipython notebook中使用了matplotlib 1.3.1。