2011-07-21 24 views
6

Posiadam zestaw 2-D plasterków obrazu o tym samym rozmiarze. Użyłem MATLAB do ułożenia ich w stos w celu utworzenia danych wolumetrycznych. Podczas gdy wielkość 2-D plasterków wynosi 480 x 488 pikseli, kierunek, w którym układane są obrazy, nie jest wystarczająco szeroki, aby wizualizować objętość w różnej orientacji podczas rzutowania. Muszę interpolować wzdłuż plasterków, aby zwiększyć rozmiar wizualizacji.Interpolowanie wzdłuż plasterków obrazu 2D

Czy ktoś może dać mi pomysł lub wskazówkę, jak to zrobić?

Edycja: Anotated przewidywane obrazy mikroskopii-

Looking at a face

General view

Figury 1 jest to widok z góry na przewidywanej wielkości.

Rysunek 2 to rzut boczny rzutowanej objętości.

Po zmianie kąta obrotu i próbie wizualizacji objętości w różnych orientacjach, np. widok z boku (rysunek 2), to co widzę jak na rysunku 2.

Chcę rozszerzyć widok boczny poprzez interpolację wzdłuż plasterków obrazu.

+0

W jakiej aplikacji pracujesz? Czy jest to związane z obrazowaniem medycznym (np. CT)? –

+0

Alceu, pracuję nad obrazami mikroskopowymi. – Sequentialrant

Odpowiedz

3

MATLAB ma funkcję interp3, która może być użyta do interpolacji, przy założeniu, że dane są dyskretnie dyskretne.

Zapoznaj się z documentation.

Mam nadzieję, że to pomoże.

EDIT: Funkcja MATLAB interp3 działa następująco:

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

Zakładam, że „komin” plasterki definiuje macierze x, y, z, v jak 3D tablic, gdzie x, y są współrzędne pikseli w płaszczyźnie, z to "wysokość" każdego plasterka, a v to rzeczywiste plasterki obrazu, może jako wartości "intensywności" dla pikseli.

Jeśli chcesz interpolować nowe wycinki obrazu o wartościach pośrednich z, możesz określić te poziomy w tablicy zi. Macierze xi, yi ponownie będą reprezentować współrzędne pikseli w płaszczyźnie.

+0

Dzięki za sugestię, Darren.Zasadniczo próbuję dodać plasterki między plasterkami. Nie mogłem zrozumieć, co masz na myśli przez "jednolicie dyskretyzowane" dane. Jestem całkiem nowy w tym. Czy możesz mi pomóc zrozumieć, opracowując go. – Sequentialrant

+1

Zobacz moją edycję dla nieco więcej informacji. Jeśli to nie pomoże, może opublikuj jeszcze kilka szczegółów na temat swojego problemu. "Jednolita dyskretyzacja" w tym przypadku oznacza, że ​​dane są uporządkowane zgodnie z siatką kartezjańską (w przeciwieństwie do rozproszonej triangulacji na przykład) - jestem dość pewny, że twój problem jest jednolity. –

+0

Wyjaśnienie +1 dla @DarrenEngwirda, plasterki obrazu 2D mają jednolite położenie siatki (lokalizacje pikseli i wysokość plasterków). Jeśli z jakiegoś powodu tak nie jest, możesz użyć 'griddata3' /' TriScatteredInterp' do interpolacji rozproszonych danych ... – Amro

4

Oto dostosowany przykład z MATLAB documentation na temat wizualizacji danych objętościowych (podobny do Ciebie), stosując 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

stworzyłem funkcję interpolacji wzdłuż plastry obrazu. Poniżej znajduje się kod:

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