使用matplotlib生成半透明覆盖时出现灰色而非颜色

2 投票
1 回答
1232 浏览
提问于 2025-04-18 02:48

我想用两张灰度图像制作一个颜色叠加效果,每张图像都显示一个“信号峰值”。为了让叠加图中只显示峰值而不显示背景,我创建了一个蓝色的色彩图,并且设置了一个从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()

你可以在代码生成的最右边的图像中看到蓝点周围的光晕。

这是我得到的结果:

halo

我使用的是python 2.7.3和matplotlib 1.2.0,尝试了不同的图形界面(qt、wx、gtk),但没有任何变化。

更新: 升级到python 2.7.5和matplotlib 1.3.1后,问题解决了。

1 个回答

1

你的代码在我这儿运行得很好,没有出现任何灰色的光晕。请看附上的图片。

用户3535588的代码生成的图片

我使用的是WinPython自带的python 2.7.6,并在ipython notebook中使用了matplotlib 1.3.1。

撰写回答