2011-07-21 13 views
6

Ho un set di fette di immagini 2-D della stessa dimensione. Ho usato MATLAB per impilarli per creare dati volumetrici. Mentre la dimensione delle sezioni 2-D è di 480x488 pixel, la direzione in cui le immagini sono impilate non è sufficientemente ampia da visualizzare il volume con un diverso orientamento quando proiettato. Ho bisogno di interpolare lungo le sezioni per aumentare le dimensioni per la visualizzazione.Interpolazione lungo le sezioni di immagine 2D

Qualcuno può darmi un'idea o un suggerimento su come farlo?

Edit: Anotated proiettato microscopia-immagini

Looking at a face

General view

La figura 1 è la vista dall'alto del volume previsto.

La figura 2 è la vista laterale del volume proiettato.

Quando cambio l'angolo di rotazione e cerco di visualizzare il volume con un orientamento diverso, ad es. vista laterale (figura 2), è quello che vedo come in figura 2.

Desidero espandere la vista laterale interpolando lungo le sezioni di immagine.

+0

In che tipo di applicazione stai lavorando? È legato alla diagnostica per immagini (ad esempio CT)? –

+0

Alceu, sto lavorando su immagini al microscopio. – Sequentialrant

risposta

3

MATLAB ha una funzione interp3 che può essere utilizzata per l'interpolazione, presupponendo che i dati siano uniformemente discretizzati.

Controllare il documentation.

Spero che questo aiuti.

EDIT: La funzione MATLAB interp3 funziona come segue:

vi = interp3(x, y, z, v, xi, yi, zi); 

Presumo che la "pila" di fette definisce le matrici x, y, z, v come 3D array, dove x, y sono le coordinate dei pixel nel piano, z è l'altezza di ogni sezione e v sono le sezioni effettive dell'immagine, forse come valori di "intensità" per i pixel.

Se si desidera interpolare nuove sezioni di immagine a valori intermedi z, è possibile specificare questi livelli nell'array zi. Gli array xi, yi rappresenterebbero nuovamente le coordinate dei pixel nel piano.

+0

Grazie per il suggerimento, Darren.In pratica sto cercando di aggiungere fette tra le fette. Non capisco cosa intendi per dati "uniformemente discretizzati". Sono abbastanza nuovo a questo. Per favore, aiutami a capirlo elaborandolo. – Sequentialrant

+1

Vedere la mia modifica per maggiori informazioni. Se questo non aiuta, inserisci alcuni dettagli sul tuo problema. Una "discretizzazione uniforme" in questo caso significa che i dati sono strutturati secondo una griglia cartesiana (al contrario di una triangolazione sparsa per esempio) - Sono abbastanza fiducioso che il tuo problema è uniforme. –

+0

+1 come spiegato da @DarrenEngwirda, le sezioni di immagini 2D hanno posizioni di griglia uniformi (posizioni dei pixel e altezza della sezione). Se per qualche motivo non è così, puoi usare 'griddata3' /' TriScatteredInterp' per interpolare i dati sparsi ... – Amro

4

Ecco un esempio tratto dal MATLAB documentation su come visualizzare i dati volumetrici (simile al tuo) utilizzando isosurfaces:

%# load MRI dataset: 27 slices of 128x128 images 
load mri 
D = squeeze(D);  %# 27 2D-images 

%# view slices as countours 
contourslice(D,[],[],1:size(D,3)) 
colormap(map), view(3), axis tight 

%# apply isosurface 
figure 
%#D = smooth3(D); 
p = patch(isosurface(D,5)); 
isonormals(D, p); 
set(p, 'FaceColor',[1,.75,.65], 'EdgeColor','none') 
daspect([1 1 .5]), view(3), axis tight, axis vis3d 
camlight, lighting gouraud 

%# add isocaps 
patch(isocaps(D,5), 'FaceColor','interp', 'EdgeColor','none'); 
colormap(map) 

contourslice isosurface_isocaps

0

ho creato una funzione per interpolare lungo sezioni dell'immagine. Segue il codice:

function res = interp_along_slices(vol, scale) 
    % Interpolation along the image slices 

    % Get the size of the volume 
     [r c p] = size(vol); 

    % Pre-allocate the array: 
    % the third dimension is scale times the p 
     vol_interp = zeros(r,c,scale*p); 

    % interpolate along the image slices 
     for inr = 1:r; 
      for jnr = 1:c; 
       xi = vol(inr,jnr,:); 
       vol_interp(inr,jnr,:) = interp(xi, scale); 
      end; 
     end; 

     res = vol_interp; 

    end