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.

calcgrad3D(base,distmask,dgridx,dgridy,dgridz,alpha,beta,fpoints,fpoints2)
function [gradgridx,gradgridy,gradgridz] = calcgrad3D(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));
% sum1 = zeros(sz(1),sz(2));
% sum2 = zeros(sz(1),sz(2));
% sum3 = zeros(sz(1),sz(2));
% sum4 = zeros(sz(1),sz(2));
% sum5 = zeros(sz(1),sz(2));
% sum6 = zeros(sz(1),sz(2));
% sum7 = zeros(sz(1),sz(2));
% alpha = 1;
        mstart = (((sz(1)/2)-6)*sz2(1)/(sz(1)-3))+0.5;
        mend = (((sz(1)/2)+3)*sz2(1)/(sz(1)-3))+0.5;
        nstart = (((sz(2)/2)-6)*sz2(2)/(sz(2)-3))+0.5;
        nend = (((sz(2)/2)+3)*sz2(2)/(sz(2)-3))+0.5;
        pstart = (((sz(3)/2)-6)*sz2(3)/(sz(3)-3))+0.5;
        pend = (((sz(3)/2)+3)*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);
for m = 2:sz(1)-1
    for n = 2:sz(2)-1
        for p = 2:sz(3)-1

        mstart = ((m-6)*sz2(1)/(sz(1)-3))+0.5;
        mend = mstart + mspace;
        nstart = ((n-6)*sz2(2)/(sz(2)-3))+0.5;
        nend = nstart + nspace;
        pstart = ((p-6)*sz2(3)/(sz(3)-3))+0.5;
        pend = pstart + pspace;
        
        xind = find( 1:sz2(2) >= nstart & 1:sz2(2) <= nend);
        yind= find( 1:sz2(1) >= mstart & 1:sz2(1) <= mend);
        zind= find( 1:sz2(3) >= pstart & 1:sz2(3) <= pend);

if ~isempty(yind) && ~isempty(xind) && ~isempty(xind)
    
        [FX,FY,FZ] = gradient(distsource(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)));
        [dLXdpx] = dLdPx3D(base(yind(1):yind(end),xind(1):xind(end)),sz,sz2,m,n,p,yind(1)-1,xind(1)-1,zind(1)-1);
        [dLYdpy] = dLdPy3D(base(yind(1):yind(end),xind(1):xind(end)),sz,sz2,m,n,p,yind(1)-1,xind(1)-1,zind(1)-1);
        [dLZdpz] = dLdPz3D(base(yind(1):yind(end),xind(1):xind(end)),sz,sz2,m,n,p,yind(1)-1,xind(1)-1,zind(1)-1);
        [valuesx] = ddLdxdPx3D(base(yind(1):yind(end),xind(1):xind(end)),sz,sz2,m,n,p,yind(1)-1,xind(1)-1,zind(1)-1);      
        [valuesy] = ddLdydPy3D(base(yind(1):yind(end),xind(1):xind(end)),sz,sz2,m,n,p,yind(1)-1,xind(1)-1,zind(1)-1);
        [valuesz] = ddLdzdPz3D(base(yind(1):yind(end),xind(1):xind(end)),sz,sz2,m,n,p,yind(1)-1,xind(1)-1,zind(1)-1);
        efeat = dferror3D(fpoints,fpoints2,m,n,p,dgridx,dgridy,dgridz);
%         sum1(m,n) = length(yind)*length(xind);
%         sum2(m,n) = xind(1)-nstart;
%         sum3(m,n) = sum(sum(dLXdpx));
%         sum4(m,n) = sum(sum(dLYdpy));
%         sum5(m,n) = sum(sum(valuesx));
%         sum6(m,n) = sum(sum(valuesy));
%         sum7(m,n) = 2*alpha*sum(sum((LXx(yind(1):yind(end),xind(1):xind(end)).*valuesx)+...
%             (LXy(yind(1):yind(end),xind(1):xind(end)).*valuesy)));

        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.*dLXdpx))))+2*alpha*sum(sum(sum((LXx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesx)+...
            (LXy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesy)+ ...
            (LXz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesz)))) + 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.*dLYdpy))))+2*alpha*sum(sum(sum((LYx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesx)+...
            (LYy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesy)+ (LYz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesz))))+ 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.*dLZdpz))))+2*alpha*sum(sum(sum((LZx(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesx)+...
            (LZy(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesy)+ (LZz(yind(1):yind(end),xind(1):xind(end),zind(1):zind(end)).*valuesz))))+ beta*efeat(3);
end
        end
    end
end

Contact us at files@mathworks.com