Code covered by the BSD License  

Highlights from
3D Free Form Image Registration Toolbox (GUI)

image thumbnail
from 3D Free Form Image Registration Toolbox (GUI) by Daniel Markel
A toolbox for performing image registrations on 4D RTOG files or any other volumetric image.

calcgrad3D2(base,distmask,dgridx,dgridy,dgridz,alpha,beta,fpoints,fpoints2)
function [gradgridx,gradgridy,gradgridz] = calcgrad3D2(base,distmask,dgridx,dgridy,dgridz,alpha,beta,fpoints,fpoints2)

%distance transforms of images.
% distmask = bwdist(mask,'quasi-euclidean');
sz = size(dgridx);
sz2 = size(base);
gradgridx = zeros(sz(1),sz(2),sz(3));
gradgridy = zeros(sz(1),sz(2),sz(3));
gradgridz = zeros(sz(1),sz(2),sz(3));
        mstart = (((sz(1)/2)-4)*sz2(1)/(sz(1)-3))+0.5;
        mend = (((sz(1)/2)+1)*sz2(1)/(sz(1)-3))+0.5;
        nstart = (((sz(2)/2)-4)*sz2(2)/(sz(2)-3))+0.5;
        nend = (((sz(2)/2)+1)*sz2(2)/(sz(2)-3))+0.5;
        pstart = (((sz(3)/2)-4)*sz2(3)/(sz(3)-3))+0.5;
        pend = (((sz(3)/2)+1)*sz2(3)/(sz(3)-3))+0.5;
        nspace = round(nend - nstart);
        mspace = round(mend - mstart);
        pspace = round(pend - pstart);

[image1,distsource] = imrecreate3D(base,dgridx,dgridy,dgridz);
clear image1 base
[LXy,LYy,LZy] = dLdy3D(sz2,dgridx,dgridy,dgridz);
[LXx,LYx,LZx] = dLdx3D(sz2,dgridx,dgridy,dgridz);
[LXz,LYz,LZz] = dLdz3D(sz2,dgridx,dgridy,dgridz);
zarray = zeros(1,1,sz2(3));
zarray(:) = 1:sz2(3);
X = repmat(1:sz2(2),[sz2(1),1,sz2(3)]);
Y = repmat((1:sz2(1))',[1,sz2(2),sz2(3)]);
Z = repmat(zarray,[sz2(1),sz2(2),1]);
valuesx = zeros(sz2(1),sz2(2),sz2(3));
valuesy = zeros(sz2(1),sz2(2),sz2(3));
valuesz = zeros(sz2(1),sz2(2),sz2(3));
dLdp = zeros(sz2(1),sz2(2),sz2(3));
for m = 2:sz(1)-1
      mstart = ((m-4)*sz2(1)/(sz(1)-3))+0.5;
      mend = mstart + mspace;
      yind= find( 1:sz2(1) >= mstart & 1:sz2(1) <= mend);
      if ~isempty(yind)
      i = floor(((Y-0.5).*(sz(1)-3)./sz2(1))+2)-1;
    for n = 2:sz(2)-1
        nstart = ((n-4)*sz2(2)/(sz(2)-3))+0.5;
        nend = nstart + nspace;
        xind = find( 1:sz2(2) >= nstart & 1:sz2(2) <= nend);
        if ~isempty(xind)
        j = floor(((X-0.5).*(sz(2)-3)./sz2(2))+2)-1;
      
        for p = 2:sz(3)-1
        pstart = ((p-4)*sz2(3)/(sz(3)-3))+0.5;
        pend = pstart + pspace;
        zind= find( 1:sz2(3) >= pstart & 1:sz2(3) <= pend);
        if ~isempty(zind)&& length(zind) > 1

    
        [FX,FY,FZ] = gradient(distsource(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)));

% sz3 = [yind(end)-yind(1)+1,xind(end)-xind(1)+1,zind(end)-zind(1)+1];

dudx = (sz(2)-3)/sz2(2);
dvdy = (sz(1)-3)/sz2(1);
dwdz = (sz(3)-3)/sz2(3);

        
        
        k = floor(((Z-0.5).*(sz(3)-3)./sz2(3))+2)-1;
        indices = find( m-i >=0 & m-i <=3 & n-j >=0 & n-j <=3 & p-k >=0 & p-k <=3); 

              u = ((X(indices)-0.5).*(sz(2)-3)./sz2(2))+2 - floor(((X(indices)-0.5).*(sz(2)-3)./sz2(2))+2);
              v = ((Y(indices)-0.5).*(sz(1)-3)./sz2(1))+2 - floor(((Y(indices)-0.5).*(sz(1)-3)./sz2(1))+2);
              w = ((Z(indices)-0.5).*(sz(3)-3)./sz2(3))+2 - floor(((Z(indices)-0.5).*(sz(3)-3)./sz2(3))+2);
              a = bspline(u,n-j(indices));
              b = bspline(v,m-i(indices));
              c = bspline(w,p-k(indices));
              d = dbspline(u,n-j(indices));
              e = dbspline(v,m-i(indices));
              f = dbspline(w,p-k(indices));


            valuesx(indices) = d.*b.*c.*dudx;
            valuesy(indices) = a.*e.*c.*dvdy;
            valuesz(indices) = a.*b.*f.*dwdz;
            dLdp(indices) = a.*b.*c;

      
efeat = dferror3D(fpoints,fpoints2,m,n,p,dgridx,dgridy,dgridz,sz2,sz);


        gradgridx(m,n,p) = -2*sum(sum(sum( (distmask(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end))-distsource(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))...
            .*(FX.*dLdp(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end))))))+2*alpha*sum(sum(sum((LXx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))+...
            (LXy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))+ ...
            (LXz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))))) + beta*efeat(2);
        
        gradgridy(m,n,p) = -2*sum(sum(sum( (distmask(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end))-distsource(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))...
            .*(FY.*dLdp(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end))))))+2*alpha*sum(sum(sum((LYx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))+...
            (LYy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))+ (LYz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end))))))+ beta*efeat(1);
        
        gradgridz(m,n,p) = -2*sum(sum(sum( (distmask(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end))-distsource(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))...
            .*(FZ.*dLdp(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end))))))+2*alpha*sum(sum(sum((LZx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))+...
          (LZy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)))+ (LZz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end))))))+ beta*efeat(3);
        valuesx(:,:,:) = 0;
        valuesy(:,:,:) = 0;
        valuesz(:,:,:) = 0;
        dLdp(:,:,:) = 0;
        end

        end
        end

    end
      end

end

Contact us at files@mathworks.com