Verformungsfeld anwenden, ohne die Intensitäten zu beeinflussen
Ich arbeite mit Volumes (3D-Matrizen) und habe geometrische Transformations- und Verschiebungsfelder aus der Funktion " Imregtform" erhalten . Mein Bewegtbild und Festbild sind binäre Bilder (0s und 1s). Jetzt möchte ich dieselbe geometrische Transformation (oder das Verschiebungsfeld) auf eine andere Version (diese Version ist kein binäres Bild) des bewegten Bildes anwenden. Ich möchte imwarp nicht verwenden, da es die Werte im Bild ändert. Ich möchte also die Transformation anwenden, ohne die Werte im Bild zu beeinflussen.
Ich habe die folgende MATLAB-Funktion geschrieben, um dasselbe mit dem Feld Verschiebung zu tun:
function [ Volumeafterd ] = ApplyDeformation2Volume( Volume, Deformation, OPFilename) % Detailed explanation goes here %% Check the Size SizeD = size(Deformation); SizeV = size(Volume); Volumeafterd = zeros(SizeV(1),SizeV(2),SizeV(3)); if SizeV(1) == SizeD(1) & SizeV(2) == SizeD(2) & SizeV(3) == SizeD(3) %% Apply the Deformation fnd = find(Volume~=0); counterd1=0; for it=1:length(fnd) [x,y,z] = ind2sub(SizeV,fnd(it)); d1 = squeeze(Deformation(x,y,z,:)); x1=round(x+d1(1));y1=round(y+d1(2));z1=round(z+d1(1)); if x1<1 | y1<1|z1<1 fprintf('Non positive index (D1) for x %d, y %d, z %d adding %d,%d,%d to get x %d,y %d,z %d\n'... ,x,y,z,d1(1),d1(2),d1(3),x1,y1,z1); end if (x1>=1 & y1>=1 & z1>=1) if (Volumeafterd(x1,y1,z1)~=0) %fprintf('Over writing %d %d %d\n',x1,y1,z1); counterd1 = counterd1+1; end Volumeafterd(x1,y1,z1) = Volume(x,y,z); end end fprintf("Overwritten counter : %d\n",counterd1); else fprintf("The size of Deformation field and the volume does not match\nThe output will be empty Volume \n"); end end
Ich habe auch versucht, die Tform zu verwenden . Nachfolgend ist der Code dafür.
function [ Volumeafterd ] = Applytform2Volume( Volume, TForm, OPFilename) szV = size(Volume); Volumeafterd = zeros(szV(1),szV(2),szV(3)); counter=0; %find the non zeros labelled voxels fndnz = find(Volume~=0); for i = 1:length(fndnz) %for i1 = 1:szV(1) % for i2= 1:szV(2) % for i3 = 1:szV(3) [i1,i2,i3] = ind2sub(size(Volume),fndnz(i)); [nx,ny,nz ] = transformPointsForward(TForm,i1,i2,i3); nr = round([nx,ny,nz ]); nx=nr(1); ny=nr(2); nz=nr(3); %if nx<1 | ny<1|nz<1 %fprintf('Non positive index (D1) for x %d, y %d, z %d to get x %d,y %d,z %d\n'... %,i1,i2,i3,nx,ny,nz); %else try Volumeafterd(nx,ny,nz) = Volume(i1,i2,i3); catch % fprintf('Non positive index (D1) for x %d, y %d, z %d to get x %d,y %d,z %d\n'... %,i1,i2,i3,nx,ny,nz); counter = counter+1; end end %end % end % end %end fprintf('Counter %d for %s \n',counter,OPFilename); end
Beide Funktionen geben die gleiche Ausgabe zurück, die erwartet wird. Sie replizieren jedoch nicht, was Imwarp macht. Es wäre eine große Hilfe, wenn jemand meinen Fehler aufzeigen oder mich auf andere Weise führen könnte.
Vielen Dank.
0 Antworten auf die Frage
Verwandte Probleme
-
1
Simulink ist für Matlab wie _______ für Mathematica?
-
1
webMathematica ist für Mathematica wie _________ für Matlab
-
6
Wo ist meine Software in Linux installiert?
-
4
Wie kann die Ausführung eines Matlab-Programms beschleunigt werden?
-
1
Ändern Sie die Datei von .mat in .txt
-
1
MATLAB-Säulenumwicklung
-
1
Wie kann ich das Befehlsfenster von matlab in emacs verwenden?
-
2
So legen Sie den Remotecomputer so fest, dass Matlab über die Weiterleitung von ssh und x11 ausgefüh...
-
1
Unterscheidung zwischen a / b-Versionen von Matlab?
-
1
'ttest'-Funktion funktioniert in Matlab nicht