web-dev-qa-db-fra.com

Comment filtrer par gauss (flou) un tableau numpy à virgule flottante

J'ai un tableau numpy a de type float64. Comment puis-je brouiller ces données avec un filtre de Gauss?

J'ai essayé

from PIL import Image, ImageFilter

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

, mais cela donne ValueError: 'image has wrong mode'. (Il a le mode F.)

Je pourrais créer une image de mode approprié en multipliant a avec une constante, puis en arrondissant à un entier. Cela devrait fonctionner, mais j'aimerais avoir un moyen plus direct.

(J'utilise Pillow 2.7.0.)

19
Robert Pollak

Si vous avez un tableau numpy bidimensionnel a, vous pouvez utiliser un filtre gaussien directement sans utiliser Pillow pour le convertir en image en premier. scipy a une fonction gaussian_filter qui fait de même.

from scipy.ndimage.filters import gaussian_filter

blurred = gaussian_filter(a, sigma=7)
32
Carsten

Voici mon approche en utilisant uniquement numpy. Il est préparé avec un simple noyau 3x3, des modifications mineures pourraient le faire fonctionner avec des noyaux de taille personnalisée.

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
4
Filipe Alves