Подтвердить что ты не робот

Как gauss-filter (размытие) массива nump с плавающей запятой

У меня есть массив numpy a типа float64. Как я могу размыть эти данные с помощью фильтра Гаусса?

Я пробовал

from PIL import Image, ImageFilter

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

но это дает ValueError: 'image has wrong mode'. (Он имеет режим F.)

Я мог бы создать образ подходящего режима, умножив a на некоторую константу, а затем округляя до целого. Это должно работать, но я хотел бы иметь более прямой способ.

(Я использую Pillow 2.7.0.)

4b9b3361

Ответ 1

Если у вас есть двумерный массив numpy a, вы можете использовать фильтр Gaussian на нем напрямую, не используя Pillow, чтобы сначала преобразовать его в изображение. scipy имеет функцию gaussian_filter, которая делает то же самое.

from scipy.ndimage.filters import gaussian_filter

blurred = gaussian_filter(a, sigma=7)

Ответ 2

Вот мой подход, используя только numpy. Он подготовлен с простым ядром 3x3, незначительные изменения могут заставить его работать с ядрами нестандартного размера.

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