watershedswatershedsWatershedsWatersheds (Operator)
Name
watershedswatershedsWatershedsWatersheds
— Segmentieren nach dem Wasserscheiden-Prinzip.
Signatur
Beschreibung
watershedswatershedsWatershedsWatershedsWatersheds
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 BasinsBasinsBasinsBasinsbasins
enthält diese dunklen Becken.
WatershedsWatershedsWatershedsWatershedswatersheds
enthält die Punkte der Wasserscheiden, die
höchstens 1 Pixel breit sind.
WatershedsWatershedsWatershedsWatershedswatersheds
ist immer eine Region pro
Eingabebild, BasinsBasinsBasinsBasinsbasins
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_filterBinomialFilterBinomialFilterBinomialFilter
oder
gauss_filtergauss_filterGaussFilterGaussFilterGaussFilter
). Eine weitere Möglichkeit, die Anzahl der
Ergebnisregionen zu reduzieren, besteht darin, benachbarte Becken
aufgrund eines Schwellenwertkriteriums mit
watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThreshold
zu vereinigen (für weitere
Informationen siehe watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThreshold
).
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
ImageImageImageImageimage
(input_object) singlechannelimage(-array) →
objectHImageHImageHobject (byte / uint2 / real)
Eingabebild.
BasinsBasinsBasinsBasinsbasins
(output_object) region-array →
objectHRegionHRegionHobject *
Segmentierte Becken.
WatershedsWatershedsWatershedsWatershedswatersheds
(output_object) region(-array) →
objectHRegionHRegionHobject *
Wasserscheiden zwischen den Becken.
Beispiel (C++ (HALCON 5.0-10.0))
#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++ (HALCON 5.0-10.0))
#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++ (HALCON 5.0-10.0))
#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++ (HALCON 5.0-10.0))
#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
watershedswatershedsWatershedsWatershedsWatersheds
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",
'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"
einstellbar (siehe set_systemset_systemSetSystemSetSystemSetSystem
). Gegebenenfalls wird
eine Fehlerbehandlung durchgeführt.
Vorgänger
binomial_filterbinomial_filterBinomialFilterBinomialFilterBinomialFilter
,
gauss_filtergauss_filterGaussFilterGaussFilterGaussFilter
,
smooth_imagesmooth_imageSmoothImageSmoothImageSmoothImage
,
invert_imageinvert_imageInvertImageInvertImageInvertImage
Nachfolger
expand_regionexpand_regionExpandRegionExpandRegionExpandRegion
,
select_shapeselect_shapeSelectShapeSelectShapeSelectShape
,
reduce_domainreduce_domainReduceDomainReduceDomainReduceDomain
,
openingopeningOpeningOpeningOpening
Alternativen
watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThreshold
,
pouringpouringPouringPouringPouring
,
watersheds_markerwatersheds_markerWatershedsMarkerWatershedsMarkerWatershedsMarker
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