2014-05-16 56 views
6

我正在使用mayavi.mlab生成一個網格圖,並希望背景不透明度爲0(或透明)。這可能嗎?Mayavi可以渲染具有透明背景的人物場景嗎?

+0

你期待什麼結果文件?更確切地說,你期望用這種透明背景做什麼?您是否嘗試在某些其他背景上使用一些3D渲染對象創建圖像?或者你是否試圖讓你的窗口管理器將場景合成到其他背景上?第一種情況可能是後處理幫助。第二個肯定不是。提供更多關於你想要做什麼的細節。 – aestrivex

回答

1

您不能直接設置透明度。但是,您可以保存與背景顏色(比前景顏色不同)圖例,並利用ImageMagick的消除背景

例如

mlab.figure(size = (1024,768),\ 
      bgcolor = (1,1,1), fgcolor = (0.5, 0.5, 0.5)) 

# Your fantastic plotting script 

mlab.save('pure_beauty.png') 

現在使用ImageMagick的消除背景

convert pure_beauty.png -transparent white pure_transparent_beauty.png 

如圖所示here

2

如果您的目標是將mayavi圖形整合到matplotlib圖形中,這是可能的。您可以使用mlab.screenshot來獲取RGBA值的numpy陣列,並且mlab會將背景像素設置爲自動具有alpha 0。然後,您可以通過imshow將此RGBA矩陣添加到matlab圖中。示例(改編自here):

import numpy as np 
from mayavi import mlab 
import matplotlib.pyplot as plt 
# set up some plotting params 
dphi, dtheta = np.pi/250.0, np.pi/250.0 
[phi, theta] = np.mgrid[0:np.pi + dphi * 1.5:dphi, 
         0:2 * np.pi + dtheta * 1.5:dtheta] 
m0, m1, m2, m3 = 4, 3, 2, 3 
m4, m5, m6, m7 = 6, 2, 6, 4 
r = np.sin(m0 * phi) ** m1 + np.cos(m2 * phi) ** m3 + \ 
    np.sin(m4 * theta) ** m5 + np.cos(m6 * theta) ** m7 
x = r * np.sin(phi) * np.cos(theta) 
y = r * np.cos(phi) 
z = r * np.sin(phi) * np.sin(theta) 
# do the meshplot  
fig = mlab.figure(size=(480, 340)) 
mlab.mesh(x, y, z, colormap='cool', figure=fig) 
imgmap = mlab.screenshot(figure=fig, mode='rgba', antialiased=True) 
mlab.close(fig) 
# do the matplotlib plot 
fig2 = plt.figure(figsize=(7, 5)) 
plt.imshow(imgmap, zorder=4) 
plt.plot(np.arange(0, 480), np.arange(480, 0, -1), 'r-') 
plt.savefig('example.png') 

mayavi meshplot composited onto matplotlib line graph

您也可以只直接保存RGBA陣列使用plt.imsave(arr=imgmap, fname="foo.png")

+3

當我運行確切的代碼時,它不起作用(即mayavi圖有灰色背景而不是透明)。 –

+0

它適用於我:'mayavi'版本'4.5.0'和'matplotlib'版本'1.5.1'。 – ryanjdillon