使用matplotlib的半透明叠加产生灰色而不是颜色

时间:2014-04-15 11:45:13

标签: python image matplotlib

我想使用两个灰度值图像进行颜色叠加,每个图像都显示一个“信号峰值”。为了只让峰值出现在叠加层而不是背景中,我创建了一个蓝色的彩色地图,其中alpha通道从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,我尝试了不同的GUI(qt,wx,gtk),没有任何区别。

更新 移动到python 2.7.5和matplotlib 1.3.1解决了这个问题。

1 个答案:

答案 0 :(得分:0)

您的代码对我来说很好,它不会产生任何灰色晕圈。见附图。

Image produced by user3535588's code

我使用了WinPython附带的python 2.7.6,在ipython笔记本中使用matplotlib 1.3.1。