Calculate the surface area of different elements in a picture (micrograph)

This is a micrograph of a hybrid material that contains glass fiber (small white dots), carbon fibers (big grey dots) and a matrix that contains everything! I would like to calculate the surface area (volume fraction) of each of the elements.

• Standard references are How to count cells and Analyze segmented cells in an image. They can be a good starting point, especially since it looks like Binarize should be pretty good at separating the different types of elements from each other. – C. E. Jun 21 at 13:17

This is all quite crude and largely done by eye.

img =


totalMeasure =
ImageMeasurements[Binarize[1 - ImageSubtract[img, img]], "Total"]

(* Out[348]= 170240. *)


Get the glass part by playing with blurring and binarization.

imgGlass =
MorphologicalBinarize[
Blur[MorphologicalBinarize[Blur[img, 1], .5], 2], .15]
ImageMeasurements[imgGlass, "Total"]
ImageMeasurements[imgGlass, "MeanIntensity"]


(* 49506.

0.290801 *)


Now subtract and binarize to get the carbon part.

imgCarbon =
Binarize[ImageSubtract[img, Blur[imgGlass, 4]], .18]
ImageMeasurements[imgCarbon, "Total"]
ImageMeasurements[imgCarbon, "MeanIntensity"]


(* Out[585]= 66975.

Out[586]= 0.393415 *)


To see if this is at all consistent, also get the matrix part.

imgBlack = Binarize[ColorNegate[img], .75]
ImageMeasurements[imgBlack, "Total"]
ImageMeasurements[imgBlack, "MeanIntensity"]


(* Out[709]= 55782.

Out[710]= 0.327667 *)


So it comes to around 100% but still this was all from using eyeballing to see if the pictures were in the right ballpark. I'd expect maybe up to 10% relative error in each of the measurements.