这篇文章来源于Stack-Exchange,但方法在Mathematica内置帮助文档中就能找到。计数问题很常见,处理起来也很方便,但是
对于相互粘连的计数问题,就稍微有点麻烦了。考虑这样一个计数问题,

处理思路大致如下,利用距离变换结合极大值检测生成模板,然后利用降水算法分离实物,最后在原图中进行标定。
值得注意的是,标定的Label不一定表示实物序号,这与函数内部设置有关,我们可以利用Length函数来计数,如果不嫌麻烦,亦可
重新生成Label来标记。代码如下:
rbc = ImageCrop[Import["C:/Users/1/Desktop/ct.png"], {300, 340}];
rbc = rbc // Sharpen;
b = DeleteSmallComponents[ColorNegate[Binarize[rbc, 0.81]], 50];
distT = DistanceTransform[b, Padding -> 0];
marker = MaxDetect[ImageAdjust[distT], 0.02];
w = WatershedComponents[GradientFilter[b, 3], marker,
Method -> "Rainfall"];
cells = SelectComponents[w, "Count", 500 < # < 3000 &];
measures =
ComponentMeasurements[
cells, {"Centroid", "EquivalentDiskRadius", "Label"}];
Show[rbc,
Graphics[{Blue, Circle @@ # & /@ (measures[[All, 2, 1 ;; 2]]),
MapThread[Text, {measures[[All, 2, 3]], measures[[All, 2, 1]]}]}]]
measures // Length
结果如下:

可能是图片问题,21号物体的干扰很大,最后不得已利用了Sharpen函数处理了一下,勉强给出了结果。
同样的代码,处理下面这幅图片(细胞计数问题),

img = Import["C:/Users/USER/Desktop/cell.jpg"];
b = img // Binarize // ColorNegate // FillingTransform;
distT = DistanceTransform[b, Padding -> 0];
marker = ImageAdjust[distT] // MaxDetect[#, 0.04] &;
w = WatershedComponents[GradientFilter[b, 3], marker,
Method -> "Rainfall"];
cells = SelectComponents[w, "Count", 200 < # < 2000 &];
measures =
ComponentMeasurements[
cells, {"Centroid", "EquivalentDiskRadius", "Label"}];
Show[img,
Graphics[{Blue, Circle @@ # & /@ (measures[[All, 2, 1 ;; 2]]),
MapThread[Text, {measures[[All, 2, 3]], measures[[All, 2, 1]]}]}]]
结果如下,

处理结果良好,继续做更多的计数问题。