KlassenKlassenKlassenKlassen | | | | Operatoren

segment_contours_xldsegment_contours_xldSegmentContoursXldsegment_contours_xldSegmentContoursXldSegmentContoursXld (Operator)

Name

segment_contours_xldsegment_contours_xldSegmentContoursXldsegment_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)

Herror segment_contours_xld(Hobject Contours, Hobject* ContoursSplit, const HTuple& Mode, const HTuple& SmoothCont, const HTuple& MaxLineDist1, const HTuple& MaxLineDist2)

HXLDContArray HXLDCont::SegmentContoursXld(const HTuple& Mode, const HTuple& SmoothCont, const HTuple& MaxLineDist1, const HTuple& MaxLineDist2) const

HXLDContArray HXLDContArray::SegmentContoursXld(const HTuple& Mode, const HTuple& SmoothCont, const HTuple& MaxLineDist1, const HTuple& MaxLineDist2) const

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

void HOperatorSetX.SegmentContoursXld(
[in] IHUntypedObjectX* Contours, [out] IHUntypedObjectX*ContoursSplit, [in] VARIANT Mode, [in] VARIANT SmoothCont, [in] VARIANT MaxLineDist1, [in] VARIANT MaxLineDist2)

IHXLDContX* HXLDContX.SegmentContoursXld(
[in] BSTR Mode, [in] Hlong SmoothCont, [in] double MaxLineDist1, [in] double MaxLineDist2)

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_xldSegmentContoursXldsegment_contours_xldSegmentContoursXldSegmentContoursXld segmentiert die Eingabekonturen ContoursContoursContoursContoursContourscontours in Linien, falls ModeModeModeModeModemode='lines'"lines""lines""lines""lines""lines", in Linien und Kreisbögen, falls ModeModeModeModeModemode='lines_circles'"lines_circles""lines_circles""lines_circles""lines_circles""lines_circles", oder in Linien und Ellipsenbögen, falls ModeModeModeModeModemode='lines_ellipses'"lines_ellipses""lines_ellipses""lines_ellipses""lines_ellipses""lines_ellipses". Die segmentierten Konturen werden in ContoursSplitContoursSplitContoursSplitContoursSplitContoursSplitcontoursSplit 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""cont_approx" (siehe get_contour_global_attrib_xldget_contour_global_attrib_xldGetContourGlobalAttribXldget_contour_global_attrib_xldGetContourGlobalAttribXldGetContourGlobalAttribXld). Falls 'cont_approx'"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""cont_approx"=0 ein Ellipsenbogen und falls 'cont_approx'"cont_approx""cont_approx""cont_approx""cont_approx""cont_approx"=1 ein Kreisbogen.

Intern führt segment_contours_xldsegment_contours_xldSegmentContoursXldsegment_contours_xldSegmentContoursXldSegmentContoursXld 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 SmoothContSmoothContSmoothContSmoothContSmoothContsmoothCont ein Wert > 0 angegeben wird, werden die Konturen zunächst geglättet (siehe smooth_contours_xldsmooth_contours_xldSmoothContoursXldsmooth_contours_xldSmoothContoursXldSmoothContoursXld). 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_xldGenPolygonsXldgen_polygons_xldGenPolygonsXldGenPolygonsXld) mit einem Maximalabstand von MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1maxLineDist1 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 MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2maxLineDist2 unterzogen, und die neu entstehenden Liniensegmente wiederum zu Kreis- oder Ellipsenbögen zusammengefasst. Dies ändert die Ausgabe natürlich nur, falls MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2maxLineDist2 < MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1maxLineDist1. Dieses zweistufige Verfahren ist effizienter, als ein einstufiges Verfahren mit MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2maxLineDist2, 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.

Parallelisierung

Parameter

ContoursContoursContoursContoursContourscontours (input_object)  xld_cont(-array) objectHXLDContHXLDContHXLDContHXLDContXHobject

Konturen, die segmentiert werden sollen.

ContoursSplitContoursSplitContoursSplitContoursSplitContoursSplitcontoursSplit (output_object)  xld_cont-array objectHXLDContHXLDContHXLDContArrayHXLDContXHobject *

Zerlegte Konturen.

ModeModeModeModeModemode (input_control)  string HTupleHTupleHTupleVARIANTHtuple (string) (string) (HString) (char*) (BSTR) (char*)

Modus für die Segmentation der Konturen.

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

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

SmoothContSmoothContSmoothContSmoothContSmoothContsmoothCont (input_control)  integer HTupleHTupleHTupleVARIANTHtuple (integer) (int / long) (Hlong) (Hlong) (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)

MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1MaxLineDist1maxLineDist1 (input_control)  real HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (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

MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2MaxLineDist2maxLineDist2 (input_control)  real HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (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_xldGenContoursSkeletonXldgen_contours_skeleton_xldGenContoursSkeletonXldGenContoursSkeletonXld, lines_gausslines_gaussLinesGausslines_gaussLinesGaussLinesGauss, edges_sub_pixedges_sub_pixEdgesSubPixedges_sub_pixEdgesSubPixEdgesSubPix

Nachfolger

fit_line_contour_xldfit_line_contour_xldFitLineContourXldfit_line_contour_xldFitLineContourXldFitLineContourXld, fit_ellipse_contour_xldfit_ellipse_contour_xldFitEllipseContourXldfit_ellipse_contour_xldFitEllipseContourXldFitEllipseContourXld, fit_circle_contour_xldfit_circle_contour_xldFitCircleContourXldfit_circle_contour_xldFitCircleContourXldFitCircleContourXld, get_contour_global_attrib_xldget_contour_global_attrib_xldGetContourGlobalAttribXldget_contour_global_attrib_xldGetContourGlobalAttribXldGetContourGlobalAttribXld

Siehe auch

split_contours_xldsplit_contours_xldSplitContoursXldsplit_contours_xldSplitContoursXldSplitContoursXld, get_contour_global_attrib_xldget_contour_global_attrib_xldGetContourGlobalAttribXldget_contour_global_attrib_xldGetContourGlobalAttribXldGetContourGlobalAttribXld, smooth_contours_xldsmooth_contours_xldSmoothContoursXldsmooth_contours_xldSmoothContoursXldSmoothContoursXld, gen_polygons_xldgen_polygons_xldGenPolygonsXldgen_polygons_xldGenPolygonsXldGenPolygonsXld

Modul

Foundation


KlassenKlassenKlassenKlassen | | | | Operatoren