watersheds_markerwatersheds_markerWatershedsMarkerWatershedsMarker (Operator)


watersheds_markerwatersheds_markerWatershedsMarkerWatershedsMarker — Extract watersheds and combine basins based on markers.


watersheds_marker(Image, Markers : Basins : : )

Herror watersheds_marker(const Hobject Image, const Hobject Markers, Hobject* Basins)

Herror T_watersheds_marker(const Hobject Image, const Hobject Markers, Hobject* Basins)

void WatershedsMarker(const HObject& Image, const HObject& Markers, HObject* Basins)

HRegion HImage::WatershedsMarker(const HRegion& Markers) const

static void HOperatorSet.WatershedsMarker(HObject image, HObject markers, out HObject basins)

HRegion HImage.WatershedsMarker(HRegion markers)


watersheds_markerwatersheds_markerWatershedsMarkerWatershedsMarkerWatershedsMarker segments an image based on the topology of the gray values and returns the resulting regions in BasinsBasinsBasinsBasinsbasins. The image is interpreted as a “mountain range”. Higher gray values correspond to “mountains”, while lower gray values correspond to “valleys”. The image, interpreted in this particular way, is flooded, starting with the regions defined in MarkersMarkersMarkersMarkersmarkers, until the entire image is filled. Thus, each pixel is assigned to the marker to which it has the path with the lowest maximum height. If this is the case for multiple markers, the pixel is assigned to either of them.

The resulting basins, one per input region in MarkersMarkersMarkersMarkersmarkers, are returned in BasinsBasinsBasinsBasinsbasins. Note that some of those regions might be empty. This can happen if, for example, two marker regions are in the same watershed basin. If a pixel is contained in multiple marker regions, only the last marker region is used as seed for that pixel. It is advised that the marker regions do not overlap.

The flooding is performed only for the domain of ImageImageImageImageimage. Parts of the marker regions outside the domain of ImageImageImageImageimage are ignored.

It is advisable to apply a smoothing operator (e.g., binomial_filterbinomial_filterBinomialFilterBinomialFilterBinomialFilter or gauss_filtergauss_filterGaussFilterGaussFilterGaussFilter) to the input image before calling watersheds_markerwatersheds_markerWatershedsMarkerWatershedsMarkerWatershedsMarker. To segment an image, it is also often reasonable to run an edge extractor (such as edges_imageedges_imageEdgesImageEdgesImageEdgesImage or edges_coloredges_colorEdgesColorEdgesColorEdgesColor) on the image, and pass the resulting amplitude image to watersheds_markerwatersheds_markerWatershedsMarkerWatershedsMarkerWatershedsMarker.


If the image contains many fine structures or is noisy, many watershed regions need to be processed internally, and thus the runtime increases considerably.

Execution Information


ImageImageImageImageimage (input_object)  singlechannelimage objectHImageHImageHobject (byte / uint2 / real)

Input image.

MarkersMarkersMarkersMarkersmarkers (input_object)  region-array objectHRegionHRegionHobject

Initial markers from which to flood the image.

BasinsBasinsBasinsBasinsbasins (output_object)  region-array objectHRegionHRegionHobject *

Basins for all markers.

Example (HDevelop)

	read_image (Image, 'printer_chip/printer_chip_01')
	edges_image (Image, ImaAmp, ImaDir, 'canny', 1, 'nms', 20, 40)

	* Compute background marker
	full_domain (ImaAmp, ImageFull)
	erosion_circle (Image, RegionErosion, 2.5)
	difference (Image, RegionErosion, Boundary)

	* Compute foreground markers
	threshold (Image, Region, 200, 255)
	erosion_circle (Region, RegionErosion1, 7.5)
	connection (RegionErosion1, ConnectedRegions)
	select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1500, 99999)

	* Apply marker-based watersheds
	concat_obj (Boundary, SelectedRegions, MarkerRegions)
	watersheds_marker (ImageFull, MarkerRegions, Basins)

	* Display results
	dev_display (Image)
	dev_set_color (['#FF000055', '#00FF0055', '#0000FF55', '#FF00FF55', '#FFFF0055', '#00FFFF55', '#80FF0055', '#0080FF55'])
	dev_display (MarkerRegions)
	dev_set_draw ('fill')
	dev_display (Basins)


If all input parameters are valid, watersheds_markerwatersheds_markerWatershedsMarkerWatershedsMarkerWatershedsMarker returns 2 (H_MSG_TRUE). If necessary, an exception is raised.

Possible Predecessors

binomial_filterbinomial_filterBinomialFilterBinomialFilterBinomialFilter, gauss_filtergauss_filterGaussFilterGaussFilterGaussFilter, smooth_imagesmooth_imageSmoothImageSmoothImageSmoothImage, invert_imageinvert_imageInvertImageInvertImageInvertImage, edges_imageedges_imageEdgesImageEdgesImageEdgesImage

Possible Successors

expand_regionexpand_regionExpandRegionExpandRegionExpandRegion, select_shapeselect_shapeSelectShapeSelectShapeSelectShape, reduce_domainreduce_domainReduceDomainReduceDomainReduceDomain, openingopeningOpeningOpeningOpening


watershedswatershedsWatershedsWatershedsWatersheds, pouringpouringPouringPouringPouring, watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThreshold