KlassenKlassenKlassenKlassen | | | | Operatoren

watershedswatershedsWatershedswatershedsWatershedsWatersheds (Operator)

Name

watershedswatershedsWatershedswatershedsWatershedsWatersheds — Segmentieren nach dem Wasserscheiden-Prinzip.

Signatur

watersheds(Image : Basins, Watersheds : : )

Herror watersheds(const Hobject Image, Hobject* Basins, Hobject* Watersheds)

Herror T_watersheds(const Hobject Image, Hobject* Basins, Hobject* Watersheds)

Herror watersheds(Hobject Image, Hobject* Basins, Hobject* Watersheds)

HRegionArray HImage::Watersheds(HRegion* Watersheds) const

HRegionArray HImageArray::Watersheds(HRegionArray* Watersheds) const

void Watersheds(const HObject& Image, HObject* Basins, HObject* Watersheds)

HRegion HImage::Watersheds(HRegion* Watersheds) const

void HOperatorSetX.Watersheds(
[in] IHUntypedObjectX* Image, [out] IHUntypedObjectX*Basins, [out] IHUntypedObjectX*Watersheds)

IHRegionX* HImageX.Watersheds([out] IHRegionX*Watersheds)

static void HOperatorSet.Watersheds(HObject image, out HObject basins, out HObject watersheds)

HRegion HImage.Watersheds(out HRegion watersheds)

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_filterBinomialFilterbinomial_filterBinomialFilterBinomialFilter oder gauss_filtergauss_filterGaussFiltergauss_filterGaussFilterGaussFilter). Eine weitere Möglichkeit, die Anzahl der Ergebnisregionen zu reduzieren, besteht darin, benachbarte Becken aufgrund eines Schwellenwertkriteriums mit watersheds_thresholdwatersheds_thresholdWatershedsThresholdwatersheds_thresholdWatershedsThresholdWatershedsThreshold zu vereinigen (für weitere Informationen siehe watersheds_thresholdwatersheds_thresholdWatershedsThresholdwatersheds_thresholdWatershedsThresholdWatershedsThreshold).

Achtung

Wenn das Bild feine Strukturen enthält oder verrauscht ist, entstehen sehr viele Regionen und damit steigt die Laufzeit deulich an.

Parallelisierung

Parameter

ImageImageImageImageImageimage (input_object)  singlechannelimage(-array) objectHImageHImageHImageHImageXHobject (byte / uint2 / real)

Eingabebild.

BasinsBasinsBasinsBasinsBasinsbasins (output_object)  region-array objectHRegionHRegionHRegionArrayHRegionXHobject *

Segmentierte Becken.

WatershedsWatershedsWatershedsWatershedsWatershedswatersheds (output_object)  region(-array) objectHRegionHRegionHRegionHRegionXHobject *

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);
}

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

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_systemSetSystemset_systemSetSystemSetSystem). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

binomial_filterbinomial_filterBinomialFilterbinomial_filterBinomialFilterBinomialFilter, gauss_filtergauss_filterGaussFiltergauss_filterGaussFilterGaussFilter, smooth_imagesmooth_imageSmoothImagesmooth_imageSmoothImageSmoothImage, invert_imageinvert_imageInvertImageinvert_imageInvertImageInvertImage

Nachfolger

expand_regionexpand_regionExpandRegionexpand_regionExpandRegionExpandRegion, select_shapeselect_shapeSelectShapeselect_shapeSelectShapeSelectShape, reduce_domainreduce_domainReduceDomainreduce_domainReduceDomainReduceDomain, openingopeningOpeningopeningOpeningOpening

Alternativen

watersheds_thresholdwatersheds_thresholdWatershedsThresholdwatersheds_thresholdWatershedsThresholdWatershedsThreshold, pouringpouringPouringpouringPouringPouring

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


KlassenKlassenKlassenKlassen | | | | Operatoren