KlassenKlassenKlassenKlassen | | | | Operatoren

lines_facetlines_facetLinesFacetlines_facetLinesFacetLinesFacet (Operator)

Name

lines_facetlines_facetLinesFacetlines_facetLinesFacetLinesFacet — Erkennen von Linien mit dem Facet-Modell.

Signatur

lines_facet(Image : Lines : MaskSize, Low, High, LightDark : )

Herror lines_facet(const Hobject Image, Hobject* Lines, const Hlong MaskSize, double Low, double High, const char* LightDark)

Herror T_lines_facet(const Hobject Image, Hobject* Lines, const Htuple MaskSize, const Htuple Low, const Htuple High, const Htuple LightDark)

Herror lines_facet(Hobject Image, Hobject* Lines, const HTuple& MaskSize, const HTuple& Low, const HTuple& High, const HTuple& LightDark)

HXLDContArray HImage::LinesFacet(const HTuple& MaskSize, const HTuple& Low, const HTuple& High, const HTuple& LightDark) const

void LinesFacet(const HObject& Image, HObject* Lines, const HTuple& MaskSize, const HTuple& Low, const HTuple& High, const HTuple& LightDark)

HXLDCont HImage::LinesFacet(Hlong MaskSize, const HTuple& Low, const HTuple& High, const HString& LightDark) const

HXLDCont HImage::LinesFacet(Hlong MaskSize, double Low, double High, const HString& LightDark) const

HXLDCont HImage::LinesFacet(Hlong MaskSize, double Low, double High, const char* LightDark) const

void HOperatorSetX.LinesFacet(
[in] IHUntypedObjectX* Image, [out] IHUntypedObjectX*Lines, [in] VARIANT MaskSize, [in] VARIANT Low, [in] VARIANT High, [in] VARIANT LightDark)

IHXLDContX* HImageX.LinesFacet(
[in] Hlong MaskSize, [in] VARIANT Low, [in] VARIANT High, [in] BSTR LightDark)

static void HOperatorSet.LinesFacet(HObject image, out HObject lines, HTuple maskSize, HTuple low, HTuple high, HTuple lightDark)

HXLDCont HImage.LinesFacet(int maskSize, HTuple low, HTuple high, string lightDark)

HXLDCont HImage.LinesFacet(int maskSize, double low, double high, string lightDark)

Beschreibung

Mit lines_facetlines_facetLinesFacetlines_facetLinesFacetLinesFacet können Linien (gekrümmt-lineare Strukturen) aus einem Bild ImageImageImageImageImageimage extrahiert werden. Die extrahierten Linien werden in LinesLinesLinesLinesLineslines als subpixel-genaue XLD-Konturen zurückgegeben. Der Parameter LightDarkLightDarkLightDarkLightDarkLightDarklightDark bestimmt, ob helle oder dunkle Linien extrahiert werden sollen.

Zur Extraktion werden in jedem Punkt des Bildes unter Verwendung des Facet-Modells die Parameter eines quadratischen Polynoms in x und y als Least-Squares-Anpassung an die Bilddaten berechnet. Der Parameter MaskSizeMaskSizeMaskSizeMaskSizeMaskSizemaskSize bestimmt dabei die Größe des Bereichs, über den angepasst wird. Große Werte für MaskSizeMaskSizeMaskSizeMaskSizeMaskSizemaskSize sorgen für eine stärkere Glättung der Eingabedaten, können aber zu ungenauerer Lokalisation der Linien und zu stark schwingenden Linien führen. Mit Hilfe der Parameter des Polynoms wird in jedem Bildpunkt die Linienrichtung bestimmt. Bildpunkte, die ein lokales Maximum in der zweiten Richtungsableitung senkrecht zur Linienrichtung besitzen, werden als Linienpunkte markiert. Die gefundenen Linienpunkte werden hierauf zu Konturen zusammengefasst. Dabei werden Punkte, die eine zweite Richtungsableitung, die größer als HighHighHighHighHighhigh ist, sofort als sichere Linienpunkte akzeptiert. Punkte, deren zweite Ableitung kleiner als LowLowLowLowLowlow ist, werden sofort verworfen. Alle Punkte, die eine zweite Ableitung zwischen diesen zwei Werten besitzen, werden akzeptiert, wenn sie durch einen Pfad mit sicheren Punkten verbunden sind. Dies ist ähnlich zu einer Hysterese-Schwellenwert-Operation mit unbegrenzter Pfadlänge (siehe hysteresis_thresholdhysteresis_thresholdHysteresisThresholdhysteresis_thresholdHysteresisThresholdHysteresisThreshold). Allerdings wird diese Funktion nicht benutzt, da sonst keine subpixel-genaue Extraktion möglich wäre.

Für die Wahl der Schwellenwerte gilt sinngemäß das bei der Beschreibung von lines_gausslines_gaussLinesGausslines_gaussLinesGaussLinesGauss gesagte. Ein Wert von Sigma = 1.5 dort entspricht in etwa einer Maskengröße MaskSizeMaskSizeMaskSizeMaskSizeMaskSizemaskSize von 5 hier.

Die extrahierten Linien werden in einer topologisch „sauberen“ Struktur in LinesLinesLinesLinesLineslines zurückgeliefert. Das bedeutet, dass die Linien an Kreuzungspunkten sauber aufgetrennt werden.

lines_facetlines_facetLinesFacetlines_facetLinesFacetLinesFacet definiert folgende Attribute für jeden Linienpunkt:

'angle'"angle""angle""angle""angle""angle" Der Winkel der Richtung senkrecht zur Linie
'response'"response""response""response""response""response" Die Größe der zweiten Ableitung

Diese Attribute können mit get_contour_attrib_xldget_contour_attrib_xldGetContourAttribXldget_contour_attrib_xldGetContourAttribXldGetContourAttribXld ausgelesen werden.

Achtung

Je kleiner der Einzugsbereich MaskSizeMaskSizeMaskSizeMaskSizeMaskSizemaskSize des Operators gewählt wird, desto mehr kurze, zerstückelte Linien werden gefunden. Dadurch kann die Verarbeitungszeit beträchtlich ansteigen.

Beachten Sie, dass Filteroperatoren eventuell unerwartete Resultate ausgeben, wenn ein Bild mit einer reduzierten Domäne als Input übergeben wird. Weitere Informationen können im Kapitel Filter gefunden werden.

Parallelisierung

Parameter

ImageImageImageImageImageimage (input_object)  singlechannelimage objectHImageHImageHImageHImageXHobject (byte / int1 / int2 / uint2 / int4 / real)

Eingabebild.

LinesLinesLinesLinesLineslines (output_object)  xld_cont-array objectHXLDContHXLDContHXLDContArrayHXLDContXHobject *

Extrahierte Linien.

MaskSizeMaskSizeMaskSizeMaskSizeMaskSizemaskSize (input_control)  integer HTupleHTupleHTupleVARIANTHtuple (integer) (int / long) (Hlong) (Hlong) (Hlong) (Hlong)

Größe der zu verwendenden Maske zur Bestimmung der Parameter des Facet-Modells.

Defaultwert: 5

Werteliste: 3, 5, 7, 9, 11

LowLowLowLowLowlow (input_control)  number HTupleHTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong) (double / Hlong)

Untere Schwelle für Hysterese-Schwellenwertoperation.

Defaultwert: 3

Wertevorschläge: 0, 0.5, 1, 2, 3, 4, 5, 8, 10

Typischer Wertebereich: 0 ≤ Low Low Low Low Low low ≤ 20

Empfohlene Schrittweite: 0.5

Restriktion: Low >= 0

HighHighHighHighHighhigh (input_control)  number HTupleHTupleHTupleVARIANTHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong) (double / Hlong) (double / Hlong)

Obere Schwelle für Hysterese-Schwellenwertoperation.

Defaultwert: 8

Wertevorschläge: 0, 0.5, 1, 2, 3, 4, 5, 8, 10, 12, 15, 18, 20, 25

Typischer Wertebereich: 0 ≤ High High High High High high ≤ 35

Empfohlene Schrittweite: 0.5

Restriktion: High >= 0 && High >= Low

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

Helle oder dunkle Linien extrahieren.

Defaultwert: 'light' "light" "light" "light" "light" "light"

Werteliste: 'dark'"dark""dark""dark""dark""dark", 'light'"light""light""light""light""light"

Beispiel (HDevelop)

* Detection of lines in an aerial image
read_image(Image,'mreut4_3')
lines_facet(Image,Lines,5,3,8,'light')
dev_display(Lines)

Beispiel (C)

/* Detection of lines in an aerial image */
read_image(&Image,"mreut4_3");
lines_facet(Image:&Lines:5,3,8,"light");
disp_xld(Lines,WindowHandle);

Beispiel (HDevelop)

* Detection of lines in an aerial image
read_image(Image,'mreut4_3')
lines_facet(Image,Lines,5,3,8,'light')
dev_display(Lines)

Beispiel (C++ (HALCON 5.0-10.0))

/* Detection of lines in an aerial image */
HWindow w(0,0,520,560);
HImage Image("mreut4_3");
HXLDContArray Lines = Image.LinesFacet(5,3,8,"light");
Lines.Display(w);

Beispiel (HDevelop)

* Detection of lines in an aerial image
read_image(Image,'mreut4_3')
lines_facet(Image,Lines,5,3,8,'light')
dev_display(Lines)

Beispiel (HDevelop)

* Detection of lines in an aerial image
read_image(Image,'mreut4_3')
lines_facet(Image,Lines,5,3,8,'light')
dev_display(Lines)

Komplexität

Sei A die Anzahl von Pixeln in der Region von ImageImageImageImageImageimage. Dann ist die Laufzeitkomplexität O(A*MaskSize).

Der Bedarf an temporären Speicher ist abhängig von der Höhe H der Region von ImageImageImageImageImageimage und der Breite W von ImageImageImageImageImageimage. Sei S = W*H, dann benötigt lines_facetlines_facetLinesFacetlines_facetLinesFacetLinesFacet mindestens 55*S Bytes an temporärem Speicher bei der Ausführung.

Ergebnis

Sind die Parameterwerte korrekt und tritt kein Fehler während der Berechnung auf, liefert lines_facetlines_facetLinesFacetlines_facetLinesFacetLinesFacet den Wert 2 (H_MSG_TRUE). Das Verhalten bei leerer Eingabe (keine Eingabebilder vorhanden) lässt sich mittels set_system(::'no_object_result',<Result>:)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Nachfolger

gen_polygons_xldgen_polygons_xldGenPolygonsXldgen_polygons_xldGenPolygonsXldGenPolygonsXld

Alternativen

lines_gausslines_gaussLinesGausslines_gaussLinesGaussLinesGauss

Siehe auch

bandpass_imagebandpass_imageBandpassImagebandpass_imageBandpassImageBandpassImage, dyn_thresholddyn_thresholdDynThresholddyn_thresholdDynThresholdDynThreshold, topographic_sketchtopographic_sketchTopographicSketchtopographic_sketchTopographicSketchTopographicSketch

Literatur

A. Busch: „Fast Recognition of Lines in Digital Images Without User-Supplied Parameters“. In H. Ebner, C. Heipke, K.Eder, eds., „Spatial Information from Digital Photogrammetry and Computer Vision“, International Archives of Photogrammetry and Remote Sensing, Vol. 30, Part 3/1, pp. 91-97, 1994.

Modul

2D Metrology


KlassenKlassenKlassenKlassen | | | | Operatoren