www.pudn.com > 1111111registrationbasedoncorrelation.rar > RMI.m
function rmi = RMI(A, B, d)
% % -- referrence:
% % "Image similarity using mutual information of regions", D B Russakoff
% % -- Algorithm
% % Given A and B, which are m*n images
% % 1. create pi=vij for [Aij, Bij], then N = (m-2r)*(n-2r) is represented by P=[p1..pN]
% % 2. P0 = P - mean(P);
% % 3. C = P0*P0'/N, covariance matrix
% % 4. Hg(C) = log( (2pie)^(d/2) * det(C)^(d/2) )
% % 5. Hg(CA), Hg(CB), where CA is d/2*d/2 top left matrix of C, CB is bottom right
% % 6. RMI = Hg(CA)+Hg(CB)- Hg(C)
% %
% % -- Our method
% % differrent in region, use only p[i+1,j] and p[i,j+1] for p[i,j]
% %
% % % % test begins
% load t2.mat;
% % Is0 , It0
% [rt ct]=size(It0);
% [rs cs] = size(Is0);
% if rt>rs || ct>cs
% x1 = (ct-cs)/2+1;
% x2 = cs+x1-1;
% It0=It0([x1:x2],[x1:x2]);
% end
% A = Is0;
% B = It0;
% % % % test ends
% % ======================== main begins ======================
[m n] = size(A);
% % === 1. create pi=vij for [Aij, Bij], then N = (m-2r)*(n-2r) is represented by P=[p1..pN]
if nargin <3
d = 9; %default set
end
P = crP(A, B, d);
N = size(P,2);
% % === 2. P0 = P - mean(P);
P0 = double(P) - repmat( mean(P,2), 1, N ); %sum(P(:))/N
% % === 3. C = P0*P0'/N, covariance matrix
C = P0*P0'/N;
% % === 4. Hg(C) = log( (2pie)^(d/2) * det(C)^(d/2) )
HgC = calHg(C, d*2);
% % === 5. Hg(CA), Hg(CB), where CA is d/2*d/2 top left matrix of C, CB is bottom right
CA = C(1:d, 1:d);
[m1 n1] = size(C);
CB = C((m1-d+1):m1, (n1-d+1):m1);
HgCA = calHg(CA, d);
HgCB = calHg(CB, d);
% % === 6. RMI = Hg(CA)+Hg(CB)- Hg(C)
rmi = HgCA + HgCB - HgC;
% % ======================== main ends ===================================
% % === subfunc1. create pi=vij for [Aij, Bij], then N = (m-2r)*(n-2r) is represented by P=[p1..pN]
function P = crP(A, B, d)
P = [];[m, n] = size(A);
% % fast algrithm
if d==3
i = [1:(m-1)]; j = [1:(n-1)];
Pa1 = A(i, j)';
Pa2 = A(i+1, j)';
Pa3 = A(i, j+1)';
Pb1 = B(i, j)';
Pb2 = B(i+1, j)';
Pb3 = B(i, j+1)';
P = [ Pa1(:)'; Pa2(:)'; Pa3(:)';...
Pb1(:)'; Pb2(:)';Pb3(:)'];
end
if d==4
i = [1:(m-1)]; j = [1:(n-1)];
Pa1 = A(i, j)';
Pa2 = A(i+1, j)';
Pa3 = A(i, j+1)';
Pa4 = A(i+1, j+1)';
Pb1 = B(i, j)';
Pb2 = B(i+1, j)';
Pb3 = B(i, j+1)';
Pb4 = B(i+1, j+1)';
%
% Pa1 = A([1:(m-1)], [1:(n-1)])';
% Pa2 = A([2: m], [1:(n-1)])';
% Pa3 = A([1:(m-1)], [2: n] )';
% Pa4 = A([2: m], [2: n] )';
% Pb1 = B([1:(m-1)], [1:(n-1)])';
% Pb2 = B([2: m], [1:(n-1)])';
% Pb3 = B([1:(m-1)], [2: n] )';
% Pb4 = B([2: m], [2: n] )';
P = [ Pa1(:)'; Pa2(:)';Pa3(:)'; Pa4(:)';...
Pb1(:)'; Pb2(:)';Pb3(:)'; Pb4(:)'];
end
if d==9
i = [2:(m-1)]; j = [2:(n-1)];
Pa1 = A(i-1, j-1)';
Pa2 = A(i, j-1)';
Pa3 = A(i+1, j-1)';
Pa4 = A(i-1, j )';
Pa5 = A(i, j )';
Pa6 = A(i+1, j )';
Pa7 = A(i-1, j+1)';
Pa8 = A(i, j+1)';
Pa9 = A(i+1, j+1)';
Pb1 = B(i-1, j-1)';
Pb2 = B(i, j-1)';
Pb3 = B(i+1, j-1)';
Pb4 = B(i-1, j )';
Pb5 = B(i, j )';
Pb6 = B(i+1, j )';
Pb7 = B(i-1, j+1)';
Pb8 = B(i, j+1)';
Pb9 = B(i+1, j+1)';
P = [ Pa1(:)'; Pa2(:)';Pa3(:)'; Pa4(:)';...
Pa5(:)'; Pa6(:)';Pa7(:)'; Pa8(:)'; Pa9(:)';...
Pb1(:)'; Pb2(:)';Pb3(:)'; Pb4(:)';
Pb5(:)'; Pb6(:)';Pb7(:)'; Pb8(:)'; Pb9(:)'];
end
function HgC = calHg(C, d)
det( C )
(2*pi*exp(1))^(d/2) *sqrt( det( C ) )
HgC = log( (2*pi*exp(1))^(d/2) *sqrt( det( C ) ) );