web-dev-qa-db-ja.com

浮動小数点numpy配列をガウスフィルター(ぼかし)する方法

タイプfloat64のnumpy配列aがあります。このデータをガウスフィルターでぼかすにはどうすればよいですか?

私が試してみました

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を使用しています。)

19
Robert Pollak

2次元のnumpy配列aがある場合、最初にPillowを使用して画像に変換することなく、ガウスフィルターを直接使用できます。 scipyには関数 gaussian_filter それは同じことです。

from scipy.ndimage.filters import gaussian_filter

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

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