2014-05-16 34 views
6

Generuję wykres siatki za pomocą mayavi.mlab i chcę, aby krycie tła miało wartość 0. (lub przezroczyste). czy to możliwe?Czy Mayavi może renderować scenę z przezroczystym tłem?

+0

Jaki wynik się spodziewasz? A dokładniej, czego możesz się spodziewać * z * tym przezroczystym tłem? Czy próbujesz utworzyć obrazy z niektórymi obiektami 3D renderowanymi na innym tle? A może starasz się, aby twój menedżer okien komponował scenę na jakimś innym tle? Pierwszy scenariusz jest prawdopodobnie możliwy przy pomocy postprocessingu. Drugi zdecydowanie nie jest. Podaj więcej szczegółów na temat tego, co próbujesz zrobić. – aestrivex

Odpowiedz

1

Nie można bezpośrednio ustawić przezroczystości. Można jednak zapisać postać z kolorem tła (innym niż kolor na pierwszym planie) i używać ImageMagick aby usunąć tło

Na przykład

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') 

teraz używać ImageMagick aby usunąć tło

convert pure_beauty.png -transparent white pure_transparent_beauty.png 

jak pokazano here.

2

Jeśli twoim celem jest integracja figury mayavi w postaci matplotlib, jest to możliwe. Możesz użyć mlab.screenshot, aby uzyskać numpy tablicę wartości RGBA, a mlab ustawi piksele w tle tak, aby automatycznie zawierały alfa 0. Następnie można dodać tę macierz RGBA do postaci matlab przez imshow. Przykład (zaadaptowane z 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

Można również po prostu zapisać tablicę RGBA bezpośrednio do pliku przy użyciu plt.imsave(arr=imgmap, fname="foo.png")

+3

Po uruchomieniu tego dokładnego kodu, to nie działa (tj. Rysunek mayavi ma szare tło zamiast przezroczystego). –

+0

Działa to dobrze dla mnie: 'mayavi' wersja' 4.5.0' i 'matplotlib' wersja' 1.5.1'. – ryanjdillon