2013-09-16 15 views
7

मैंने इस मंच में मास्क किए गए सरणी जैसे मध्यस्थों की गणना करने के बारे में कई चर्चाएं देखी हैं। जो मैं चाहता हूं वह थोड़ा अधिक सूक्ष्म है, यह मेरी छवि पर एक औसत फ़िल्टर लागू करना है। मुझे ऐसा करने का एक तरीका पता है, लेकिन बहुत धीमा है, और प्रक्रिया को तेज करने के तरीकों की सराहना करता है।मास्क किए गए सरणी के औसत फ़िल्टर

उदाहरण के लिए, मान लेते हैं कि मैं एक नकाबपोश आकार (10,10) की सरणी है और मैं एक बॉक्स (3,3) उन तत्वों को छुपाया जाता है का उपयोग नहीं के साथ एक मंझला फ़िल्टर लागू करना चाहते। मेरा लक्ष्य बॉक्स के मास्क किए गए माध्य के मूल्य के साथ छवि के प्रत्येक पिक्सेल में मान को प्रतिस्थापित करना है। वास्तव में मंझला फिल्टर हम साथ एक जानवर बल रास्ते पर यह कर सकते हैं बनाने के लिए

im = numpy.random.uniform(size=(10,10)) 
mask = numpy.zeros_like(im) 
mask[1:3,:] = 1 
masked_im = numpy.ma.array(im, mask=mask) 

अब,:

एक बहुत ही सरल मामले मान लिया जाये कि, हम "छवि" और के रूप में मुखौटा निर्माण कर सकते हैं

lx, ly = im.shape 
side = 3 
im_filt = numpy.zeros_like(im) 
for jj in range(ly): 
    for ii in range(lx): 
     minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx]) 
     miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly]) 
     im_filt[ii,jj] = numpy.ma.median(masked_im[minx:maxx, miny:maxy]) 

यह समस्या हल करता है और एक अच्छा परिणाम देता है, लेकिन जैसा कि मैंने कहा, यह दर्दनाक रूप से धीमा है।

im_filt2 = numpy.zeros_like(im) 
for jj in range(ly): 
    for ii in range(lx): 
     minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx]) 
     miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly]) 
     zoom_im = im[minx:maxx, miny:maxy] 
     zoom_msk = mask[minx:maxx, miny:maxy] 
     im_filt2[ii,jj] = numpy.median(zoom_im[zoom_msk == 0]) 

यह 0.002 के लिए 0.018 से निष्पादन समय है, जो स्पष्ट रूप से बेहतर है (क्यों लाता है: एक (मेरे लिए, आश्चर्य की बात) जिस तरह से थोड़ा प्रक्रिया में तेजी लाने के लिए की तरह है, अलग से मुखौटा और छवि का उपयोग करने के लिए है? ?) अगर कारक ~ 50 द्वारा नहीं जिसे मैं ढूंढ रहा था।

कोई इनपुट?

उत्तर

1

मुझे लगता है कि अंतर मुख्य रूप से मास्कडएरे ऑब्जेक्ट (जो कि अंडारे के चारों ओर एक प्रकार का रैपर है) तक पहुंचने में ओवरहेड के कारण होता है।

numpy में एक कुशल औसत फ़िल्टर के लिए आप scikit-image भी आजमा सकते हैं। यह एक मुखौटा तर्क भी स्वीकार करता है।

+0

अब यह [skimage.filter.rank] (http://scikit-image.org/docs/dev/api/skimage.filter.rank.html#median) पैकेज में है। – letmaik

+0

उपरोक्त 2 लिंक अब और काम नहीं कर रहे हैं, अब कोई विचार है कि यह अभी कहां है? रिपोर्टिंग के लिए – JoVe

+0

धन्यवाद। यहां एक नया लिंक है: http://scikit-image.org/docs/stable/api/skimage.filters.rank.html#median – btel

संबंधित मुद्दे