Code covered by the BSD License  

Highlights from
Fast mutual information of two images or signals

4.14286

4.1 | 7 ratings Rate this file 112 Downloads (last 30 days) File Size: 2.26 KB File ID: #13289

Fast mutual information of two images or signals

by Jose Delpiano

 

07 Dec 2006 (Updated 24 Aug 2011)

Optimized function for mutual information of two images or signals

| Watch this File

File Information
Description

Usage: I=mi(A,B), where A and B are equally sized images/signals.

Function hist2 (included) is used to determine the joint histogram of the images/signals.

Assumptions: 1) 0*log(0)=0, 2) mutual information is obtained on the intersection between the supports of partial histograms.

Example (in mi_test.m):

disp('Test: Mutual information between two images')
load mri
A=D(:,:,8);
B=D(:,:,9);
mi(A,B)

disp('Test: Mutual information between two signals')
load garchdata
nasdaq = price2ret(NASDAQ);
nyse = price2ret(NYSE);
mi(nasdaq,nyse)

MATLAB release MATLAB 7.7 (R2008b)
Tags for This File  
Everyone's Tags
Tags I've Applied
Add New Tags Please login to tag files.
Comments and Ratings (12)
07 Mar 2007 Lily Tang  
20 May 2007 liyakath unisa  
08 Jul 2007 jega xx

thank you very much for the code, really appreaciate it.

10 Feb 2008 Todd Pataky

thank you for your well-written and clear code.

06 May 2008 nicola rebagliati

the following codes raise errors:
"
A = uint8(zeros(4));
mi(A,A);
"

where uint8 is the usual type for images

"
A = zeros(4);
mi(A,A);
"

gives NaN.

26 Feb 2009 Chaos

Program bombs with 2007a

??? Error using ==> mtimes
Integers can only be combined with integers of the same class, or scalar
doubles.

Error in ==> hist at 73
        xx = miny + binwidth*(0:x);

Error in ==> mi at 12
na = hist(A(:),256);

01 Sep 2009 Jose Delpiano

I solved problems related with data types. Now mi() accepts different types of images and signals (not only double images or signals). However, I am testing it with Matlab 7 (R14). Please leave a comment if it doesn't work with other versions.

22 Feb 2010 andrew hill

the current implementation of both MI and hist2 are quite slow;

function n=fast_hist2(A,B,L)
ma=min(A(:));
MA=max(A(:));
mb=min(B(:));
MB=max(B(:));

% For sensorimotor variables, in [-pi,pi]
% ma=-pi;
% MA=pi;
% mb=-pi;
% MB=pi;

% Scale and round to fit in {0,...,L-1}
A=round((A-ma)*(L-1)/(MA-ma+eps));
B=round((B-mb)*(L-1)/(MB-mb+eps));
n=zeros(L);
x=0:L-1;
for i=0:L-1
    n(i+1,:) = histc(B(A==i),x,1);
end
end

is about 10x quicker, and gives the same result (assuming that the input is sensible, i believe you get different behavior if you pass in all nan's, or anything which would cause matlabs 'hist' function to error) ; given that the mi function calls hist on both the inputs individually first, this should not be a problem.

also there is need for a bugfix in mi, 256 bins are hard coded, irrespective of what you pass in.

the minf function also does unnecessary allocation.

Using the functions above and below rather than the attached the running time is about 22 seconds rather than 240, for my set of MI calculations. (2500 calls for MI between two 50x50 windows)

function I=fast_mi(A,B,L)
%MI Determines the mutual information of two images or signals
%
% I=mi(A,B)
%
% Assumption: 0*log(0)=0
%
% See also WENTROPY.

% jfd, 15-11-2006
% 01-09-2009, added case of non-double images

A=double(A);
B=double(B);
    
na = fast_hist(A(:),L);
na = na/sum(na);

nb = fast_hist(B(:),L);
nb = nb/sum(nb);

n2 = fast_hist2(A,B,L);
n2 = n2/sum(n2(:));

I=sum(minf(n2,na'*nb));
%I=sum(I);

% -----------------------

function y=minf(pab,papb)

I=find(papb(:)>1e-12 & pab(:)>1e-12); % function support
y=pab(I).*log2(pab(I)./papb(I));

22 Feb 2010 andrew hill

oh, and somwhere there is a re-scaling bug ; http://www.flickr.com/photos/47796226@N04/4380054294/
which shows the MI between a fixed window in one image, and a sliding window in each of 6 other images.
In some images it works, but in others it doesn't.

Some images have negative intensity; i'll investigate further and post here again if i find the cause. (it happens with both my code and the original, changing the re-binning can slightly change the pattern of the unusual elements.)

06 Jul 2011 Divyesh Varade

Thanks for the code it was very helpful. However, I want to compare two images using MI. If I do it pixel by pixel using the given code, I mostly get a warning: divide by zero and receive a value NaN for MI. Now I can try and work with very small windows also but that would seem to reduce the quality of my results. Is there another way or by enhancing this code somehow to analyse the two images together almost pixelwise.

25 Aug 2011 Jose Delpiano

Andrew, many thanks. I'm sorry about my delay. I added the improvements you suggested. The code is much faster now.

Divyesh Varade, mutual information is a measure based on pixel statistics, so it can't be applied pixel by pixel. Applying it to small windows could be a good idea for some applications.

04 Nov 2011 scaramanga

Great Job ! However, I'm just wondering why you're using hist in mi function and histc in hist2 function. I would have used histc everywhere. Is there any difference, or it is an arbitrary choice ?

Please login to add a comment or rating.
Updates
08 Oct 2008

Needed modification of input arguments. Example added.

01 Sep 2009

Added support for signals (1D matrices) and for non-double images.

24 Aug 2011

Speed improvements suggested in comments by Andrew Hill.

Tag Activity for this File
Tag Applied By Date/Time
geometric transformation Jose Delpiano 22 Oct 2008 08:51:36
image registration Jose Delpiano 22 Oct 2008 08:51:36
mutual information Jose Delpiano 22 Oct 2008 08:51:36
image processing Jose Delpiano 22 Oct 2008 08:51:36
joint histogram Jose Delpiano 22 Oct 2008 08:51:36
image Jose Delpiano 22 Oct 2008 08:51:36
image Cristina McIntire 10 Nov 2008 10:57:36
image processing Cristina McIntire 10 Nov 2008 10:57:39
joint histogram Yvonne 16 Jun 2009 07:15:19
signal processing Jose Delpiano 01 Sep 2009 12:30:54
information theory Jose Delpiano 01 Sep 2009 12:30:54
image processing Tim Lee 05 Aug 2010 08:10:38

Contact us at files@mathworks.com