2015-04-28 8 views
12

मुझे float64 प्रकार की एक numpy array a मिला है। मैं इस डेटा को गॉस फ़िल्टर के साथ कैसे धुंधला कर सकता हूं?गॉस-फ़िल्टर (धुंध) कैसे एक फ्लोटिंग पॉइंट numpy array

मैं

from PIL import Image, ImageFilter 

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

की कोशिश की है, लेकिन इस पैदावार ValueError: 'image has wrong mode'। (इसमें मोड F है।)

मैं कुछ स्थिरता के साथ a गुणा करके उपयुक्त मोड की एक छवि बना सकता हूं, फिर पूर्णांक के लिए गोल कर रहा हूं। यह काम करना चाहिए, लेकिन मैं एक और सीधा रास्ता चाहते हैं।

(मैं तकिया 2.7.0 का उपयोग कर रहा हूँ।)

+0

क्या आपको पिल्लो का उपयोग करने की आवश्यकता है? यदि आपके पास 2 डी सरणी 'ए' है, तो क्या यह पहले छवि बनाने के बिना डेटा को "धुंधला" करने के लिए पर्याप्त होगा? – Carsten

+0

क्या आप 'image = image.convert (' L ') जैसे मोड को परिवर्तित करके परीक्षण कर सकते हैं और' ImageFilter.GaussianBlur' लागू करें? – Zero

+0

@ करस्टेन - मैं इसे 'सीधे' कैसे धुंधला कर सकता हूं? –

उत्तर

22

आप एक दो आयामी numpy सरणी a है, तो आप सीधे तकिया का उपयोग कर एक छवि के लिए यह पहली कन्वर्ट करने के लिए बिना उस पर एक गाऊसी फिल्टर का उपयोग कर सकते हैं। scipy एक समारोह gaussian_filter है जो वही करता है।

from scipy.ndimage.filters import gaussian_filter 

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

ध्यान दिया जाना चाहिए, यह केवल तभी काम करता है, यदि आपके पास फ्लोट है, उदा। 'test_arr = np.array ([[1।, 0, 2.], [2., 0, 0], [0, 0, 0]]) 'gaussian_filter (test_arr, sigma = 0.7)' काम करेगा – Boern

1

यहां केवल नमस्ते का उपयोग करके मेरा दृष्टिकोण है। यह एक साधारण 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