This uses no for-loops - only index manipulation. Intended use is for iterative programs where increased speed pays off, but works just fine for individually controlled use as well - though in this case the user may want to adjust the function to include various parameters as input variables (for iterative programs these are usually constant, so they are set to typical values within the function).
No error checking is used, as that could slow things down and is generally unnecessary for an iterative program presumably using fixed image sizes and pixel values.
Returns joint histogram, mutual information, and joint entropy. It is expected that no one will need all three, so instructions on how to remove that which is not needed is included.
ND here means "n-dimensional". In other words, you can have a 2-d image, a 3-d image, 4-d image, et cetera...
It's a good idea to be able to use more than two images, though. I didn't even know there was a need for that. I'll update when I have time to figure out how to do it.
This program is not for nD, as it just can get two images. When it is said nD I thought it can handle n images with the same spatial size, e.g. Multi- or hyper-spectral satellite images
That error means that at least one value in at least one of your images is not a non-negative integer value.
I have not added error checking, as the point of this is speed. But if you wanted to ensure that you do not get this error, you can add the following lines to the top of this function:
J = J - min(J(:));
K = K - min(K(:));
J = round(255.4*J/(max(J(:)));
K = round(255.4*J/(max(J(:)));
All this does is recast the image into the 0-255 range. This should avoid the error you were getting, as long as you don't have any NaN or complex pixel values. Again, I didn't want to add this to the code, as I suspect the main use for this will be for iterative programs, and recasting is usually handled well in advance of any attempt to obtain MI or joint entropy..
But, if you add these lines and it continues not to work, please let me know, and if possible include the data you are using.
have you tested your code?
There is a bug that when calculating h(x,y).
Subscript indices must either be real positive integers or logicals.
Error in ent (line 39)
jhist(yy) = xx;
Error in testENT (line 6)
[jhist, jent, MI] = ent(imgA,imgB);
Found that using array multiplication instead of meshgrid indexing increased the MI calculation slightly.
fixed a silly mistake that needlessly increased the MI calculation time by about 10%
condensed the comments in the code to only what is necessary to modify the function..
Now also returns mutual information.
Now returns joint histogram and joint entropy by default (can be changed easily by user).
Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.