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.

user10859
quelle