Я работаю с Объемами (трехмерными матрицами), и я получил геометрические поля преобразования и смещения от функции 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 . Было бы очень полезно, если бы кто-то мог указать на мою ошибку или направить меня другим путем.

Благодарю.

0