2015-04-28 9 views
12

Ho un array numpy a di tipo float64. Come posso sfocare questi dati con un filtro Gauss?Come gauss-filter (sfocatura) un array numpy in virgola mobile

ho cercato

from PIL import Image, ImageFilter 

image = Image.fromarray(a) 
filtered = image.filter(ImageFilter.GaussianBlur(radius=7)) 

, ma questo produce ValueError: 'image has wrong mode'. (Ha la modalità F.)

Potrei creare un'immagine della modalità adatta moltiplicando a con qualche costante, quindi arrotondando a numero intero. Dovrebbe funzionare, ma mi piacerebbe avere un modo più diretto.

(sto usando Cuscino 2.7.0.)

+0

Avete bisogno di questo per utilizzare Cuscino? Se hai il tuo array 2D 'a', sarebbe sufficiente" sfocare "i dati direttamente senza creare prima un'immagine? – Carsten

+0

Puoi testare convertendo la modalità come 'image = image.convert ('L')' e applicare 'ImageFilter.GaussianBlur'? – Zero

+0

@Carsten - Come posso sfocare "direttamente"? –

risposta

22

Se si dispone di un array NumPy bidimensionale a, è possibile utilizzare un filtro gaussiano su di esso direttamente senza l'utilizzo di cuscini per convertirlo in un'immagine prima. scipy ha una funzione gaussian_filter che fa lo stesso.

from scipy.ndimage.filters import gaussian_filter 

blurred = gaussian_filter(a, sigma=7) 
+0

Dovrebbe essere notato, questo funziona solo, se si dispone di galleggianti, ad es. 'test_arr = np.array ([[1, 0, 2.], [2., 0, 0], [0, 0, 0]])' funzionerà 'gaussian_filter (test_arr, sigma = 0.7)' – Boern

1

Ecco il mio approccio utilizzando solo numpy. È preparato con un semplice kernel 3x3, modifiche minori potrebbero farlo funzionare con kernel di dimensioni personalizzate.

def blur(a): 
    kernel = np.array([[1.0,2.0,1.0], [2.0,4.0,2.0], [1.0,2.0,1.0]]) 
    kernel = kernel/np.sum(kernel) 
    arraylist = [] 
    for y in range(3): 
     temparray = np.copy(a) 
     temparray = np.roll(temparray, y - 1, axis=0) 
     for x in range(3): 
      temparray_X = np.copy(temparray) 
      temparray_X = np.roll(temparray_X, x - 1, axis=1)*kernel[y,x] 
      arraylist.append(temparray_X) 

    arraylist = np.array(arraylist) 
    arraylist_sum = np.sum(arraylist, axis=0) 
    return arraylist_sum