2010-03-22 6 views
7

W jaki sposób kontrolować przezroczystość nad obrazem 2D w piramidzie? Chciałbym podać dwa zestawy wartości (X,Y,Z,T), gdzie X,Y są tablicami pozycji, Z jest wartością koloru, a T jest przezroczystością dla funkcji takiej jak imshow, ale wydaje się, że funkcja przyjmuje tylko alfa jako skalar. Jako konkretny przykład, rozważ poniższy kod, który próbuje wyświetlić dwóch Gaussian. Im bliżej wartości jest zero, tym bardziej przejrzyste chciałbym, aby fabuła była.Zmienne mieszanie alfa w raplab

from pylab import * 

side = linspace(-1,1,100) 
X,Y = meshgrid(side,side) 

extent = (-1,1,-1,1) 

Z1 = exp(-((X+.5)**2+Y**2)) 
Z2 = exp(-((X-.5)**2+(Y+.2)**2)) 

imshow(Z1, cmap=cm.hsv, alpha=.6, extent=extent) 
imshow(Z2, cmap=cm.hsv, alpha=.6, extent=extent) 
show() 

Uwaga: Nie szukam działki Z1 + Z2 (to byłoby banalne), ale ogólny sposób określić alpha blending w całym obrazie.

Odpowiedz

7

Jedną z rzeczy, którą możesz zrobić, jest zmodyfikowanie tego, co umieścisz w imshow. Pierwsza zmienna może być wartością skali szarości, której użyłeś lub wartością RGB lub RGBA. Jeśli masz wartości RGB/RGBA, wówczas cmap jest ignorowany. Tak na przykład,

imshow(Z1, cmap=cm.hsv, alpha=.6, extent=extent) 

wygeneruje ten sam obraz jak

imshow(cm.hsv(Z1), alpha=.6, extent=extent) 

ponieważ cm.hsv() prostu zwraca wartości RGBA. Jeśli spojrzysz na zwracane wartości, wszystkie mają wartość 1.0 jako wartość A (przezroczystość). Więc jeden sposób, aby zmiennej przejrzystości byłoby coś takiego:

def mycmap(x): 
    tmp = cm.hsv(x) 
    for i in xrange(tmp.shape[0]): 
     for j in xrange(tmp.shape[0]): 
      tmp[i,j][3] = somefunction of x[i,j] that generates the transparency 
    return tmp 

imshow(mycmap(Z1), extent=extent) 
imshow(mycmap(Z2), extent=extent) 

Można znaleźć trochę bardziej elegancki sposób to zrobić, ale mam nadzieję, że masz pomysł.

+0

To jest świetne i dokładnie tego, czego szukałem! Patrząc dalej w to, widzę, że 'imshow' może zająć' MxNx4' ie. tablica Z z mapowaniem kolorów predefiniowanym przez użytkownika. Dzięki! – Hooked