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