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.

[hist12, hist1, hist2]=mutual_histogram_double(I1,I2,Imin,Imax,nbins)
function [hist12, hist1, hist2]=mutual_histogram_double(I1,I2,Imin,Imax,nbins)
% This function makes a 2D joint histogram of 1D,2D...ND images
% and also calculates the seperate histograms of both images.
%
% [hist12, hist1, hist2]=mutual_histogram_double(I1,I2,Imin,Imax,nbins)
%
% Function is written by D.Kroon University of Twente (February 2009)
%

% Number of bins must be integer
nbins=round(nbins);

% scaling value 
scav=nbins/(Imax-Imin);

% Indices (1D) of all pixels
index=1:numel(I1);

% Calculate histogram positions
xd=scav*(I1(index)-Imin);
yd=scav*(I2(index)-Imin);

% Calculate both neighbors and interpolation percentages
xm=floor(xd); xp=xm+1;
xmd=xp-xd; xpd=xd-xm;
ym=floor(yd); yp=ym+1;
ymd=yp-yd; ypd=yd-ym;

% Fit to range ...
xm(xm<0)=0; xp(xp<0)=0;
xm(xm>(nbins-1))=(nbins-1); xp(xp>(nbins-1))=(nbins-1);
ym(ym<0)=0; yp(yp<0)=0;
ym(ym>(nbins-1))=(nbins-1); yp(yp>(nbins-1))=(nbins-1);

xm=xm+1; ym=ym+1;
xp=xp+1; yp=yp+1;


hist12=zeros(nbins,nbins);
hist1=zeros(nbins,1);
hist2=zeros(nbins,1);

for i=1:numel(I1),
    hist1(xm(i))=hist1(xm(i))+xmd(i); 
    hist1(xp(i))=hist1(xp(i))+xpd(i);
    hist2(ym(i))=hist2(ym(i))+ymd(i); 
    hist2(yp(i))=hist2(yp(i))+ypd(i);
    hist12(xm(i),ym(i))=hist12(xm(i),ym(i))+xmd(i).*ymd(i);
    hist12(xp(i),ym(i))=hist12(xp(i),ym(i))+xpd(i).*ymd(i);
    hist12(xm(i),yp(i))=hist12(xm(i),yp(i))+xmd(i).*ypd(i);
    hist12(xp(i),yp(i))=hist12(xp(i),yp(i))+xpd(i).*ypd(i);
end

hist1=hist1./numel(I1); 
hist2=hist2./numel(I1); 
hist12=hist12./numel(I1);
  
 

Contact us at files@mathworks.com