Я работаю с Объемами (трехмерными матрицами), и я получил геометрические поля преобразования и смещения от функции imregtform. Мое движущееся изображение и фиксированное изображение являются двоичными изображениями (0 и 1). Теперь я хочу применить то же геометрическое преобразование (или поле смещения) к другой версии (это не двоичное изображение) движущегося изображения. Я не хочу использовать imwarp, поскольку он меняет значения в изображении. Итак, я хотел бы применить преобразование, не затрагивая значения в изображении.
Я написал следующую функцию MATLAB, чтобы сделать то же самое, используя поле Displacement:
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
Я также пытался использовать tform. Ниже приведен код для этого.
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
Обе функции возвращают один и тот же результат, который ожидается. Но они не копируют то, что делает imwarp . Было бы очень полезно, если бы кто-то мог указать на мою ошибку или направить меня другим путем.
Благодарю.