Mayavi能否渲染具有透明背景的图形场景?

7
我正在使用mayavi.mlab生成网格图,并希望将背景透明度设置为0(或透明)。这可能吗?

你期望得到什么结果?更准确地说,你希望用这个透明背景做什么?你是想在其他背景上创建一些带有3D渲染对象的图像吗?或者你是想让窗口管理器将场景合成到其他背景上吗?第一个情况可能需要后期处理的帮助。而第二种情况则不可能。请提供更多关于你尝试做什么的细节。 - aestrivex
2个回答

6

如果您的目标是将mayavi图形集成到matplotlib图形中,则可以实现此目标。您可以使用mlab.screenshot获取RGBA值的numpy数组,并且mlab会自动将背景像素的alpha设置为0。然后,您可以通过imshow将这个RGBA矩阵添加到matplotlib图形中。示例(改编自这里):

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合成到Matplotlib线图中

您也可以直接使用plt.imsave(arr=imgmap, fname="foo.png")将RGBA数组保存为文件。


3
当我运行那段确切的代码时,它不起作用(即mayavi图像具有灰色背景而非透明)。 - Ruben Verresen
对我来说它完全正常:mayavi 版本 4.5.0matplotlib 版本 1.5.1 - ryanjdillon

2
您无法直接设置透明度。但是,您可以将图形保存为具有背景颜色(与前景颜色不同)的图像,并使用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

就像这里所示的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接