Ok Hao, I had some more time and wrote a short ad hoc script for your analysis. This utilizes the trainable weka segmentation plugin. I trained a quick example classifier for you, but I encourage you to make your own, and train it on more than one image, see how robust you can make it! You can for sure improve on the one I made in 5 minutes. Once you have your classifier you can automate this whole procedure, you can run it on files in a directory or large stacks, whatever you prefer.
Regarding making a classifier for WEKA: Video, detailed wiki.
Code in python, copy paste from here to File >> new >> script in IJ. Select language python.
Download the classifier I trained. Remember to set the path to the classifier in the script.
from ij import IJ, WindowManager
from trainableSegmentation import WekaSegmentation
from ij.process import ImageConverter
# Please define the path to your classifier.
classifer_path = "D:\\Bubbles.model"
# Gets the image you want to segment.
your_image = IJ.getFilePath("Select image for WEKA segmentation")
target = IJ.openImage(your_image)
#launches weka segmentation.
weka = WekaSegmentation()
# Loads the classifier you have trained manually.
# Shows you the segmented image.
segmentation = weka.getClassifiedImage()
# Converts to binary, runs watershed segmentation and analyze particles. Outputs area measurements.
IJ.run(segmentation, "Watershed Irregular Features", "erosion=1 convexity_treshold=0 separator_size=0-200")
IJ.run("Analyze Particles...", "size=50-Infinity circularity=0.1-1.00 show=Outlines display summarize")
And this is the result, which I think is more accurate as the other methods created too much space between bubbles. Not all bubles are segmented but it doesn't really matter, you want total area. By this logic maybe the watershed is redundant, up to you. Oh, and you may need to add the biovoxxel update site to get the watershed irregular features plugin.