Skip to content

watersheds_markerWatershedsMarkerWatershedsMarkerwatersheds_markerwatersheds_markerπŸ”—

Short descriptionπŸ”—

watersheds_markerWatershedsMarkerWatershedsMarkerwatersheds_markerwatersheds_marker β€” Extract watersheds and combine basins based on markers.

SignatureπŸ”—

watersheds_marker( image Image, region Markers, out region Basins )void WatershedsMarker( const HObject& Image, const HObject& Markers, HObject* Basins )static void HOperatorSet.WatershedsMarker( HObject image, HObject markers, out HObject basins )def watersheds_marker( image: HObject, markers: HObject ) -> HObject

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

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

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

HRegion HImage.WatershedsMarker( HRegion markers )

DescriptionπŸ”—

watersheds_markerWatershedsMarker segments an image based on the topology of the gray values and returns the resulting regions in Basinsbasinsbasins. 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 Markersmarkersmarkers, 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 Markersmarkersmarkers, are returned in Basinsbasinsbasins. 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 Imageimageimage. Parts of the marker regions outside the domain of Imageimageimage are ignored.

It is advisable to apply a smoothing operator (e.g., binomial_filterBinomialFilter or gauss_filterGaussFilter) to the input image before calling watersheds_markerWatershedsMarker. To segment an image, it is also often reasonable to run an edge extractor (such as edges_imageEdgesImage or edges_colorEdgesColor) on the image, and pass the resulting amplitude image to watersheds_markerWatershedsMarker.

AttentionπŸ”—

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πŸ”—

Execution information
  • Multithreading type: reentrant (runs in parallel with non-exclusive operators).

  • Multithreading scope: global (may be called from any thread).

  • Processed without parallelization.

ParametersπŸ”—

Imageimageimage (input_object) singlechannelimage β†’ object (byte / uint2 / real)HObject (byte / uint2 / real)HImage (byte / uint2 / real)HObject (byte / uint2 / real)Hobject (byte / uint2 / real)

Input image.

Markersmarkersmarkers (input_object) region-array β†’ objectHObjectHRegionHObjectHobject

Initial markers from which to flood the image.

Basinsbasinsbasins (output_object) region-array β†’ objectHObjectHRegionHObjectHobject *

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)

ResultπŸ”—

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

Combinations with other operatorsπŸ”—

Combinations

Possible predecessors

binomial_filterBinomialFilter, gauss_filterGaussFilter, smooth_imageSmoothImage, invert_imageInvertImage, edges_imageEdgesImage

Possible successors

expand_regionExpandRegion, select_shapeSelectShape, reduce_domainReduceDomain, openingOpening

Alternatives

watershedsWatersheds, pouringPouring, watersheds_thresholdWatershedsThreshold

ModuleπŸ”—

Foundation