watersheds_marker — Segmentieren nach dem Marker-basierten Wasserscheiden-Prinzip.
watersheds_marker segmentiert ein Bild basierend auf der Topologie
der Grauwerte und gibt die resultierenden Regionen in Basins zurück.
Das Bild wird dabei als „Grauwertgebirge“ interpretiert.
Höhere Grauwerte entsprechen „Bergen“, während niedrigere Grauwerte
„Tälern“ entsprechen.
Das so interpretierte Bild wird geflutet, beginnend mit den Bereichen
die in Markers definiert sind. Dabei wird jedes Pixel dem Marker
zugeordnet, zu dem es den Pfad mit der kleinsten maximalen Höhe hat. Gibt es
mehrere solche Marker, zu denen ein Pfad mit kleinster maximaler Höhe
existiert, wird das Pixel zufällig einem davon zugeordnet.
Die resultierenden Becken (eines pro Eingangsbereich in Markers)
werden in Basins zurückgegeben.
Beachten Sie, dass einige dieser Bereiche leer sein können.
Dies kann der Fall sein, wenn sich zwei Markerregionen im selben Becken des
Grauwertgebirges befinden. Befindet sich ein Pixel in mehreren
Marker-Startregionen, so wird es nur der letzten zugeordnet.
Es wird allerdings dazu geraten, dass sich Markerregionen nicht überschneiden.
Die Überflutung wird nur für die Domäne von Image durchgeführt.
Markierte Regionen außerhalb des Bereichs von Image werden ignoriert.
Es ist ratsam, einen Glättungsoperator auf dem Eingangsbild anzuwenden
(z.B, binomial_filter oder gauss_filter)
bevor watersheds_marker aufgerufen wird.
Um ein Bild zu segmentieren ist es oft sinnvoll, zunächst die Kanten
des Bildes zu berechnen (z.B. mit edges_image oder
edges_color) und das sich daraus ergebende Amplitudenbild in
watersheds_marker zu übergeben.
Wenn das Bild feine Strukturen enthält oder verrauscht ist, werden intern sehr viele Regionen verarbeitet, wodurch die Laufzeit deutlich ansteigt.
Image (input_object) singlechannelimage → object (byte / uint2 / real)
Eingabebild.
Markers (input_object) region-array → object
Initiale Marker von denen aus das Bild geflutet wird.
Basins (output_object) region-array → object
Segmentierte Becken.
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)
watersheds_marker liefert normalerweise den Wert 2 (H_MSG_TRUE).
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
binomial_filter,
gauss_filter,
smooth_image,
invert_image,
edges_image
expand_region,
select_shape,
reduce_domain,
opening
watersheds,
pouring,
watersheds_threshold
Foundation