approx_chainT_approx_chainApproxChainApproxChainapprox_chain (Operator)

Name

approx_chainT_approx_chainApproxChainApproxChainapprox_chain — Approximate a contour by arcs and lines.

Warning

approx_chainapprox_chainApproxChainApproxChainApproxChainapprox_chain is obsolete and is only provided for reasons of backward compatibility.

Signature

approx_chain( : : Row, Column, MinWidthCoord, MaxWidthCoord, ThreshStart, ThreshEnd, ThreshStep, MinWidthSmooth, MaxWidthSmooth, MinWidthCurve, MaxWidthCurve, Weight1, Weight2, Weight3 : ArcCenterRow, ArcCenterCol, ArcAngle, ArcBeginRow, ArcBeginCol, LineBeginRow, LineBeginCol, LineEndRow, LineEndCol, Order)

Herror T_approx_chain(const Htuple Row, const Htuple Column, const Htuple MinWidthCoord, const Htuple MaxWidthCoord, const Htuple ThreshStart, const Htuple ThreshEnd, const Htuple ThreshStep, const Htuple MinWidthSmooth, const Htuple MaxWidthSmooth, const Htuple MinWidthCurve, const Htuple MaxWidthCurve, const Htuple Weight1, const Htuple Weight2, const Htuple Weight3, Htuple* ArcCenterRow, Htuple* ArcCenterCol, Htuple* ArcAngle, Htuple* ArcBeginRow, Htuple* ArcBeginCol, Htuple* LineBeginRow, Htuple* LineBeginCol, Htuple* LineEndRow, Htuple* LineEndCol, Htuple* Order)

void ApproxChain(const HTuple& Row, const HTuple& Column, const HTuple& MinWidthCoord, const HTuple& MaxWidthCoord, const HTuple& ThreshStart, const HTuple& ThreshEnd, const HTuple& ThreshStep, const HTuple& MinWidthSmooth, const HTuple& MaxWidthSmooth, const HTuple& MinWidthCurve, const HTuple& MaxWidthCurve, const HTuple& Weight1, const HTuple& Weight2, const HTuple& Weight3, HTuple* ArcCenterRow, HTuple* ArcCenterCol, HTuple* ArcAngle, HTuple* ArcBeginRow, HTuple* ArcBeginCol, HTuple* LineBeginRow, HTuple* LineBeginCol, HTuple* LineEndRow, HTuple* LineEndCol, HTuple* Order)

static void HMisc::ApproxChain(const HTuple& Row, const HTuple& Column, double MinWidthCoord, double MaxWidthCoord, double ThreshStart, double ThreshEnd, double ThreshStep, double MinWidthSmooth, double MaxWidthSmooth, Hlong MinWidthCurve, Hlong MaxWidthCurve, double Weight1, double Weight2, double Weight3, HTuple* ArcCenterRow, HTuple* ArcCenterCol, HTuple* ArcAngle, HTuple* ArcBeginRow, HTuple* ArcBeginCol, HTuple* LineBeginRow, HTuple* LineBeginCol, HTuple* LineEndRow, HTuple* LineEndCol, HTuple* Order)

static void HOperatorSet.ApproxChain(HTuple row, HTuple column, HTuple minWidthCoord, HTuple maxWidthCoord, HTuple threshStart, HTuple threshEnd, HTuple threshStep, HTuple minWidthSmooth, HTuple maxWidthSmooth, HTuple minWidthCurve, HTuple maxWidthCurve, HTuple weight1, HTuple weight2, HTuple weight3, out HTuple arcCenterRow, out HTuple arcCenterCol, out HTuple arcAngle, out HTuple arcBeginRow, out HTuple arcBeginCol, out HTuple lineBeginRow, out HTuple lineBeginCol, out HTuple lineEndRow, out HTuple lineEndCol, out HTuple order)

static void HMisc.ApproxChain(HTuple row, HTuple column, double minWidthCoord, double maxWidthCoord, double threshStart, double threshEnd, double threshStep, double minWidthSmooth, double maxWidthSmooth, int minWidthCurve, int maxWidthCurve, double weight1, double weight2, double weight3, out HTuple arcCenterRow, out HTuple arcCenterCol, out HTuple arcAngle, out HTuple arcBeginRow, out HTuple arcBeginCol, out HTuple lineBeginRow, out HTuple lineBeginCol, out HTuple lineEndRow, out HTuple lineEndCol, out HTuple order)

def approx_chain(row: Sequence[int], column: Sequence[int], min_width_coord: float, max_width_coord: float, thresh_start: float, thresh_end: float, thresh_step: float, min_width_smooth: float, max_width_smooth: float, min_width_curve: int, max_width_curve: int, weight_1: float, weight_2: float, weight_3: float) -> Tuple[Sequence[int], Sequence[int], Sequence[float], Sequence[int], Sequence[int], Sequence[int], Sequence[int], Sequence[int], Sequence[int], Sequence[int]]

Description

The coordinates of a curve are approximated by a row of lines and arcs. The procedure tries values from a user-definable range for certain parameters. The limits of these ranges are explicitly stated in the parameter list of the function (MinWidthCoord ... MaxWidthCoord, ThreshStart ... ThreshEnd, MinWidthSmooth ... MaxWidthSmooth, MinWidthCurve ... MaxWidthCurve). Additionally, the step width for the parameter area of the threshold value for pointed corners has to be indicated (ThreshStep). By narrowing the covered areas the runtime of the calculation can be shortened, but the result may deteriorate.

The parameters Weight1, Weight2 and Weight3 indicate whether the desired weighting is placed more on precision of the approximation, obtaining as much large segments as possible or as few small segments as possible. Thus, for (Weight1,Weight2,Weight3) (1,0,0) creates a very precise approximation and (0,1,1) an approximation with as few large segments as possible.

The result of the procedure is returned separately as arcs and lines. If one is interested in the sequence of the segments the individual resulting elements can be read successively from the resulting tuples; the sequence can be taken from the return parameter order (0: next element is next line segment, 1: next element is next arc segment).

Attention

Contours which can possibly consist of only one segment should also be examined with a threshold maximum (ThreshEnd) > 1.0, because otherwise at least one “corner point” is determined in any case.

Execution Information

Parameters

RowRowRowRowrowrow (input_control)  point.y-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Row of the contour.

Default value: 32

ColumnColumnColumnColumncolumncolumn (input_control)  point.x-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Column of the contour.

Default value: 32

MinWidthCoordMinWidthCoordMinWidthCoordMinWidthCoordminWidthCoordmin_width_coord (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Minimum width of Gauss operator for coordinate smoothing (> 0.4).

Default value: 0.5

Suggested values: 0.5, 0.7, 1.0, 1.2, 1.5, 1.7

Typical range of values: 0.4 ≤ MinWidthCoord MinWidthCoord MinWidthCoord MinWidthCoord minWidthCoord min_width_coord ≤ 3.0 (lin)

Minimum increment: 0.01

Recommended increment: 0.1

MaxWidthCoordMaxWidthCoordMaxWidthCoordMaxWidthCoordmaxWidthCoordmax_width_coord (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Maximum width of Gauss operator for coordinate smoothing (> 0.4).

Default value: 2.4

Suggested values: 0.5, 0.7, 1.0, 1.2, 1.5, 1.7

Typical range of values: 0.4 ≤ MaxWidthCoord MaxWidthCoord MaxWidthCoord MaxWidthCoord maxWidthCoord max_width_coord ≤ 3.0 (lin)

Minimum increment: 0.01

Recommended increment: 0.1

ThreshStartThreshStartThreshStartThreshStartthreshStartthresh_start (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Minimum threshold value of the curvature for accepting a corner (relative to the largest curvature present).

Default value: 0.3

Suggested values: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8

Typical range of values: 0.1 ≤ ThreshStart ThreshStart ThreshStart ThreshStart threshStart thresh_start ≤ 0.9 (lin)

Minimum increment: 0.01

Recommended increment: 0.1

ThreshEndThreshEndThreshEndThreshEndthreshEndthresh_end (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Maximum threshold value of the curvature for accepting a corner (relative to the largest curvature present).

Default value: 0.9

Suggested values: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8

Typical range of values: 0.1 ≤ ThreshEnd ThreshEnd ThreshEnd ThreshEnd threshEnd thresh_end ≤ 0.9 (lin)

Minimum increment: 0.01

Recommended increment: 0.1

ThreshStepThreshStepThreshStepThreshStepthreshStepthresh_step (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Step width for threshold increase.

Default value: 0.2

Suggested values: 0.3, 0.4, 0.5

Typical range of values: 0.1 ≤ ThreshStep ThreshStep ThreshStep ThreshStep threshStep thresh_step ≤ 0.9 (lin)

Minimum increment: 0.01

Recommended increment: 0.1

MinWidthSmoothMinWidthSmoothMinWidthSmoothMinWidthSmoothminWidthSmoothmin_width_smooth (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Minimum width of Gauss operator for smoothing the curvature function (> 0.4).

Default value: 0.5

Suggested values: 0.5, 0.7, 1.0, 1.2, 1.5, 1.7

Typical range of values: 0.4 ≤ MinWidthSmooth MinWidthSmooth MinWidthSmooth MinWidthSmooth minWidthSmooth min_width_smooth ≤ 3.0 (lin)

Minimum increment: 0.01

Recommended increment: 0.1

MaxWidthSmoothMaxWidthSmoothMaxWidthSmoothMaxWidthSmoothmaxWidthSmoothmax_width_smooth (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Maximum width of Gauss operator for smoothing the curvature function.

Default value: 2.4

Suggested values: 0.5, 0.7, 1.0, 1.2, 1.5, 1.7

Typical range of values: 0.4 ≤ MaxWidthSmooth MaxWidthSmooth MaxWidthSmooth MaxWidthSmooth maxWidthSmooth max_width_smooth ≤ 3.0 (lin)

Minimum increment: 0.01

Recommended increment: 0.1

MinWidthCurveMinWidthCurveMinWidthCurveMinWidthCurveminWidthCurvemin_width_curve (input_control)  integer HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Minimum width of curve area for curvature determination (> 0.4).

Default value: 2

Suggested values: 2, 5, 7

Typical range of values: 1 ≤ MinWidthCurve MinWidthCurve MinWidthCurve MinWidthCurve minWidthCurve min_width_curve ≤ 12 (lin)

Minimum increment: 1

Recommended increment: 2

MaxWidthCurveMaxWidthCurveMaxWidthCurveMaxWidthCurvemaxWidthCurvemax_width_curve (input_control)  integer HTupleintHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Maximum width of curve area for curvature determination.

Default value: 12

Suggested values: 2, 5, 7

Typical range of values: 1 ≤ MaxWidthCurve MaxWidthCurve MaxWidthCurve MaxWidthCurve maxWidthCurve max_width_curve ≤ 20 (lin)

Minimum increment: 1

Recommended increment: 2

Weight1Weight1Weight1Weight1weight1weight_1 (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Weighting factor for approximation precision.

Default value: 1.0

Suggested values: 0.0, 0.5, 1.0

Typical range of values: 0.0 ≤ Weight1 Weight1 Weight1 Weight1 weight1 weight_1 ≤ 1.0 (lin)

Minimum increment: 0.1

Recommended increment: 0.5

Weight2Weight2Weight2Weight2weight2weight_2 (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Weighting factor for large segments.

Default value: 1.0

Suggested values: 0.0, 0.5, 1.0

Typical range of values: 0.0 ≤ Weight2 Weight2 Weight2 Weight2 weight2 weight_2 ≤ 1.0 (lin)

Minimum increment: 0.1

Recommended increment: 0.5

Weight3Weight3Weight3Weight3weight3weight_3 (input_control)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Weighting factor for small segments.

Default value: 1.0

Suggested values: 0.0, 0.5, 1.0

Typical range of values: 0.0 ≤ Weight3 Weight3 Weight3 Weight3 weight3 weight_3 ≤ 1.0 (lin)

Minimum increment: 0.1

Recommended increment: 0.5

ArcCenterRowArcCenterRowArcCenterRowArcCenterRowarcCenterRowarc_center_row (output_control)  arc.center.y-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Row of the center of an arc.

ArcCenterColArcCenterColArcCenterColArcCenterColarcCenterColarc_center_col (output_control)  arc.center.x-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Column of the center of an arc.

ArcAngleArcAngleArcAngleArcAnglearcAnglearc_angle (output_control)  arc.angle.rad-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Angle of an arc.

ArcBeginRowArcBeginRowArcBeginRowArcBeginRowarcBeginRowarc_begin_row (output_control)  arc.begin.y-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Row of the starting point of an arc.

ArcBeginColArcBeginColArcBeginColArcBeginColarcBeginColarc_begin_col (output_control)  arc.begin.x-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Column of the starting point of an arc.

LineBeginRowLineBeginRowLineBeginRowLineBeginRowlineBeginRowline_begin_row (output_control)  line.begin.y-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Row of the starting point of a line segment.

LineBeginColLineBeginColLineBeginColLineBeginCollineBeginColline_begin_col (output_control)  line.begin.x-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Column of the starting point of a line segment.

LineEndRowLineEndRowLineEndRowLineEndRowlineEndRowline_end_row (output_control)  line.end.y-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Row of the ending point of a line segment.

LineEndColLineEndColLineEndColLineEndCollineEndColline_end_col (output_control)  line.end.x-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Column of the ending point of a line segment.

OrderOrderOrderOrderorderorder (output_control)  integer-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Sequence of line (value 0) and arc segments (value 1).

Example (C)

/* read edge image  */
read_image(&Image,"fig1_kan");
/* construct edge region  */
hysteresis_threshold(Image,&RK1,64,255,40,1);
connection(RK1,&Rand);
/* fetch chain code  */
T_get_region_contour(Rand,&Rows,&Columns);
firstline = get_i(Tline,0);
firstcol = get_i(Tcol,0);
/* approximation with lines and circular arcs */
set_d(t1,0.4,0);
set_d(t2,2.4,0);

set_d(t3,0.3,0);
set_d(t4,0.9,0);

set_d(t5,0.2,0);

set_d(t6,0.4,0);
set_d(t7,2.4,0);

set_i(t8,2,0);
set_i(t9,12,0);

set_d(t10,1.0,0);
set_d(t11,1.0,0);
set_d(t12,1.0,0);

T_approx_chain(Rows,Columns,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,
                &Bzl,&Bzc,&Br,&Bwl,&Bwc,&Ll0,&Lc0,&Ll1,&Lc1,&order);
nob = length_tuple(Bzl);
nol = length_tuple(Ll0);
/* draw lines and arcs */
set_i(WindowHandleTuple,WindowHandle,0);
set_line_width(WindowHandle,4);
if (nob>0) T_disp_arc(Bzl,Bzc,Br,Bwl,Bwc);
set_line_width(WindowHandle,1);
if (nol>0) T_disp_line(WindowHandleTuple,Ll0,Lc0,Ll1,Lc1);

Result

The operator approx_chainapprox_chainApproxChainApproxChainApproxChainapprox_chain returns the value TRUE if the parameters are correct. Otherwise an exception is raised.

Possible Predecessors

sobel_ampsobel_ampSobelAmpSobelAmpSobelAmpsobel_amp, edges_imageedges_imageEdgesImageEdgesImageEdgesImageedges_image, get_region_contourget_region_contourGetRegionContourGetRegionContourGetRegionContourget_region_contour, thresholdthresholdThresholdThresholdThresholdthreshold, hysteresis_thresholdhysteresis_thresholdHysteresisThresholdHysteresisThresholdHysteresisThresholdhysteresis_threshold

Possible Successors

set_line_widthset_line_widthSetLineWidthSetLineWidthSetLineWidthset_line_width, disp_arcdisp_arcDispArcDispArcDispArcdisp_arc, disp_linedisp_lineDispLineDispLineDispLinedisp_line

Alternatives

get_region_polygonget_region_polygonGetRegionPolygonGetRegionPolygonGetRegionPolygonget_region_polygon, approx_chain_simpleapprox_chain_simpleApproxChainSimpleApproxChainSimpleApproxChainSimpleapprox_chain_simple

See also

get_region_chainget_region_chainGetRegionChainGetRegionChainGetRegionChainget_region_chain, smallest_circlesmallest_circleSmallestCircleSmallestCircleSmallestCirclesmallest_circle, disp_circledisp_circleDispCircleDispCircleDispCircledisp_circle, disp_linedisp_lineDispLineDispLineDispLinedisp_line

Module

Foundation