It seems you're like hacking something :)
I suggest you try with some Blob Detection algorithm... give a look to this link. Then you can filter blobs by area for example.
Here a short snippet:
using namespace cv;
// Read image
Mat im = imread( "blob.jpg", IMREAD_GRAYSCALE );
// Set up the detector with default parameters.
SimpleBlobDetector detector;
// Detect blobs.
std::vector<KeyPoint> keypoints;
detector.detect( im, keypoints);
// Draw detected blobs as red circles.
// DrawMatchesFlags::DRAW_RICH_KEYPOINTS flag ensures the size of the circle corresponds to the size of blob
Mat im_with_keypoints;
drawKeypoints( im, keypoints, im_with_keypoints, Scalar(0,0,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS );
// Show blobs
imshow("keypoints", im_with_keypoints );
waitKey(0);
This is the result:

All the blobs are highlighted with a circle
Also morphological operations can improve the image. In particular, an opening and closing operation can improve the image and remove noise:
This after opening:

This after a closing operation:
