如何高斯滤波(模糊)一个浮点numpy数组

时间:2015-04-28 12:53:58

标签: python numpy filtering python-imaging-library

我有一个a类型的numpy数组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。)

3 个答案:

答案 0 :(得分:32)

如果你有一个二维的numpy数组a,你可以直接在它上面使用高斯滤镜,而不必使用Pillow将它首先转换为图像。 scipy有一个函数gaussian_filter也可以这样做。

from scipy.ndimage.filters import gaussian_filter

blurred = gaussian_filter(a, sigma=7)

答案 1 :(得分:4)

这是我的方法,只使用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

答案 2 :(得分:4)

使用卷积和高斯滤波器可分离性的纯 numpy 解决方案分为两个单独的过滤步骤(这使得它相对较快):

kernel = np.array([1.0,2.0,1.0]) # Here you would insert your actual kernel of any size
a = np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 0, a)
a= np.apply_along_axis(lambda x: np.convolve(x, kernel, mode='same'), 1, a)