it-swarm.com.de

Gauß-Filter (Unschärfe) eines Gleitkomma-Numpy-Arrays

Ich habe ein numpy-Array a vom Typ float64. Wie kann ich diese Daten mit einem Gauß-Filter verwischen?

Ich habe versucht

from PIL import Image, ImageFilter

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

, aber das ergibt ValueError: 'image has wrong mode'. (Es hat den Modus F.)

Ich könnte ein Bild mit einem geeigneten Modus erstellen, indem ich a mit einer Konstanten multipliziere und dann auf eine Ganzzahl runde. Das sollte funktionieren, aber ich hätte gerne einen direkteren Weg.

(Ich benutze Pillow 2.7.0.)

19
Robert Pollak

Wenn Sie ein zweidimensionales Numpy-Array a haben, können Sie direkt einen Gauß-Filter verwenden, ohne Pillow zu verwenden, um es zuerst in ein Bild zu konvertieren. scipy hat eine Funktion gaussian_filter das macht das gleiche.

from scipy.ndimage.filters import gaussian_filter

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

Hier ist mein Ansatz mit nur numpy. Es ist mit einem einfachen 3x3-Kernel vorbereitet, kleinere Änderungen könnten dazu führen, dass es mit Kerneln in benutzerdefinierten Größen funktioniert.

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