# Watershed segmentation of particles¶

This example shows how to make a watershed segmentation where seeds come from local maxima of distance map. The maxima may be filtered to avoid over-segmentation.

The image data is generated similarly to what was done in particle analysis example.

def particle_segmentation():
"""
Demonstrates segmentation of particles using watershed seeded
by (filtered) local maxima of distance map.
"""

# Generate particle image
generate_particles(1000, 0)

# Read generated data file

# Convert to wider data type so that we can label each particle
pi.convert(img, ImageDataType.UINT16)

# Calculate distance map
dmap = pi.newimage(ImageDataType.FLOAT32)
pi.dmap(img, dmap)

# Find maxima
# Note that in some cases the system is able to automatically
# change the data type of output images, so we don't have to
# specify any data type in the pi.newimage() command.
# This does not work always, though, as there might be many
# possible output data types.
maxima = pi.newimage()
pi.localmaxima(dmap, maxima)

# Remove unnecessary maxima to avoid over-segmentation
pi.cleanmaxima(dmap, maxima)

# Create image with labeled maxima only.
# First set all pixels to zero, then label maxima.
pi.set(img, 0)
pi.labelmaxima(img, maxima)

# Grow labels back to original geometry, using distance map value
# as filling priority.
pi.grow(img, dmap)

# Save result
pi.writeraw(img, output_file('particles_watershed'))