2013-08-22 6 views
5

मेरे पास एक मस्तिष्क की 3 डी छवि है (चलिए इसे फ्लैश कहते हैं) और वर्तमान में यह 263 x 256 x 185 है। मैं इसे किसी अन्य छवि का आकार बदलने के लिए आकार बदलना चाहता हूं (इसे पूरा_ब्रेन_ब्रावो कहते हैं) ; 256 x 256 x 176, और (उम्मीद है) अनुकरण करने के लिए एक लांज़ोस इंटरपोलेशन का उपयोग करें (Image.ANTIALIAS)। मेरा (असफल) प्रयास:एक 3 डी छवि (और resampling) का आकार बदलना

from scipy import ndimage as nd 
import nibabel as nib 
import numpy as np 



a = nib.load('flash.hdr') # nib is what I use to load the images 
b = nib.load('whole_brain_bravo.hdr') 

flash = a.get_data() # Access data as array (in this case memmap) 
whole = b.get_data() 

downed = nd.interpolation.zoom(flash, zoom=b.shape) # This obviously doesn't work 

क्या आपने कभी 3 डी छवि पर इस तरह की चीज की है?

उत्तर

3

scipy.ndimage.interpolate.zoom के लिए docstring से:

""" 
zoom : float or sequence, optional 
    The zoom factor along the axes. If a float, `zoom` is the same for each 
    axis. If a sequence, `zoom` should contain one value for each axis. 
""" 

दो छवियों के बीच पैमाने कारक क्या है? क्या यह सभी अक्षों में स्थिर है (यानी आप आइसोमेट्रिक स्केलिंग कर रहे हैं)? उस स्थिति में zoom एक एकल फ्लोट मान होना चाहिए। अन्यथा यह फ्लोट्स का एक अनुक्रम होना चाहिए, एक प्रति धुरी।

उदाहरण के लिए, whole और flash के भौतिक आयाम बराबर माना जा सकता है, तो आप कुछ इस तरह कर सकता है:

dsfactor = [w/float(f) for w,f in zip(whole.shape, flash.shape)] 
downed = nd.interpolation.zoom(flash, zoom=dsfactor) 
+0

यह वास्तव में अच्छा धन्यवाद है। क्या आप यह भी जान लेंगे कि किसी भी मौके से कैसे हटाना है? – elefun

+0

यही 'np.interpolation.zoom'' फ्लैश' से 'डाउनड' उत्पन्न करने के लिए करता है! आप 'ऑर्डर =' पैरामीटर के माध्यम से उपयोग किए जाने वाले स्पलीन इंटरपोलेशन के क्रम को बदल सकते हैं (मुझे numpy/scipy में लांज़ोस इंटरपोलेशन के किसी भी कार्यान्वयन के बारे में पता नहीं है)। –

+0

आह, मैं देखता हूं कि आपका क्या मतलब है। मैं उम्मीद कर रहा था कि मैं लांज़ोस का उपयोग कर सकता हूं। हालांकि यह एक सौदा का बड़ा नहीं है। और हाँ lanczos पायथन इमेजिंग पुस्तकालय में लागू किया गया है; Image.ANTIALIAS वास्तव में सी में लिखे गए 3-लोब लैंक्सोज़ हैं (प्रलेखन के अनुसार) – elefun

1

डॉक्स के अनुसार, zoom तर्क "है अक्ष के साथ ज़ूम कारक "। यह थोड़ा अस्पष्ट है, लेकिन ऐसा लगता है कि वांछित आयाम की बजाय उनका मतलब स्केल कारक है।

इस प्रयास करें:

zoomFactors = [bi/float(ai) for ai, bi in zip(a, b)] 
downed = nd.interpolation.zoom(flash, zoom=zoomFactors) 

एक फिल्टर चुनने के बारे में सुनिश्चित नहीं हैं - डॉक्स केवल विभिन्न आदेशों की पट्टी छेड़छाड़ का उल्लेख है।

+0

सामान्य रूप से पाइथन में 3 डी छवि को फिर से बदलने के बारे में आप कैसे जाएंगे? जैसे कि मैं आपको एक छवि देता हूं, और आप इसे देखते हैं और "ओह यह दिखता है, मुझे शायद थोड़ा नजदीक बनाने के लिए कुछ नजदीकी पड़ोसी करना चाहिए", आप इसे कैसे करेंगे? – elefun

+0

किस अर्थ में किसी छवि को कम करने से यह * nicer * दिखता है? अगर मैं एक सरणी को दोहराना चाहता था, तो मुझे लगता है कि मैं scipy.ndimage.interpolation.zoom का उपयोग करने का प्रयास करूंगा। क्या यह आपके लिए काम नहीं कर रहा है? मुझे यकीन है कि ऐसा करने के कई तरीके हैं, लेकिन जब तक आप वर्णन न करें कि यह पर्याप्त क्यों नहीं है, मैं आपकी मदद नहीं कर सकता। – Brionius

+0

ऐसा नहीं है कि यह काफी अच्छा नहीं है, मुझे वास्तव में उन परिणामों को पसंद है जो लांज़ोज़ योजना के डाउनसमैप्लिंग करते हैं, कहें, एक जेपीईजी इसलिए मैं इसे 3 डी छवि में पुन: पेश करना चाहता था। लेकिन यह एक बड़ा सौदा नहीं है, स्पलीन ठीक है (हेहे मैं लयबद्ध)। आपकी सहायताके लिए धन्यवाद! – elefun

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