watershedswatershedsWatershedsWatersheds (Operator)
Name
watershedswatershedsWatershedsWatersheds
— Extract watersheds and basins from an image.
Signature
Description
watershedswatershedsWatershedsWatershedsWatersheds
segments an image based on the topology of
the gray values. The image is interpreted as a “mountain range.”
Higher gray values correspond to “mountains,” while lower gray
values correspond to “valleys.” In the resulting mountain range
watersheds are extracted. These correspond to the bright ridges
between dark basins. On output, the parameter BasinsBasinsBasinsBasinsbasins
contains these basins, while WatershedsWatershedsWatershedsWatershedswatersheds
contains the
watersheds, which are at most one pixel wide.
WatershedsWatershedsWatershedsWatershedswatersheds
always is a single
region per input image, while BasinsBasinsBasinsBasinsbasins
contains a separate
region for each basin.
It is advisable to apply a smoothing operator (e.g.,
binomial_filterbinomial_filterBinomialFilterBinomialFilterBinomialFilter
or gauss_filtergauss_filterGaussFilterGaussFilterGaussFilter
) to the input image
before calling watershedswatershedsWatershedsWatershedsWatersheds
in order to reduce the number of
output regions. A more sophisticated way to reduce the number of
output regions is to merge neighboring basins based on a threshold
criterion by using watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThreshold
instead (for more
details please refer to the documentation of
watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThreshold
).
Attention
If the image contains many fine structures or is noisy, many output
regions result, and thus the runtime increases considerably.
Execution Information
- Multithreading type: reentrant (runs in parallel with non-exclusive operators).
- Multithreading scope: global (may be called from any thread).
- Automatically parallelized on tuple level.
Parameters
ImageImageImageImageimage
(input_object) singlechannelimage(-array) →
objectHImageHImageHobject (byte / uint2 / real)
Input image.
BasinsBasinsBasinsBasinsbasins
(output_object) region-array →
objectHRegionHRegionHobject *
Segmented basins.
WatershedsWatershedsWatershedsWatershedswatersheds
(output_object) region(-array) →
objectHRegionHRegionHobject *
Watersheds between the basins.
Example (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);
}
Example (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);
Example (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);
}
Example (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);
}
Example (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);
}
Result
watershedswatershedsWatershedsWatershedsWatersheds
always returns 2 (H_MSG_TRUE). The behavior with
respect to the input images and output regions can be determined by
setting the values of the 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", and 'store_empty_region'"store_empty_region""store_empty_region""store_empty_region""store_empty_region"
with set_systemset_systemSetSystemSetSystemSetSystem
. If necessary, an exception is raised.
Possible Predecessors
binomial_filterbinomial_filterBinomialFilterBinomialFilterBinomialFilter
,
gauss_filtergauss_filterGaussFilterGaussFilterGaussFilter
,
smooth_imagesmooth_imageSmoothImageSmoothImageSmoothImage
,
invert_imageinvert_imageInvertImageInvertImageInvertImage
Possible Successors
expand_regionexpand_regionExpandRegionExpandRegionExpandRegion
,
select_shapeselect_shapeSelectShapeSelectShapeSelectShape
,
reduce_domainreduce_domainReduceDomainReduceDomainReduceDomain
,
openingopeningOpeningOpeningOpening
Alternatives
watersheds_thresholdwatersheds_thresholdWatershedsThresholdWatershedsThresholdWatershedsThreshold
,
pouringpouringPouringPouringPouring
References
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.
Module
Foundation