タイプ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を使用しています。)
2次元のnumpy配列a
がある場合、最初にPillowを使用して画像に変換することなく、ガウスフィルターを直接使用できます。 scipyには関数 gaussian_filter
それは同じことです。
from scipy.ndimage.filters import gaussian_filter
blurred = gaussian_filter(a, sigma=7)
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