# Calculate mean and standard deviation from ImageHistogram

I am doing my PhD in Clinical Neuropsychology; I had someone helping me analyse images (.jpg pictures) in Mathematica, but it turns out this person made some really bad decisions, and well, now I have to do it myself. But, I have no idea.

Basically, what I want is to analyze the JPEG image, get a RGB histogram, and get the values for the mean and standard deviation of this histogram.

Using ImageHistogram [[*image*], Appearance, -> "Separated"] works fine, but I can't figure out the next step, turning the histogram plot into numbers.

How can I do that?

Thank you for helping!

-
You could use ImageData[] to get the values being binned for the histograms... – J. M. Oct 12 '12 at 13:27
Thank you for responding!!I am trying it right now! – onemonkey Oct 12 '12 at 13:31
Hmmm... it says A very large out put was generated, here is a sample of it. "{0., 0., 0.}, {0., 0., 0.}, {0., 0., 0.}," – onemonkey Oct 12 '12 at 13:33
And if I input: StandardDeviation[Out[37]] I get pretty much the same result. – onemonkey Oct 12 '12 at 13:34
You might need the Interleaving option... – J. M. Oct 12 '12 at 13:40

There is one suggestion.

img = ExampleData[{"TestImage", "Lena"}];
imgChannelsRGB = Transpose@Flatten[ImageData[img], 1];

Creating Histogram:

GraphicsRow[Histogram /@ imgChannelsRGB, ImageSize -> 500]

Geting statistics:

TableForm[Through[{Mean, StandardDeviation}[#]] & /@ imgChannelsRGB,
TableHeadings -> {{"Red", "Blue", "Green"}, {"Mean", "StDev"}}]

-
Alternatively: imgChannelsRGB = Flatten /@ ImageData[img, Interleaving -> False]. The Lenna example image is easily accessed as ExampleData[{"TestImage", "Lena"}]. – J. M. Oct 12 '12 at 14:00
Nice tip. Changed the example. – Murta Oct 12 '12 at 14:03
Am trying it right now! – onemonkey Oct 12 '12 at 14:09
O wow, this is very promissing! I'm going to play with this (and then I might be back). Thnx! – onemonkey Oct 12 '12 at 14:43
You could use ImageData[img] ~Flatten~ {{3}, {1, 2}} in place of Transpose@Flatten[ImageData[img], 1], eliminating Transpose. – Mr.Wizard Oct 12 '12 at 15:19

I thought it might be interesting to combine the graphs and statistics in small multiple style, but I got stuck... How do you present two numbers as a label without showing the curly brackets?

Code:

{r, g, b} = ColorSeparate[img];
Row[
Labeled[
ImageHistogram[#, Appearance -> "Transparent",  Joined -> False,
Frame -> None],
{
Mean[Flatten[ImageData[#]]],
StandardDeviation[Flatten[ImageData[#]]]
},
ImageSize -> 200
] & /@ {r, g, b}
]

Edit with bill (?!)'s suggestion:

GraphicsRow[
Labeled[
ImageHistogram[#, Appearance -> "Transparent", Joined -> False,
Frame -> None],
Style[
Column[
{
Mean[Flatten[ImageData[#]]],
StandardDeviation[Flatten[ImageData[#]]]
}
],
14, Bold],
ImageSize -> 500
] & /@ {r, g, b}]

-
Maybe add a Column ? Row[Labeled[ ImageHistogram[#, Appearance -> "Transparent", Joined -> False, Frame -> None], Column[{Mean[Flatten[ImageData[#]]], StandardDeviation[Flatten[ImageData[#]]]}], ImageSize -> 200] & /@ {r, g, b}] – b.gatessucks Oct 12 '12 at 19:26
@b.gatessucks Good idea! As usual, your comments are better than my answers! :) – cormullion Oct 12 '12 at 19:30
Wow! I have been getting some help from a friend, and we will definitely come back to this! – onemonkey Oct 15 '12 at 9:46
OK, so we are on a roll, but now I have a new, buyt related qustion. Should i post it here or open a new topic? – onemonkey Oct 19 '12 at 8:54