www.gusucode.com > 二维重建三维重建源码程序 > 二维重建三维重建源码程序/demons3d/compose.m

    %% Compose two vector fields
%  Changed: Dec 31st, 2011
%
function [vx,vy,vz] = compose(ax,ay,az, bx,by,bz)

    % Piggyback
    piggybackscale = 1.2; % just to get too many outside values
    [ax,lim] = piggyback(ax,piggybackscale);
    [ay,lim] = piggyback(ay,piggybackscale);
    [az,lim] = piggyback(az,piggybackscale);
    [bx,lim] = piggyback(bx,piggybackscale);
    [by,lim] = piggyback(by,piggybackscale);
    [bz,lim] = piggyback(bz,piggybackscale);

    % Coordinates
    nx = size(ax,1);
    ny = size(ax,2);
    nz = size(ax,3);
    
    [y,x,z] = ndgrid(1:nx, 1:ny, 1:nz); % coordinate image

    % Where points are going
    xp  = iminterpolate(x+ax, bx,by,bz);
    yp  = iminterpolate(y+ay, bx,by,bz);
    zp  = iminterpolate(z+az, bx,by,bz);
    
    % Update field
    vx = xp - x;
    vy = yp - y;
    vz = zp - z;
    
    % Zero vectors going outside the image
    zr  = (xp==0 & yp==0 & zp==0);
    vx(zr) = 0;
    vy(zr) = 0;
    vz(zr) = 0;

    % Unpiggyback
    vx = vx(lim(1):lim(2),lim(3):lim(4),lim(5):lim(6));
    vy = vy(lim(1):lim(2),lim(3):lim(4),lim(5):lim(6));
    vz = vz(lim(1):lim(2),lim(3):lim(4),lim(5):lim(6));
    
end