One very general way to solve this kind of problem is to use [`GeodesicDilation`](http://reference.wolfram.com/language/ref/GeodesicDilation.html) to find the peaks. The intuition behind `GeodesicDilation` is that you dilate an image, then "clip" it using a mask image, i.e. for every pixel in the mask and the dilated image, you choose the darker of the two pixels. So the mask limits the growth of the dilation. This is repeated until convergence. To find peaks, you start with "reduced" version of the source image, i.e. you subtract a constant from the image or multiply it by a constant, then dilate it using the original image as mask. In 1d, the result looks like this: [![enter image description here][1]][1] As you can see, the reconstruction (the green line) grows in every iteration, until it reaches the "borders" of the source image. Now, if you subtract this reconstruction from the source image: [![enter image description here][2]][2] And everything but the peaks will be zero. In 2d: img = ColorConvert[Import["https://i.sstatic.net/4gWnl.png"], "Grayscale"]; γ = 0.5; plateu = GeodesicDilation[ImageMultiply[img, γ], img]; bin = Binarize[ImageDifference[plateu, img], 0]; bin = Erosion[bin, 1] [![enter image description here][3]][3] I've used [`Erosion`](http://reference.wolfram.com/language/ref/Erosion.html) to remove small 1-pixel peaks and to separate close peaks, but you might want to play with different alternatives (e.g. the watershed-based algorithm @Pickett linked to - now that you have a marker image, that should work fine.) Final step: Find centroids and draw the Voronoi cells: centroids = ComponentMeasurements[bin, "Centroid"][[All, 2]]; v = VoronoiMesh[centroids]; Show[img, Graphics[{Red, GraphicsComplex[MeshCoordinates[v], MeshCells[v, 1]]}]] [![enter image description here][4]][4] [1]: https://i.sstatic.net/kuFWP.png [2]: https://i.sstatic.net/x0SdM.png [3]: https://i.sstatic.net/Azk9G.png [4]: https://i.sstatic.net/Pveps.png