segment_contours_xldsegment_contours_xldSegmentContoursXldSegmentContoursXld (Operator)

Name

segment_contours_xldsegment_contours_xldSegmentContoursXldSegmentContoursXld — Segmentieren von Konturen in Liniensegmente und Kreis- oder Ellipsenbögen.

Signatur

segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )

Herror segment_contours_xld(const Hobject Contours, Hobject* ContoursSplit, const char* Mode, const Hlong SmoothCont, double MaxLineDist1, double MaxLineDist2)

Herror T_segment_contours_xld(const Hobject Contours, Hobject* ContoursSplit, const Htuple Mode, const Htuple SmoothCont, const Htuple MaxLineDist1, const Htuple MaxLineDist2)

void SegmentContoursXld(const HObject& Contours, HObject* ContoursSplit, const HTuple& Mode, const HTuple& SmoothCont, const HTuple& MaxLineDist1, const HTuple& MaxLineDist2)

HXLDCont HXLDCont::SegmentContoursXld(const HString& Mode, Hlong SmoothCont, double MaxLineDist1, double MaxLineDist2) const

HXLDCont HXLDCont::SegmentContoursXld(const char* Mode, Hlong SmoothCont, double MaxLineDist1, double MaxLineDist2) const

HXLDCont HXLDCont::SegmentContoursXld(const wchar_t* Mode, Hlong SmoothCont, double MaxLineDist1, double MaxLineDist2) const   (Nur Windows)

static void HOperatorSet.SegmentContoursXld(HObject contours, out HObject contoursSplit, HTuple mode, HTuple smoothCont, HTuple maxLineDist1, HTuple maxLineDist2)

HXLDCont HXLDCont.SegmentContoursXld(string mode, int smoothCont, double maxLineDist1, double maxLineDist2)

Beschreibung

segment_contours_xldsegment_contours_xldSegmentContoursXldSegmentContoursXldSegmentContoursXld segmentiert die Eingabekonturen ContoursContoursContoursContourscontours in Linien, falls ModeModeModeModemode='lines'"lines""lines""lines""lines", in Linien und Kreisbögen, falls ModeModeModeModemode='lines_circles'"lines_circles""lines_circles""lines_circles""lines_circles", oder in Linien und Ellipsenbögen, falls ModeModeModeModemode='lines_ellipses'"lines_ellipses""lines_ellipses""lines_ellipses""lines_ellipses". Die segmentierten Konturen werden in ContoursSplitContoursSplitContoursSplitContoursSplitcontoursSplit zurückgegeben. Die Unterscheidung, ob eine Ausgabekontur ein Liniensegment oder einen Kreis- oder Ellipsenbogen darstellt, erfolgt über das globale Konturattribut 'cont_approx'"cont_approx""cont_approx""cont_approx""cont_approx" (siehe get_contour_global_attrib_xldget_contour_global_attrib_xldGetContourGlobalAttribXldGetContourGlobalAttribXldGetContourGlobalAttribXld). Falls 'cont_approx'"cont_approx""cont_approx""cont_approx""cont_approx"=-1, liegt ein Liniensegment vor, falls 'cont_approx'"cont_approx""cont_approx""cont_approx""cont_approx"=0 ein Ellipsenbogen und falls 'cont_approx'"cont_approx""cont_approx""cont_approx""cont_approx"=1 ein Kreisbogen.

Intern führt segment_contours_xldsegment_contours_xldSegmentContoursXldSegmentContoursXldSegmentContoursXld zunächst eine Polygonapproximation der Eingabekonturen durch. Dadurch werden die Konturen in gekrümmten Bereichen übersegmentiert. Hierauf werden iterativ benachbarte Liniensegmente zu Kreis- bzw. Ellipsenbögen verschmolzen, falls dadurch die Kontur besser approximiert werden kann. Wenn in SmoothContSmoothContSmoothContSmoothContsmoothCont ein Wert > 0 angegeben wird, werden die Konturen zunächst geglättet (siehe smooth_contours_xldsmooth_contours_xldSmoothContoursXldSmoothContoursXldSmoothContoursXld). Dies kann erforderlich sein, um sehr kurze Liniensegmente bei der Polygonapproximation zu verhindern und eine stabilere Kreis- bzw. Ellipsenanpassung zu erreichen, da durch die Glättung Ausreißer auf den Konturen unterdrückt werden.

Die initiale Polygonapproximation wird mit dem Algorithmus von Ramer (siehe gen_polygons_xldgen_polygons_xldGenPolygonsXldGenPolygonsXldGenPolygonsXld) mit einem Maximalabstand von MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1maxLineDist1 durchgeführt. Hierauf werden in benachbarte Liniensegmente Kreis- bzw. Ellipsenbögen angepasst. Wenn der Maximalabstand des so entstehenden Bogens zur Kontur kleiner ist als der Maximalabstand der zwei betrachteten Liniensegmente, werden die zwei Liniensegmente durch diesen Bogen ersetzt. Dieser Vorgang wird solange wiederholt, bis keine Veränderungen mehr auftreten.

Hierauf werden die Teile der Kontur, die noch als Liniensegmente approximiert werden, einer Polygonsegmentation mit dem Maximalabstand MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2maxLineDist2 unterzogen, und die neu entstehenden Liniensegmente wiederum zu Kreis- oder Ellipsenbögen zusammengefasst. Dies ändert die Ausgabe natürlich nur, falls MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2maxLineDist2 < MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1maxLineDist1. Dieses zweistufige Verfahren ist effizienter, als ein einstufiges Verfahren mit MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2maxLineDist2, da im ersten Schritt weniger Liniensegmente entstehen, und dadurch die Kreis- bzw. Ellipsenanpassung weniger oft durchgeführt werden muss. Daher können Teile der Eingabekonturen, die sich durch lange Bögen approximieren lassen, effizienter gefunden werden. Im zweiten Schritt werden dann Teile der Kontur gefunden, die sich durch kurze Bögen approximieren lassen und die Endstücke der im ersten Schritt gefundenen Konturen werden verfeinert.

Die Ergebniskonturen sind mindestens 3 Pixel lang und umfassen mindestens 6 fortlaufende Konturpunkte der Eingabekontur. Alle Eingabekonturen mit einer Länge von weniger als 3 Pixel oder mit weniger als 6 Konturpunkten werden unverändert in die Ausgabekonturen übernommen.

Ausführungsinformationen

Parameter

ContoursContoursContoursContourscontours (input_object)  xld_cont(-array) objectHXLDContHXLDContHobject

Konturen, die segmentiert werden sollen.

ContoursSplitContoursSplitContoursSplitContoursSplitcontoursSplit (output_object)  xld_cont-array objectHXLDContHXLDContHobject *

Zerlegte Konturen.

ModeModeModeModemode (input_control)  string HTupleHTupleHtuple (string) (string) (HString) (char*)

Modus für die Segmentation der Konturen.

Defaultwert: 'lines_circles' "lines_circles" "lines_circles" "lines_circles" "lines_circles"

Werteliste: 'lines'"lines""lines""lines""lines", 'lines_circles'"lines_circles""lines_circles""lines_circles""lines_circles", 'lines_ellipses'"lines_ellipses""lines_ellipses""lines_ellipses""lines_ellipses"

SmoothContSmoothContSmoothContSmoothContsmoothCont (input_control)  integer HTupleHTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Einzugsbereich für die Glättung der Konturen.

Defaultwert: 5

Wertevorschläge: 0, 3, 5, 7, 9

Restriktion: SmoothCont == 0 || SmoothCont >= 3 && odd(SmoothCont)

MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1maxLineDist1 (input_control)  real HTupleHTupleHtuple (real) (double) (double) (double)

Maximaler Abstand zwischen einer Kontur und der approximierenden Gerade (erster Durchlauf).

Defaultwert: 4.0

Wertevorschläge: 1.0, 1.5, 2.0, 2.5, 3.0, 3.5

Restriktion: MaxLineDist1 >= 0.0

MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2maxLineDist2 (input_control)  real HTupleHTupleHtuple (real) (double) (double) (double)

Maximaler Abstand zwischen einer Kontur und der approximierenden Gerade (zweiter Durchlauf).

Defaultwert: 2.0

Wertevorschläge: 1.0, 1.5, 2.0, 2.5, 3.0, 3.5

Restriktion: MaxLineDist2 >= 0.0

Beispiel (HDevelop)

read_image (Image, 'pumpe')
edges_sub_pix (Image, Edges, 'canny', 1.5, 15, 40)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
count_obj (ContoursSplit, Number)
gen_empty_obj (Lines)
gen_empty_obj (Circles)
for I := 1 to Number by 1
  select_obj (ContoursSplit, Contour, I)
  get_contour_global_attrib_xld (Contour, 'cont_approx', Type)
  if (Type == -1)
      concat_obj (Lines, Contour, Lines)
  else
      concat_obj (Circles, Contour, Circles)
  endif
endfor
fit_line_contour_xld (Lines, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, \
                      RowEnd, ColEnd, Nr, Nc, Dist)
fit_circle_contour_xld (Circles, 'atukey', -1, 2, 0, 3, 2, Row, Column, \
                        Radius, StartPhi, EndPhi, PointOrder)

Vorgänger

gen_contours_skeleton_xldgen_contours_skeleton_xldGenContoursSkeletonXldGenContoursSkeletonXldGenContoursSkeletonXld, lines_gausslines_gaussLinesGaussLinesGaussLinesGauss, edges_sub_pixedges_sub_pixEdgesSubPixEdgesSubPixEdgesSubPix

Nachfolger

fit_line_contour_xldfit_line_contour_xldFitLineContourXldFitLineContourXldFitLineContourXld, fit_ellipse_contour_xldfit_ellipse_contour_xldFitEllipseContourXldFitEllipseContourXldFitEllipseContourXld, fit_circle_contour_xldfit_circle_contour_xldFitCircleContourXldFitCircleContourXldFitCircleContourXld, get_contour_global_attrib_xldget_contour_global_attrib_xldGetContourGlobalAttribXldGetContourGlobalAttribXldGetContourGlobalAttribXld

Siehe auch

split_contours_xldsplit_contours_xldSplitContoursXldSplitContoursXldSplitContoursXld, get_contour_global_attrib_xldget_contour_global_attrib_xldGetContourGlobalAttribXldGetContourGlobalAttribXldGetContourGlobalAttribXld, smooth_contours_xldsmooth_contours_xldSmoothContoursXldSmoothContoursXldSmoothContoursXld, gen_polygons_xldgen_polygons_xldGenPolygonsXldGenPolygonsXldGenPolygonsXld

Modul

Foundation