2015-04-28 61 views
12

float64 türünde a numaralı bir sayı dizilim var. Bu verileri bir Gauss filtresiyle nasıl bulanıklaştırabilirim?Kayan nokta sayı dizisi (bulanıklaştırma) nasıl yapılır

Ben

from PIL import Image, ImageFilter 

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

denedi, ancak bu ValueError: 'image has wrong mode' verir. (Bu mod F'a sahiptir.)

a ile çarparak bazı sabit, daha sonra tamsayıya yuvarlayarak uygun modda bir görüntü oluşturabilirim. Bu işe yaramalı, ama daha doğrudan bir şekilde olmasını istiyorum.

(I yastık 2.7.0 kullanıyorum.)

+0

Yastık kullanmak için buna ihtiyacınız var mı? 2D diziniz 'a' varsa, ilk önce bir görüntü oluşturmadan verileri doğrudan" bulanıklaştırmak "yeterli olur mu? – Carsten

+0

"image = image.convert ('L') 'gibi bir moda çevirip" ImageFilter.GaussianBlur "komutunu uygulayarak test edebilir misiniz? – Zero

+0

@Carsten - 'Doğrudan' nasıl bulanıklaştırabilirim? –

cevap

22

Eğer iki boyutlu numpy dizi a varsa, doğrudan ilk olarak bir görüntüye dönüştürmek Yastık kullanmadan üzerinde bir Gauss filtresi kullanabilirsiniz. scipy'nin aynı işlevi gören bir gaussian_filter işlevi vardır.

from scipy.ndimage.filters import gaussian_filter 

blurred = gaussian_filter(a, sigma=7) 
+0

Dikkat edilmelidir ki, sadece şamandıralar varsa, bu sadece çalışır, örn. 'test_arr = np.array ([[1, 0, 2.], [2., 0, 0], [0, 0, 0]])' gaussian_filter çalışacaktır (test_arr, sigma = 0.7) ' – Boern

1

İşte benim yaklaşımım yalnızca numpy kullanıyor. Basit bir 3x3 çekirdeği ile hazırlanan küçük değişiklikler, özel boyutlu çekirdeklerle çalışmasını sağlayabilir.

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