Code covered by the BSD License  

Highlights from
multimodality non-rigid demon algorithm image registration

image thumbnail
from multimodality non-rigid demon algorithm image registration by Dirk-Jan Kroon
non-rigid 2D and 3D image registration with demon (fluid) algorithm, extended with modality transf.

[I1_TF,I2_TF]=mutual_transform_2d_double(I1,I2,I1_moved,I2_moved,range,HistogramBins,Hkernel, SampleDistance)
function [I1_TF,I2_TF]=mutual_transform_2d_double(I1,I2,I1_moved,I2_moved,range,HistogramBins,Hkernel, SampleDistance)
% This function transform one image modality into another.
% 
% [I1_TF,I2_TF]=mutual_transform_2d_double(I1,I2,I1_moved,I2_moved,range,HistogramBins,Hkernel, SampleDistance)
%
% Function is written by D. Kroon University of Twente(March 2009)


% Loop through all locations on which the histogram data is sampled
I1_TF=zeros(size(I1));
I2_TF=zeros(size(I2));
        
Histograms_sizes=ceil(size(I1)/SampleDistance);

halfKernel=(size(Hkernel,1)-1)/2;
halfSample=(SampleDistance-1)/2;

for hist_x=0:(Histograms_sizes(1)-1)
    for hist_y=0:(Histograms_sizes(2)-1)
        % Calculate the image coordinates of a location histogram
        image_x_center=hist_x*SampleDistance+halfSample;
        image_y_center=hist_y*SampleDistance+halfSample;

        % Check boundary conditions
        image_x_center(image_x_center>(size(I1,1)-1)) = size(I1,1)-1;
        image_y_center(image_y_center>(size(I1,2)-1)) = size(I1,2)-1;
        
        % Calculate the part of the kernel inside the image
        kernel_x_start=halfKernel-image_x_center; 
        kernel_y_start=halfKernel-image_y_center; 
        kernel_x_end=size(I1,1)-1+halfKernel-image_x_center; 
        kernel_y_end=size(I1,2)-1+halfKernel-image_y_center; 
       
        % Kernel Boundary conditions
        kernel_x_start(kernel_x_start<0)=0;
        kernel_y_start(kernel_y_start<0)=0;
        kernel_x_end(kernel_x_end>(size(Hkernel,1)-1))=(size(Hkernel,1)-1);
        kernel_y_end(kernel_y_end>(size(Hkernel,2)-1))=(size(Hkernel,2)-1);
                 
        % Image Region which uses this kernel
        image_x_start=image_x_center-halfSample; 
        image_x_end=image_x_center+halfSample; 
        image_y_start=image_y_center-halfSample; 
        image_y_end=image_y_center+halfSample; 
        
        % Boundary conditions on the image region
        image_x_start(image_x_start<0)=0;
        image_x_end(image_x_end>(size(I1,1)-1))=size(I1,1)-1;
        image_y_start(image_y_start<0)=0;
        image_y_end(image_y_end>(size(I1,2)-1))=size(I1,2)-1;
        
        % Make an histogram for I1 on I2 transformed and visa versa
        Histogram_I1=zeros([HistogramBins HistogramBins]);
        Histogram_I2=zeros([HistogramBins HistogramBins]);

        % Loop through the kernel
        for kernel_x=kernel_x_start:kernel_x_end,
            for kernel_y=kernel_y_start:kernel_y_end,
                 % The current image coordinates
                 image_x=image_x_center+kernel_x-halfKernel;
                 image_y=image_y_center+kernel_y-halfKernel;
                 
                 % The current histogram location
                 hist2d_x=round((HistogramBins-1)/(range(2)-range(1))*(I1(image_x+1,image_y+1)-range(1)));
                 hist2d_y=round((HistogramBins-1)/(range(2)-range(1))*(I2_moved(image_x+1,image_y+1)-range(1)));
                 
                 % Update the 2D histogram with the kernel value
                 Histogram_I1(hist2d_x+1,hist2d_y+1)=Histogram_I1(hist2d_x+1,hist2d_y+1)+Hkernel(kernel_x+1,kernel_y+1);
                 
                 % The current histogram location
                 hist2d_x=round((HistogramBins-1)/(range(2)-range(1))*(I1_moved(image_x+1,image_y+1)-range(1)));
                 hist2d_y=round((HistogramBins-1)/(range(2)-range(1))*(I2(image_x+1,image_y+1)-range(1)));
                 
                 % Update the 2D histogram with the kernel value
                 Histogram_I2(hist2d_x+1,hist2d_y+1)=Histogram_I2(hist2d_x+1,hist2d_y+1)+Hkernel(kernel_x+1,kernel_y+1);
            end
        end

        % Loop throught the image region which uses this kernel/histograms
        for image_x=image_x_start:image_x_end
            for image_y=image_y_start:image_y_end;
                
                   hist2d_x=round((HistogramBins-1)/(range(2)-range(1))*(I1(image_x+1,image_y+1)-range(1)));
                   [temp,hist2d_y]=max(Histogram_I1(hist2d_x+1,:)); hist2d_y=hist2d_y-1;
                   I1_TF(image_x+1,image_y+1)=hist2d_y/((HistogramBins-1)/(range(2)-range(1)))+range(1);

                   hist2d_y=round((HistogramBins-1)/(range(2)-range(1))*(I2(image_x+1,image_y+1)-range(1)));
                   [temp,hist2d_x]=max(Histogram_I2(:,hist2d_y+1)); hist2d_x=hist2d_x-1;
                   I2_TF(image_x+1,image_y+1)=hist2d_x/((HistogramBins-1)/(range(2)-range(1)))+range(1);
            end
        end        
        

    end
end











Contact us at files@mathworks.com