Ich arbeite mit Volumes (3D-Matrizen) und habe geometrische Transformations- und Verschiebungsfelder von der Funktion erhalten imregtform . 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 nicht verwenden Imwarp wie 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 . 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. Aber sie replizieren nicht was Imwarp tut. Es wäre eine große Hilfe, wenn jemand meinen Fehler aufzeigen oder mich auf andere Weise führen könnte.
Vielen Dank.