Code covered by the BSD License  

Highlights from
Diffusion Distance

from Diffusion Distance by Matthew Foster
Calculate the diffusion distance between histograms

diffusion_distance(im1, im2, sig, dim, threshold, pad_type)
function [val, varargout] = diffusion_distance(im1, im2, sig, dim, threshold, pad_type)
% DIFFUSION_DISTANCE calculate the diffusion distance between matrices
% dist = diffusion_distance(im1, im2, [sig, dim], threshold, pad_type]) 
% [dist, iter] = diffusion_distance(im1, im2) compute the diffusion distance
% between im1 and im2 (histograms). 
% 
% Optionally returns the number of iterations. This number will be limited by
% the size of the histograms, and the threshold value, which can be set
% manually, or will take the value 1e-4.
% 
% The padding method used by the filtering stages can be set using the 4th
% argument, and defaults to circular. For available options, see help imfilter. 
% 
% Reference:
% Diffusion Distance for Histogram Comparison
% Ling and Okada, Proc. CVPR, 2006
%
% Matt Foster <ee1mpf@bath.ac.uk>

error(nargchk(2, 6, nargin, 'struct'))

if nargin < 4
  sig = 0.5;
  dim = 3;
end

if nargin == 3
  error('Strange number of arguments.');
end

if nargin < 5
  threshold = 1e-4;
end

if nargin < 6
  pad_type = 'circular'; % see help imfilter
end

kernel = fspecial('gaussian', dim, sig);

dist = im1 - im2;
val = sum(abs(dist(:)));

level_val = 1000; % This need initialising to larger than the threshold.
iter = 0;

while level_val > threshold && all(size(dist) >= size(kernel))
  iter = iter + 1;
  % filter, and downsample
  dist = imresize(imfilter(dist, kernel, pad_type), 0.5);
  level_val = sum(abs(dist(:)));

  val = val + level_val;
end

if nargout >= 2
  varargout{1} = iter;
end

Contact us