Herror ::dyn_threshold (
    Hobject OrigImage,
    Hobject ThresholdImage,
    Hobject *RegionDynThresh,
    const HTuple &Offset,
    const HTuple &LightDark
)
HRegion HImage::DynThreshold (
    const HImageArray &ThresholdImage,
    const HTuple &Offset,
    const HTuple &LightDark
) const
HRegionArray HImageArray::DynThreshold (
    const HImageArray &ThresholdImage,
    const HTuple &Offset,
    const HTuple &LightDark
) const

Segment an image using a local threshold.

::dyn_threshold selects from the input image those regions in which the pixels fulfill a threshold condition. Let g_{o} = g_{OrigImage}, and g_{m} = g_{ThresholdImage}. Then the condition for LightDark = 'light' is:

                 g_o >= g_m + Offset
For LightDark = 'dark' the condition is:
                 g_o <= g_m - Offset
For LightDark = 'equal' it is:
                 g_m - Offset <= g_o <= g_m + Offset
Finally, for LightDark = 'not_equal' it is:
                 g_m - Offset > g_o oder g_o > g_m + Offset
This means that all points in OrigImage whose gray value is larger then or equal to the gray value in ThresholdImage plus an offset are aggregated into the resulting region.

Typically, the threshold images are smoothed versions of the original image (e.g., by applying ::mean_image, ::gauss_image, etc.). Then the effect of ::dyn_threshold is similar to applying ::threshold to a highpass-filtered version of the original image (see ::highpass_image).

With ::dyn_threshold contours of an object can be extracted, where the objects' size (diameter) is determined by the mask size of the lowpass filter and the amplitude of the objects' edges:

The larger the mask size is chosen, the larger the found regions get. As a rule of thumb, the mask size should be about twice the diameter of the objects to be extracted. It is important not to set the parameter Offset to zero because in this case too many small regions will be found (noise). Values between 5 and 40 are a sensible choice. The larger Offset is chosen, the smaller the extracted regions get.

All points of the input image fulfilling the above condition are stored jointly in one region. If necessary, the connected components can be obtained by calling ::connection.


Attention

If Offset is chosen from -1 to 1 usually a very noisy region is generated, requiring large storage. If Offset is chosen too large (> 60, say) it may happen that no points fulfill the threshold condition (i.e., an empty region is returned). If Offset is chosen too small (< -60, say) it may happen that all points fulfill the threshold condition (i.e., a full region is returned).


Parameters

OrigImage (input_object)
image(-array) -> Hobject: HImage(Array) ( byte / int2 / int4 / real )
Image to be segmented.

ThresholdImage (input_object)
image(-array) -> Hobject: HImage(Array) ( byte / int2 / int4 / real )
Image containing the local thresholds.

RegionDynThresh (output_object)
region(-array) -> Hobject * : HRegion(Array)
Segmented regions.

Offset (input_control)
number -> HTuple.double / long
Offset added to ThresholdImage.
Default value: 5.0
Suggested values: 1.0, 3.0, 5.0, 7.0, 10.0, 20.0, 30.0
Typical range of values: -255.0 <= Offset <= 255.0 (lin)
Minimum increment: 0.01
Recommended increment: 5
Restriction: (-255 < Offset) && (Offset < 255)

LightDark (input_control)
string -> HTuple.char *
Extract light, dark or similar areas?
Default value: 'light'
List of values: 'dark', 'light', 'equal', 'not_equal'


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

int main (int argc, char *argv[])
{
  HImage   image ("affe"),
           mean;
  HWindow  win;

  if (argc != 2)
  {
    cout << "Using: " << argv[0] << " <diameter>" << endl;
    exit (1);
  }

  int d = atoi (argv[1]) * 2 + 1;

  image.Display (win);

  mean = image.MeanImage (d, d);

  HRegionArray seg = image.DynThreshold (mean, 5.0, "light");
  HRegionArray reg = seg.Connection ();

  win.SetColored (12);
  reg.Display (win);
  win.Click ();

  return (0);
}

Complexity

Let F be the area of the input region. Then the runtime complexity is O(F).


Result

::dyn_threshold returns H_MSG_TRUE if all parameters are correct. The behavior with respect to the input images and output regions can be determined by setting the values of the flags 'no_object_result', 'empty_region_result', and 'store_empty_region' with ::set_system. If necessary, an exception is raised.


Possible Predecessors

::mean_image, ::smooth_image, ::gauss_image


Possible Successors

::connection, ::select_shape, ::reduce_domain, ::select_gray, ::rank_region, ::dilation1, ::opening


Alternatives

::check_difference, ::highpass_image, ::sub_image, ::threshold


See also

::mean_image, ::smooth_image, ::gauss_image, ::connection, ::rank_region, ::dilation1


Module

Region processing



Copyright © 1996-2002 MVTec Software GmbH