Q:

Identifying and counting closely spaced particles

Following in the footsteps of this blog post: http://blog.wolfram.com/2011/09/09/building-a-microscopy-application-in-mathematica/, I took a microscope picture of some particles on a surface, and attempted to write a script to identify and count them automatically.  However, I've been having a difficult time seperating closely spaced particles, and the MaxDetect method in the blog post seems to not work too well on this data set.  
Why I find this failure surprising: Picking out the dark spots by hand is fairly trivial, and I imagine that if one were to 3D print a surface where darker pixel values represent depressions, the problem could be solved by rolling some marbles around and seeing where they stick.
Here's the picture / data:
 
The first thing I did was then to binarize (with the Kittler-Illingworth minimum error thresholding method) and color negate the data using the command:
ColorNegate[Binarize[image, Method -> "MinimumError"]]

Which yielded:

I then attempted to apply ImageAdjust[DistanceTransform[...]] to the image, yielding:

Which I then applied MaxDetect to, yielding:

So, interestingly, there seems to be a ring of local maxima around each particle.  Even if you use Erosion extensively, there still seem to be significant clusters of local maxima corresponding to each particle.  As such, I've been having a very difficult time using the MaxDetect method in the aforementioned blog post to individually identify and count each particle.
Let's say that the precise centroid coordinates of each particle are not important to know exactly.  Is there a "nice" method of assigning a distinct morphological component or coordinate to each particle without a lot of hands-on tuning?  Where perhaps we can end up with something like this (where I've hand-identified particles)?

A:

The image file goes by the name of "dots" in the following.
This gives the basic layout of the components:
c = DeleteSmallComponents@ColorNegate[Binarize[dots, Method -> "MinimumError"]];
m = MorphologicalComponents[c] // Colorize 

centroids = ComponentMeasurements[ m , "Centroid"];
radii = ComponentMeasurements[ m , "EquivalentDiskRadius"][[All, 2]];
componentLabels = (# /. {Rule[n_, b_] :> Text[n, b]}) & /@ centroids;
Graphics[componentLabels, Axes -> True, AxesOrigin -> {0, 0}]
points = componentLabels[[All, 2]];
areas = MapThread[Text, {Round@radii, points}];
Graphics[areas, Axes -> True, AxesOrigin -> {0, 0}]
estimates = ({Which[#[[1]] < 15, Blue, #[[1]] < 20, Red, True, Green],
        Point[#[[2]]]} & /@ areas) /. {Blue -> 
     Sequence[Blue, PointSize[.01]], 
    Red -> Sequence[Red, PointSize[.02]], 
    Green -> Sequence[Green, PointSize[0.03]]};
Graphics[{estimates}, Axes -> True, AxesOrigin -> {0, 0}]

This shows where the components lie:

The sizes of the components:

And the best guesses for singles (blue), pairs (red), and triples (green):

A:

Perhaps using ImageCorrelate can be useful.  Lets call the original image img0.  You can use the drawing tools (or whatever other method you would like) to grab a kernel.  This is the one I chose:
ker = 
In my case, I obtained this kernel by simply using the Image Assistant and cropping out one of the spots from img0.
i = ImageCorrelate[img0, ker, NormalizedSquaredEuclideanDistance];

From here use MorphologicalComponents and ComponentMeasurements to grab the central coordinates.
dots = Point[#[[2]]] & /@ ComponentMeasurements[
    MorphologicalComponents[ColorNegate[Binarize[i, 0.22]]], 
    "Centroid"];

Here is the result
Show[img0, Graphics[{Yellow, dots}]]

It isn't perfect (is misses the triplet and has a "phantom" dot) but for very little tweaking it does a decent job.

