2013-08-22 16 views
5

Ho un'immagine 3D di un cervello (chiamiamolo flash) ed è attualmente 263 x 256 x 185. Voglio ridimensionarlo per avere le dimensioni di un'altra immagine (chiamalo intero_brain_bravo) ; 256 x 256 x 176 e (si spera) utilizzare un'interpolazione lanczos per ricampionare (Image.ANTIALIAS). Il mio (fallito) tentativo:Ridimensionamento di un'immagine 3D (e ricampionamento)

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 

Avete mai fatto questo genere di cose su un'immagine 3D?

risposta

3

Dal docstring per scipy.ndimage.interpolate.zoom:

""" 
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. 
""" 

Qual è il fattore di scala tra le due immagini? È costante su tutti gli assi (vale a dire ridimensionamento isometrico)? In tal caso, zoom dovrebbe essere un valore float singolo. Altrimenti dovrebbe essere una sequenza di galleggianti, uno per asse.

Per esempio, se le dimensioni fisiche del whole e flash possono essere considerate uguali, allora si potrebbe fare qualcosa di simile:

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

Questo è davvero buono, grazie. Sapresti anche come ricampionare per qualche occasione? – elefun

+0

Questo è ciò che 'np.interpolation.zoom' produce per' downed' da 'flash'! È possibile modificare l'ordine dell'interpolazione della spline che utilizza tramite il parametro 'order =' (non sono a conoscenza di alcuna implementazione dell'interpolazione di Lanczos in numpy/scipy). –

+0

Ah, capisco cosa intendi. Speravo di poter usare Lanczos. Comunque non è un grosso problema. E sì lanczos è implementato nella libreria di imaging python; Image.ANTIALIAS è in realtà un lanczos a 3 lobi scritto in C (secondo la documentazione) – elefun

1

Secondo la documentazione, l'argomento zoom è "The fattore di zoom lungo gli assi ". È un po 'vago, ma sembra che intendano un fattore di scala, piuttosto che la dimensione desiderata.

Prova questo:

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

Non sono sicuro sulla scelta di un filtro - la documentazione citare solo interpolazioni spline di vari ordini.

+0

Come procederesti a ricampionare un'immagine 3D in python in generale? Come dire ti do un'immagine, e la guardi e vai "oh questa sembra una merda, dovrei probabilmente fare un vicino più vicino per renderlo un po 'più bello", come lo faresti? – elefun

+0

In che senso il downsampling di un'immagine lo farà sembrare * più bello *? Se volessi ricampionare un array, immagino che proverei a usare scipy.ndimage.interpolation.zoom. Non funziona per te? Sono sicuro che ci sono molti modi per farlo, ma se non descrivi perché questo non è abbastanza buono, non posso aiutarti. – Brionius

+0

Non è che non sia abbastanza buono, mi piacciono solo i risultati che lo schema di lanczos ha quando si esegue il downsampling, ad esempio un jpeg, quindi ho voluto magari riprodurlo in un'immagine 3d. Ma non è un grosso problema, la spline va bene (hehe ho fatto rima). Grazie per l'aiuto! – elefun

Problemi correlati