I have been playing around with the watershed segmentation by markers
with the code proposed as example:
Unfortunately, if we use for example floating values for the radii of
the circles (like r1, r2 = 20.7, 24.7), the separation is not perfect,
as it gives 4 labels.
If we use the chamfer distance transform instead of the Euclidean
distance transform, it is even worse.
It appears that the markers detection by regional maximum
(peak_local_max) fails in the presence of plateaus. Its algorithm is
basically D(I)==I, where D is the morphological dilation.
A better algorithm would be to use morphological reconstruction (see
SOILLE, Pierre. /Morphological image analysis: principles and
applications/. Springer Science & Business Media, 2003, p202, Eq 6.13).
A proposition of the code can be the following (it should deal with
import numpy as np
from skimage import morphology
This avoids plateaus problems of peak_local_max
I: original image, float values
returns: binary array, with True for the maxima
I = I.astype('float');
I = I / np.max(I) * 2**31;
I = I.astype('int32');
rec = morphology.reconstruction(I-1, I);
maxima = I - rec;
This code is relatively fast. Notice that the matlab function
imregionalmax seem to work the same way (the help is not explicit, but
the results on a few tests seem to be similar).
I am afraid I do not have time to integrate it on gitlab, but this
should be a good start if someone wants to work on it. If you see any
problem with this code, please correct it.
scikit-image mailing list