2013-08-22 17 views
5

Ich habe 3D-Bild eines Gehirns (nennen wir es Flash) und es ist derzeit 263 x 256 x 185. Ich möchte es auf die Größe eines anderen Bildes ändern (nennen Sie es whole_brain_bravo) ; 256 x 256 x 176, und (hoffentlich) eine Lanczos-Interpolation zum Resamplen verwenden (Image.ANTIALIAS). Mein (fehlgeschlagener) Versuch:Größe eines 3D-Bildes (und 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 

Haben Sie jemals so etwas auf einem 3D-Bild gemacht?

Antwort

3

Vom docstring für 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. 
""" 

Was den Skalierungsfaktor zwischen den beiden Bildern ist? Ist es über alle Achsen hinweg konstant (d. H. Skalieren Sie isometrisch)? In diesem Fall sollte ein einzelner Gleitkommawert sein. Ansonsten sollte es eine Folge von Schwimmern sein, eine pro Achse.

Zum Beispiel wenn die physischen Dimensionen der whole und flash kann angenommen werden, dass sie gleich, dann sind Sie so etwas tun könnte:

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

Das ist eigentlich gut, danke. Würdest du auch wissen, wie man von jeder Chance zurückgestuft wird? – elefun

+0

Das ist es, was "np.interpolation.zoom" dazu bringt, '' flash'' zu verlieren! Sie können die Reihenfolge der Spline-Interpolation über den Parameter 'order =' ändern (mir ist keine Implementierung der Lanczos-Interpolation in numpy/scipy bekannt). –

+0

Ah, ich verstehe was du meinst. Ich hatte gehofft, ich könnte Lanczos benutzen. Es ist jedoch nicht so eine große Sache. Und ja, lanczos ist in der Python-Imaging-Bibliothek implementiert; Image.ANTIALIAS ist eigentlich ein 3-Lappen Lanczos in C geschrieben (nach der Dokumentation) – elefun

1

die Dokumentation nach, die zoom Argument ist die „ Zoomfaktor entlang der Achsen ". Das ist ein bisschen vage, aber es klingt, als ob sie eher einen Skalierungsfaktor als die gewünschte Dimension meinen.

Versuchen Sie folgendes:

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

Nicht sicher einen Filter über die Wahl - die docs erwähnen nur Spline-Interpolation verschiedener Ordnungen.

+0

Wie würden Sie ein Resampling eines 3D-Bildes in Python generell durchführen? Wie gesagt, ich gebe dir ein Bild, und du schaust darauf und gehst "Oh, das sieht scheiße aus, ich sollte wahrscheinlich einen nächsten Nachbarn machen, um es ein bisschen schöner zu machen", wie würdest du es tun? – elefun

+0

In welchem ​​Sinn würde das Downsampling eines Bildes es jemals * schöner * aussehen lassen? Wenn ich ein Array resample, würde ich versuchen, scipy.ndimage.interpolation.zoom zu verwenden. Funktioniert das nicht für dich? Ich bin sicher, es gibt viele Möglichkeiten, es zu tun, aber wenn Sie nicht beschreiben, warum dieses nicht gut genug ist, kann ich Ihnen nicht helfen. – Brionius

+0

Es ist nicht, dass es nicht gut genug ist, ich mag nur die Ergebnisse, die Lanczos Schema hat, wenn Downsampling, sagen wir, ein JPEG, also wollte ich es vielleicht in einem 3D-Bild reproduzieren. Aber es ist keine große Sache, Spline ist in Ordnung (hehe ich reimte). Danke für Ihre Hilfe! – elefun