watershedswatershedsWatershedsWatershedswatersheds (Operator)
Name
watershedswatershedsWatershedsWatershedswatersheds — Segmentieren nach dem Wasserscheiden-Prinzip.
Signatur
def watersheds(image: HObject) -> Tuple[HObject, HObject]
Beschreibung
watershedswatershedsWatershedsWatershedsWatershedswatersheds zerlegt das Bild aufgrund der Topologie der
Grauwerte. Diese werden als relative Höhenwerte interpretiert.
Große Werte entsprechen „hohen Bereichen“ niedrige Werte
entsprechen „tiefen Bereichen“. In dem hieraus entstehenden
dreidimensionalen Grauwertgebirge werden Wasserscheiden gesucht.
Wasserscheiden sind hellen Grate zwischen dunklen Becken. Der
Parameter BasinsBasinsBasinsBasinsbasinsbasins enthält diese dunklen Becken.
WatershedsWatershedsWatershedsWatershedswatershedswatersheds enthält die Punkte der Wasserscheiden, die
höchstens 1 Pixel breit sind.
WatershedsWatershedsWatershedsWatershedswatershedswatersheds ist immer eine Region pro
Eingabebild, BasinsBasinsBasinsBasinsbasinsbasins dagegen enthält für jedes Becken
eine eigene Region.
Es ist günstig, vorher einen Glättungsfilter zu verwenden, um die
Anzahl der Regionen zu reduzieren (z.B. binomial_filterbinomial_filterBinomialFilterBinomialFilterBinomialFilterbinomial_filter oder
gauss_filtergauss_filterGaussFilterGaussFilterGaussFiltergauss_filter). Eine weitere Möglichkeit, die Anzahl der
Ergebnisregionen zu reduzieren, besteht darin, benachbarte Becken
aufgrund eines Schwellenwertkriteriums mit
watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThresholdwatersheds_threshold zu vereinigen (für weitere
Informationen siehe watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThresholdwatersheds_threshold).
Achtung
Wenn das Bild feine Strukturen enthält oder verrauscht ist,
entstehen sehr viele Regionen und damit steigt die Laufzeit deutlich
an.
Ausführungsinformationen
- Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
- Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
- Automatisch parallelisiert auf Tupelebene.
Parameter
ImageImageImageImageimageimage (input_object) singlechannelimage(-array) → objectHImageHObjectHImageHobject (byte / uint2 / real)
Eingabebild.
BasinsBasinsBasinsBasinsbasinsbasins (output_object) region-array → objectHRegionHObjectHRegionHobject *
Segmentierte Becken.
WatershedsWatershedsWatershedsWatershedswatershedswatersheds (output_object) region(-array) → objectHRegionHObjectHRegionHobject *
Wasserscheiden zwischen den Becken.
Beispiel (C++)
#include "HIOStream.h"
#if !defined(USE_IOSTREAM_H)
using namespace std;
#endif
#include "HalconCpp.h"
using namespace Halcon;
int main (int argc, char *argv[])
{
HImage image (argv[1]), gauss;
HWindow win;
cout << "Gauss of original " << endl;
gauss = image.GaussImage (9);
image.Display (win);
HRegion watersheds;
HRegionArray basins = gauss.Watersheds (&watersheds);
win.SetColored (12);
basins.Display (win);
win.Click ();
return (0);
}
Beispiel (C)
read_image(&Cells,"meningg5");
gauss_filter(Cells,&CellsGauss,9);
invert_image(CellsGauss,&CellsInvert);
watersheds(CellsInvert,&Bassins,&Watersheds);
set_colored(WindowHandle,12);
disp_region(Bassins,WindowHandle);
Beispiel (C++)
#include "HIOStream.h"
#if !defined(USE_IOSTREAM_H)
using namespace std;
#endif
#include "HalconCpp.h"
using namespace Halcon;
int main (int argc, char *argv[])
{
HImage image (argv[1]), gauss;
HWindow win;
cout << "Gauss of original " << endl;
gauss = image.GaussImage (9);
image.Display (win);
HRegion watersheds;
HRegionArray basins = gauss.Watersheds (&watersheds);
win.SetColored (12);
basins.Display (win);
win.Click ();
return (0);
}
Beispiel (C++)
#include "HIOStream.h"
#if !defined(USE_IOSTREAM_H)
using namespace std;
#endif
#include "HalconCpp.h"
using namespace Halcon;
int main (int argc, char *argv[])
{
HImage image (argv[1]), gauss;
HWindow win;
cout << "Gauss of original " << endl;
gauss = image.GaussImage (9);
image.Display (win);
HRegion watersheds;
HRegionArray basins = gauss.Watersheds (&watersheds);
win.SetColored (12);
basins.Display (win);
win.Click ();
return (0);
}
Beispiel (C++)
#include "HIOStream.h"
#if !defined(USE_IOSTREAM_H)
using namespace std;
#endif
#include "HalconCpp.h"
using namespace Halcon;
int main (int argc, char *argv[])
{
HImage image (argv[1]), gauss;
HWindow win;
cout << "Gauss of original " << endl;
gauss = image.GaussImage (9);
image.Display (win);
HRegion watersheds;
HRegionArray basins = gauss.Watersheds (&watersheds);
win.SetColored (12);
basins.Display (win);
win.Click ();
return (0);
}
Ergebnis
watershedswatershedsWatershedsWatershedsWatershedswatersheds liefert normalerweise den Wert 2 (H_MSG_TRUE).
Für das Verhalten bzgl. der Eingabebilder und Ausgaberegionen sind
die Flags 'no_object_result'"no_object_result""no_object_result""no_object_result""no_object_result""no_object_result",
'empty_region_result'"empty_region_result""empty_region_result""empty_region_result""empty_region_result""empty_region_result" und 'store_empty_region'"store_empty_region""store_empty_region""store_empty_region""store_empty_region""store_empty_region"
einstellbar (siehe set_systemset_systemSetSystemSetSystemSetSystemset_system). Gegebenenfalls wird
eine Fehlerbehandlung durchgeführt.
Vorgänger
binomial_filterbinomial_filterBinomialFilterBinomialFilterBinomialFilterbinomial_filter,
gauss_filtergauss_filterGaussFilterGaussFilterGaussFiltergauss_filter,
smooth_imagesmooth_imageSmoothImageSmoothImageSmoothImagesmooth_image,
invert_imageinvert_imageInvertImageInvertImageInvertImageinvert_image
Nachfolger
expand_regionexpand_regionExpandRegionExpandRegionExpandRegionexpand_region,
select_shapeselect_shapeSelectShapeSelectShapeSelectShapeselect_shape,
reduce_domainreduce_domainReduceDomainReduceDomainReduceDomainreduce_domain,
openingopeningOpeningOpeningOpeningopening
Alternativen
watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThresholdwatersheds_threshold,
pouringpouringPouringPouringPouringpouring,
watersheds_markerwatersheds_markerWatershedsMarkerWatershedsMarkerWatershedsMarkerwatersheds_marker
Literatur
L. Vincent, P. Soille: „Watersheds in Digital Space: An Efficient
Algorithm Based on Immersion Simulations“; IEEE Transactions on Pattern
Analysis and Machine Intelligence; vol. 13, no. 6; pp. 583-598; 1991.
Modul
Foundation