Re: mutual information of red and green channel
- To: mathgroup at smc.vnet.net
- Subject: [mg81332] Re: [mg81274] mutual information of red and green channel
- From: DrMajorBob <drmajorbob at bigfoot.com>
- Date: Wed, 19 Sep 2007 05:35:33 -0400 (EDT)
- References: <29233217.1190160008456.JavaMail.root@m35>
- Reply-to: drmajorbob at bigfoot.com
You divided by zero and/or calculated Log[0]. The Sum can't include cases
where either of the marginals is zero... even though the joint pdf will be
zero there as well.
Here's an alternative solution for the whole thing, in case it gives you
any ideas.
First I get a file name:
<<Histograms`
filename="C:\\Documents and Settings\\bobby\\My Documents\\My Pictures\\";
{FileNameSetter[Dynamic[filename]],Dynamic[filename]}
Click on the button and navigate to a picture.
This pulls out the red-green channels:
picture = Import[filename];
redGreen = Flatten[picture[[1, 1, All, All, {1, 2}]], 1];
There was a LOT of white in my example, so I used DeleteCases to prune the
data a bit:
redGreen = DeleteCases[redGreen, {255, _} | {_, 255}];
Histogram3D is slow for a picture like mine, but perhaps it's worth seeing
the result anyway:
Histogram3D[redGreen]
This creates the joint PDF in terms of an InterpolatingFunction:
joint = Tally@redGreen;
joint = Sort@
Join[joint, {#, 0} & /@
Complement[Flatten[Table[{i, j}, {i, 0, 255}, {j, 0, 255}], 1],
joint[[All, 1]]]];
joint[[All, 2]] = #/Total@# &[N@joint[[All, 2]]];
joint = Interpolation@joint;
I reused the variable name "joint" to save memory.
This plots the PDF:
Plot3D[joint[x, y], {x, 0, 255}, {y, 0, 255}, PlotRange -> All]
(InterpolatingOrder defaulted to 3; this slightly affects this plot, but
it won't affect the calculations below.)
info[x,y] are the marginal PDFs and the joint information term at {x,y},
based on your formula:
Clear[red, green, info]
red[x_] := red[x] = Sum[joint[x, y], {y, 0, 255}]
green[y_] := green[y] = Sum[joint[x, y], {x, 0, 255}]
info[x_Integer, y_Integer] := Module[{j = joint[x, y]},
If[j == 0, 0, j Log[2, j/(red[x] green[y])]]]
Notice how I avoided dividing by zero or calculating Log[0]. If either
marginal is zero, so is the joint.
And finally, here's the sum:
Sum[info[x, y], {x, 0, 255}, {y, 0, 255}]
3.20989
I don't calculate information every day, so excuse it if I've arrived at
something off-the-wall. Some of the steps may help you anyway.
Bobby
On Mon, 17 Sep 2007 23:40:54 -0500, <vickyisai at gmail.com> wrote:
> Hello
>
> I am using the following code to calculate mutual information of red
> and green channel of an image.
>
> I am calculating Ixy= Sum(i)Sum(j) P(REDi,GREENj) Log[P(REDi,GREENj)/
> P(REDi)/P(GREENj) ]
>
> (that is this formula
> http://upload.wikimedia.org/math/c/b/b/cbb518be041b820958181a932a5cd4ff.png
> )
>
> I am getting an error of "Indeterminate expression 0(-=E2=88=9E=
) =
> encountered.
> "
>
> I believe I am getting this because I am taking Probability of Redi
> from a histogram that I have computed (value of REDi divided by total
> no of pixels ....as my probability of REDi. ame for GREENj
> But that histogram has 0 at some places which is leading to divide by
> zero.
>
> (i plotted that histogram to check that)
>
> How should I calculated mutual information of red and green channel of
> an image.
>
> ( I use Mathematica 5.2 and dont have image processing package)
> Thank You
>
> Code is below:
> ---------------------------------------------------------------------- ----
> image=Import["c:/fish.ppm"];
> (* Show[image]; *)
>
>
>
> part=image[[1,1]];
>
> red=part[[All,All,1]];
>
> histRed=Table[0,{256}];
>
> For[i=1,i<Dimensions[red][[1]],++i,
> For[j=1,j<Dimensions[red][[2]],++j,
> indxr=Floor[red[[i,j]]]+1;
> histRed[[indxr]]=histRed[[indxr]]+1;
> ]
> ]
> (* histR=ListPlot[histRed,PlotJoined=EF=94=A2True]; *)
>
> green=part[[All,All,2]];
> histGreen=Table[0,{256}];
>
> For[i=1,i<Dimensions[green][[1]],++i,
> For[j=1,j<Dimensions[green][[2]],++j,
> indxg=Floor[green[[i,j]]]+1;
> histGreen[[indxg]]=histGreen[[indxg]]+1;
> ]
> ]
> (* histG=ListPlot[histGreen,PlotJoined=EF=94=A2True]; *)
>
>
> (* Joint Prob. Matrix *)
> joinRG=Table[0,{256},{256}];
>
> For[i=1,i<Dimensions[red][[1]],++i,
> For[j=1,j<Dimensions[green][[2]], ++j,
> idx1=Floor[red[[i,j]]]+1;
> idx2=Floor[green[[i,j]]]+1;
> joinRG[[idx1,idx2]]=joinRG[[idx1,idx2]]+1;
> ]
> ]
>
> (* Ixy= Sum(i)Sum(j) P(xi,yj) Log[P(xi,yj)/P(xi)/P(yj) *)
>
> For[i=1,i<Dimensions[histRed][[1]],++i,
> For[j=1,j<Dimensions[histGreen][[1]],++j,
> Ixy = Ixy + joinRG[[i,j]] / 65536 * Log[2 , ,joinRG[[i,j]] /
> histRed[[i]] / histGreen[[j]] ]
> ]
> ]
>
>
>
-- =
DrMajorBob at bigfoot.com