Herror ::pouring (
    Hobject Image,
    Hobject *Regions,
    const HTuple &Mode,
    const HTuple &MinGray,
    const HTuple &MaxGray
)
HRegionArray HImage::Pouring (
    const HTuple &Mode,
    const HTuple &MinGray,
    const HTuple &MaxGray
) const

Segment an image by ``pouring water'' over it.

::pouring regards the input image as a ``mountain range.'' Larger gray values correspond to mountain peaks, while smaller gray values correspond to valley bottoms. ::pouring segments the input image in several steps. First the local maxima are extracted, i.e., pixels which either alone or in the form of an extended plateau have larger gray values than their immediate neighbors (in 4-connectivity). In the next step, the maxima thus found are the starting points for an expansion until ``valley bottoms'' are reached. The expansion is done as long as there are chains of pixels in which the gray value gets smaller (like water running downhill from the maxima in all directions). Again, 4-connectivity is used, but with a weaker condition (smaller or equal). This means that points at valley bottoms may belong to more than one maximum. These areas are at first not assigned to a region, but rather are split among all competing segments in the last step. The split is done by a uniform expansion of all involved segments, until all ambiguous pixels were assigned. The parameter Mode determines which steps are executed. The following values are possible:

'all'
    This is the normal mode of operation.  All steps of the
    segmentation are performed.  The regions are assigned to maxima,
    and overlapping regions are split.

'maxima'
    The segmentation only extracts the local maxima of the input
    image.  No corresponding regions are extracted.

'regions'
    The segmentation extracts the local maxima of the input image
    and the corresponding regions, which are uniquely determined.
    Areas which could be assigned to more than one maximum are not
    split.

In order to prevent the algorithm from splitting a uniform background, which is different from the rest of the image, the parameters MinGray and MaxGray determine gray value thresholds for regions in the image which should be regarded as background. All parts of the image having a gray value smaller than MinGray or larger than MaxGray are disregarded for the extraction of the maxima as well as for the assignment of regions. For a complete segmentation of the image, MinGray = 0 und MaxGray = 255 should be selected. In any case, MinGray < MaxGray must be observed.


Parameters

Image (input_object)
image -> Hobject: HImage ( byte )
Image to be segmented.

Regions (output_object)
region-array -> Hobject * : HRegionArray
Segmentation result.

Mode (input_control)
string -> HTuple.char *
Mode of operation.
Default value: 'all'
List of values: 'all', 'maxima', 'regions'

MinGray (input_control)
integer -> HTuple.long
All gray values smaller than this threshold are disregarded.
Default value: 0
Suggested values: 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110
Typical range of values: 0 <= MinGray <= 256 (lin)
Minimum increment: 1
Recommended increment: 10
Restriction: MinGray >= 0

MaxGray (input_control)
integer -> HTuple.long
All gray values larger than this threshold are disregarded.
Default value: 255
Suggested values: 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 255
Typical range of values: 0 <= MaxGray <= 256 (lin)
Minimum increment: 1
Recommended increment: 10
Restriction: (MaxGray <= 255) && (MaxGray > MinGray)


Example
#include  <iostream.h>
#include  "HalconCpp.h"

int main (int argc, char *argv[])
{
  HImage   img1 ("br2"),
           img2 ("hand"),
           img3 ("affe"),
           texture,
           testreg;

  HWindow      w1, w2, w3;
  HRegion      region;
  HRegionArray seg;

  w1.SetColored (12);   img1.Display (w1);
  w2.SetColored (12);   img2.Display (w2);
  w3.SetColored (12);   img3.Display (w3);

  cout << "Smoothing of images 1 and 2 ..." << endl;

  HImage mean1 = img1.MeanImage (11, 11);
  HImage mean2 = img2.MeanImage (15, 15);

  cout << "Full segmentation of images ... " << endl;
  seg = mean1.Pouring ("all", 0, 255);
  seg.Display (w1);

  cout << "Segmentation with: a) masked background " << endl;
  cout << "                   b) intersection " << endl;
  seg = mean2.Pouring ("regions", 40, 255);
  seg.Display (w2);

  cout << "Segmentation in 2d-histogram" << endl;
  cout << "Draw region with the mouse: " << endl;

  region  = w3.DrawRegion ();
  texture = img3.TextureLaws ("el", 2, 5);

  testreg = texture.ReduceDomain (region);
  histo   = testreg.Histo2dim (texture, region);
  seg     = histo.Pouring ("all", 0, 255);

  seg.Display (w3);
  w3.Click ();
  return (0);
}

Complexity

Let N be the number of pixels in the input image and M be the number of found segments, where the enclosing rectangle of the segment i contains m_{i} pixels. Furthermore, let K_{i} be the number of chords in segment i. Then the runtime complexity is

    O(3*N + sum_M (3*m_i) + sum_M (K_i)) .


Result

::pouring usually returns the value H_MSG_TRUE. If necessary, an exception is raised.


Possible Predecessors

::gauss_image, ::smooth_image


Alternatives

::watersheds, ::local_max


See also

::histo_2dim, ::expand_region, ::expand_gray, ::expand_gray_ref


Module

Region processing



Copyright © 1996-2002 MVTec Software GmbH