2014-05-16 2 views
6

Я создаю сетку с использованием mayavi.mlab и хочу, чтобы непрозрачность фона была 0. (или прозрачной). Это возможно?Может ли майя изобразить сцену с прозрачным фоном?

+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

Если ваша цель - интегрировать фигуру майяви в фигуру matplotlib, это возможно. Вы можете использовать mlab.screenshot, чтобы получить числовой массив значений RGBA, а mlab будет устанавливать фоновые пиксели, чтобы иметь альфа-0 автоматически. Затем вы можете добавить эту матрицу RGBA к фигуре с матрицей через imshow. Пример (адаптировано из 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

Когда я запускаю этот точный код, он не работает (т. Е. Фигура майяви имеет серый фон вместо прозрачного). –

+0

Он отлично подходит для меня: 'майави' версия' 4.5.0' & 'matplotlib' версия' 1.5.1'. – ryanjdillon