lines_gausslines_gaussLinesGaussLinesGausslines_gauss (Operator)

Name

lines_gausslines_gaussLinesGaussLinesGausslines_gauss — Erkennen von Linien und deren Breite.

Signatur

lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )

Herror lines_gauss(const Hobject Image, Hobject* Lines, double Sigma, double Low, double High, const char* LightDark, const char* ExtractWidth, const char* LineModel, const char* CompleteJunctions)

Herror T_lines_gauss(const Hobject Image, Hobject* Lines, const Htuple Sigma, const Htuple Low, const Htuple High, const Htuple LightDark, const Htuple ExtractWidth, const Htuple LineModel, const Htuple CompleteJunctions)

void LinesGauss(const HObject& Image, HObject* Lines, const HTuple& Sigma, const HTuple& Low, const HTuple& High, const HTuple& LightDark, const HTuple& ExtractWidth, const HTuple& LineModel, const HTuple& CompleteJunctions)

HXLDCont HImage::LinesGauss(const HTuple& Sigma, const HTuple& Low, const HTuple& High, const HString& LightDark, const HString& ExtractWidth, const HString& LineModel, const HString& CompleteJunctions) const

HXLDCont HImage::LinesGauss(double Sigma, double Low, double High, const HString& LightDark, const HString& ExtractWidth, const HString& LineModel, const HString& CompleteJunctions) const

HXLDCont HImage::LinesGauss(double Sigma, double Low, double High, const char* LightDark, const char* ExtractWidth, const char* LineModel, const char* CompleteJunctions) const

HXLDCont HImage::LinesGauss(double Sigma, double Low, double High, const wchar_t* LightDark, const wchar_t* ExtractWidth, const wchar_t* LineModel, const wchar_t* CompleteJunctions) const   ( Nur Windows)

static void HOperatorSet.LinesGauss(HObject image, out HObject lines, HTuple sigma, HTuple low, HTuple high, HTuple lightDark, HTuple extractWidth, HTuple lineModel, HTuple completeJunctions)

HXLDCont HImage.LinesGauss(HTuple sigma, HTuple low, HTuple high, string lightDark, string extractWidth, string lineModel, string completeJunctions)

HXLDCont HImage.LinesGauss(double sigma, double low, double high, string lightDark, string extractWidth, string lineModel, string completeJunctions)

def lines_gauss(image: HObject, sigma: Union[float, int], low: Union[float, int], high: Union[float, int], light_dark: str, extract_width: str, line_model: str, complete_junctions: str) -> HObject

Beschreibung

Mit lines_gausslines_gaussLinesGaussLinesGausslines_gauss können Linien (gekrümmt-lineare Strukturen) aus einem Bild ImageImageImageimageimage extrahiert werden. Die extrahierten Linien werden in LinesLinesLineslineslines als subpixel-genaue XLD-Konturen zurückgegeben.

Der Parameter LightDarkLightDarkLightDarklightDarklight_dark bestimmt, ob helle ('light'"light""light""light""light") oder dunkle ('dark'"dark""dark""dark""dark") Linien extrahiert werden sollen.

Wenn ExtractWidthExtractWidthExtractWidthextractWidthextract_width auf 'true'"true""true""true""true" gesetzt wird, so wird für jeden Linienpunkt die Linienbreite extrahiert.

Mit LineModelLineModelLineModellineModelline_model kann bestimmt werden ob und wie Position und Breite von asymmetrischen Linien (Linien mit unterschiedlichem Kontrast auf beiden Seiten der Linie) korrigiert werden soll. Folgende Werte können für LineModelLineModelLineModellineModelline_model gesetzt werden:

'bar-shaped'"bar-shaped""bar-shaped""bar-shaped""bar-shaped":

Balkenförmiges Linienmodell. Deckt die meisten Anwendungsfälle ab.

'parabolic'"parabolic""parabolic""parabolic""parabolic":

Parabolisches Linienmodell. Kann zur Extraktion röhrenförmiger Objekte im Durchlicht (z.B. Blutgefäße in Röntgenaufnahmen) verwendet werden, wenn die Kanten scharf abgebildet sind.

'gaussian'"gaussian""gaussian""gaussian""gaussian":

Gaußsches Linienmodell. Kann zur Extraktion röhrenförmiger Objekte im Durchlicht (z.B. Blutgefäße in Röntgenaufnahmen) verwendet werden, wenn die Kanten weniger scharf abgebildet sind.

'none'"none""none""none""none":

Die Effekte asymmetrischer Linien werden nicht kompensiert.

Der Parameter LineModelLineModelLineModellineModelline_model wird nur beachtet, falls ExtractWidthExtractWidthExtractWidthextractWidthextract_width='true'"true""true""true""true".

Da der Linienextraktor aus differentialgeometrischen Gründen bestimmte Kreuzungspunkte nicht extrahieren kann, wird versucht, diese mit anderen Mitteln zu extrahieren, falls CompleteJunctionsCompleteJunctionsCompleteJunctionscompleteJunctionscomplete_junctions='true'"true""true""true""true" gesetzt wird.

Zur Extraktion werden in jedem Punkt des Bildes unter Verwendung der partiellen Ableitungen einer Gaußschen Glättungsmaske die Parameter eines quadratischen Polynoms in x und y berechnet. Der Parameter SigmaSigmaSigmasigmasigma bestimmt dabei die Stärke der Glättung. Große Werte für SigmaSigmaSigmasigmasigma sorgen für eine stärkere Glättung der Eingabedaten, können aber zu ungenauerer Lokalisation der Linien führen. Im Gegensatz zu lines_facetlines_facetLinesFacetLinesFacetlines_facet ist aber kein Schwingen der Linien für große Glättung zu beobachten. Ein weiterer Vorteil gegenüber lines_facetlines_facetLinesFacetLinesFacetlines_facet ist die genauere Lokalisation der Linien. 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 HighHighHighhighhigh ist, sofort als sichere Linienpunkte akzeptiert. Punkte, deren zweite Ableitung kleiner als LowLowLowlowlow 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_thresholdHysteresisThresholdHysteresisThresholdhysteresis_threshold), hier allerdings werden die Konturen mit Subpixel-Genauigkeit extrahiert.

Bei der Wahl der Schwellenwerte HighHighHighhighhigh und LowLowLowlowlow ist zu beachten, dass die zweite Richtungsableitung von der Amplitude und Breite der Linie, sowie von der Größe des Glättungsparameters SigmaSigmaSigmasigmasigma abhängt. Dabei ist die Abhängigkeit von der Amplitude der Linie linear, d.h. je größer die Amplitude, desto größer die zweite Ableitung. Für die Breite der Linie besteht ein näherungsweise exponentieller Zusammenhang: Je breiter die Linie ist, desto kleiner ist die zweite Ableitung. Analoges gilt für die Abhängigkeit von SigmaSigmaSigmasigmasigma: Je größer SigmaSigmaSigmasigmasigma gewählt wird, desto kleiner wird die zweite Ableitung. Das bedeutet, dass für starke Glättung entsprechend kleinere Werte für HighHighHighhighhigh und LowLowLowlowlow gewählt werden müssen. Zwei Beispiele sollen dies verdeutlichen: Wenn im Bild 5 Pixel breite Linien mit einer Amplitude größer als 100 und einer Glättung SigmaSigmaSigmasigmasigma = 1.5 extrahiert werden sollen, so sollte HighHighHighhighhigh größer als 14 gewählt werden. Wenn dagegen 10 Pixel breite Linien mit einer Amplitude größer als 100 und einer Glättung SigmaSigmaSigmasigmasigma = 3 gefunden werden sollen, so sollte HighHighHighhighhigh größer als 3.5 gesetzt werden. Als Werte für LowLowLowlowlow empfehlen sich Werte zwischen 0.25 HighHighHighhighhigh und 0.5 HighHighHighhighhigh.

Die Parameter LowLowLowlowlow und HighHighHighhighhigh können aus den entsprechende Grauwertkontrastwerten der zu extrahierenden Linien ( und ) und dem gewählten Wert für SigmaSigmaSigmasigmasigma wie folgt berechnet werden:

wobei die Breite (der halbe Durchmesser) der zu extrahierenden Linien im Bild ist. Die Grauwertkontrastwerte und geben den Wertebereich an, um den sich die gesuchten Linien vom Hintergrund abheben. Geeignete Werte für LowLowLowlowlow und HighHighHighhighhigh können mit der Prozedur calculate_lines_gauss_parameters berechnet werden.

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

lines_gausslines_gaussLinesGaussLinesGausslines_gauss definiert folgende Attribute für jeden Linienpunkt, falls ExtractWidthExtractWidthExtractWidthextractWidthextract_width auf 'false'"false""false""false""false" gesetzt wurde:

'angle'"angle""angle""angle""angle":

Der Winkel der Richtung senkrecht zur Linie.

'response'"response""response""response""response":

Die Größe der zweiten Ableitung.

Falls ExtractWidthExtractWidthExtractWidthextractWidthextract_width auf 'true'"true""true""true""true" gesetzt wurde, werden zusätzlich zu 'angle'"angle""angle""angle""angle" und 'response'"response""response""response""response" noch folgende Attribute definiert:

'width_left'"width_left""width_left""width_left""width_left":

Die Linienbreite links von der Linie

'width_right'"width_right""width_right""width_right""width_right":

Die Linienbreite rechts von der Linie

Falls ExtractWidthExtractWidthExtractWidthextractWidthextract_width auf 'true'"true""true""true""true" und LineModelLineModelLineModellineModelline_model auf einen Wert ungleich 'none'"none""none""none""none" gesetzt wurde, werden zusätzlich zu 'angle'"angle""angle""angle""angle", 'response'"response""response""response""response", 'width_left'"width_left""width_left""width_left""width_left" und 'width_right'"width_right""width_right""width_right""width_right" noch folgende Attribute definiert:

'asymmetry'"asymmetry""asymmetry""asymmetry""asymmetry":

Die Asymmetrie des Linienpunkts

'contrast'"contrast""contrast""contrast""contrast":

Der Kontrast des Linienpunkts

Dabei ist der Wert der Asymmetrie so gewählt, dass er positive Werte annimmt, wenn die Asymmetrie, d.h. der kleinere Gradient, auf der rechten Seite der Linie liegt, und dass er negative Werte annimmt, wenn die Asymmetrie auf der linken Seite der Linie liegt.

Der Kontrast ergibt sich aus der Differenz zwischen dem Grauwert der Linie und dem Grauwert des Hintergrundes. Der Wert für den Kontrast ist positiv, wenn helle Linien extrahiert werden und negativ, wenn dunkle Linien extrahiert werden. Der zurückgegebene Kontrast kann größere Werte annehmen als der maximal darstellbare Grauwert des Eingabebildes, insbesondere dann, wenn das durch LineModelLineModelLineModellineModelline_model festgelegte Linienmodell nicht im Bild vorliegt. So kann der Kontrast beispielsweise bei byte-Bildern größer als 255 sein.

Alle Attribute können mit get_contour_attrib_xldget_contour_attrib_xldGetContourAttribXldGetContourAttribXldget_contour_attrib_xld ausgelesen werden. Weitere Informationen zu Konturattributen können der Referenz von get_contour_attrib_xldget_contour_attrib_xldGetContourAttribXldGetContourAttribXldget_contour_attrib_xld entnommen werden.

lines_gausslines_gaussLinesGaussLinesGausslines_gauss kann auf OpenCL-Geräten ausgeführt werden.

Achtung

Im Allgemeinen (aber insbesondere, wenn die Linienbreite extrahiert werden soll) sollte gewählt werden, wobei die Breite (der halbe Durchmesser) der zu extrahierenden Linien im Bild ist. Als unterste Grenze muss gewählt werden. Falls z.B. Linien mit einer Breite von 4 Pixel (Durchmesser 8 Pixel) extrahiert werden sollen, sollte gewählt werden. Wird SigmaSigmaSigmasigmasigma zu klein gewählt, so werden die Attribute 'width_left'"width_left""width_left""width_left""width_left", 'width_right'"width_right""width_right""width_right""width_right", 'asymmetry'"asymmetry""asymmetry""asymmetry""asymmetry" und 'contrast'"contrast""contrast""contrast""contrast" auf Null gesetzt.

lines_gausslines_gaussLinesGaussLinesGausslines_gauss wird durch SSE2- oder AVX2-Instruktionen beschleunigt, falls der Systemparameter 'sse2_enable'"sse2_enable""sse2_enable""sse2_enable""sse2_enable" bzw. 'avx2_enable'"avx2_enable""avx2_enable""avx2_enable""avx2_enable" auf 'true'"true""true""true""true" gesetzt ist (siehe set_systemset_systemSetSystemSetSystemset_system). Diese Implementierung ist aufgrund numerischer Probleme im Vergleich zur reinen C Version etwas ungenauer. Falls für Ihre Anwendung Genauigkeit wichtiger ist als Geschwindigkeit können Sie den entsprechenden Systemparameter auf 'false'"false""false""false""false" setzen, bevor Sie lines_gausslines_gaussLinesGaussLinesGausslines_gauss aufrufen. Dadurch verwendet lines_gausslines_gaussLinesGaussLinesGausslines_gauss keine SSE2- bzw AVX2-Beschleunigungen. Vergessen Sie nicht 'sse2_enable'"sse2_enable""sse2_enable""sse2_enable""sse2_enable" bzw. 'avx2_enable'"avx2_enable""avx2_enable""avx2_enable""avx2_enable" danach wieder auf 'true'"true""true""true""true" zu setzen.

Wird lines_gausslines_gaussLinesGaussLinesGausslines_gauss auf OpenCL-Geräten ausgeführt, gelten die selben Einschränkungen wie für derivate_gaussderivate_gaussDerivateGaussDerivateGaussderivate_gauss: SigmaSigmaSigmasigmasigma muss so gewählt werden, dass die resultierende Filtermaske kleiner als 129 Pixel groß ist. Es ist weiterhin zu beachten, dass das Ergebnis von dem der CPU- Implementierung abweichen kann.

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.

Ausführungsinformationen

Dieser Operator unterstützt Cancel-Timeouts und Interrupts.

Parameter

ImageImageImageimageimage (input_object)  singlechannelimage objectHImageHObjectHObjectHobject (byte / int1 / int2 / uint2 / int4 / real)

Eingabebild.

LinesLinesLineslineslines (output_object)  xld_cont-array objectHXLDContHObjectHObjectHobject *

Extrahierte Linien.

SigmaSigmaSigmasigmasigma (input_control)  number HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Stärke der Gaußschen Glättung.

Default: 1.5

Wertevorschläge: 1, 1.2, 1.5, 1.8, 2, 2.5, 3, 4, 5

Wertebereich: 0 ≤ Sigma Sigma Sigma sigma sigma

Empfohlene Schrittweite: 0.1

LowLowLowlowlow (input_control)  number HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Untere Schwelle für Hysterese-Schwellenwertoperation.

Default: 3

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

Wertebereich: 0 ≤ Low Low Low low low

Empfohlene Schrittweite: 0.5

HighHighHighhighhigh (input_control)  number HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Obere Schwelle für Hysterese-Schwellenwertoperation.

Default: 8

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

Wertebereich: 0 ≤ High High High high high

Empfohlene Schrittweite: 0.5

Restriktion: High >= Low

LightDarkLightDarkLightDarklightDarklight_dark (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Helle oder dunkle Linien extrahieren.

Default: 'light' "light" "light" "light" "light"

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

ExtractWidthExtractWidthExtractWidthextractWidthextract_width (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Soll die Linienbreite extrahiert werden?

Default: 'true' "true" "true" "true" "true"

Werteliste: 'false'"false""false""false""false", 'true'"true""true""true""true"

LineModelLineModelLineModellineModelline_model (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Linienmodell, das zur Korrektur der Linienposition und -breite verwendet wird.

Default: 'bar-shaped' "bar-shaped" "bar-shaped" "bar-shaped" "bar-shaped"

Werteliste: 'bar-shaped'"bar-shaped""bar-shaped""bar-shaped""bar-shaped", 'gaussian'"gaussian""gaussian""gaussian""gaussian", 'none'"none""none""none""none", 'parabolic'"parabolic""parabolic""parabolic""parabolic"

CompleteJunctionsCompleteJunctionsCompleteJunctionscompleteJunctionscomplete_junctions (input_control)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Sollen die Kreuzungspunkte vervollständigt werden?

Default: 'true' "true" "true" "true" "true"

Werteliste: 'false'"false""false""false""false", 'true'"true""true""true""true"

Beispiel (HDevelop)

* Detection of lines in an aerial image
read_image(Image,'mreut4_3')
lines_gauss(Image,Lines,1.5,3,8,'light','true','bar-shaped','true')
dev_display(Lines)

Beispiel (C)

/* Detection of lines in an aerial image */
read_image(&Image,"mreut4_3");
lines_gauss(Image:&Lines:1.5,3,8,"light","true","bar-shaped","true");
disp_xld(Lines,WindowHandle);

Beispiel (C++)

/* Detection of lines in an aerial image */
HWindow w(0,0,520,560);
HImage Image("mreut4_3");
HXLDContArray Lines = Image.LinesGauss(1.5,3,8,"light","true",
                                       "bar-shaped","true");
Lines.Display(w);

Beispiel (HDevelop)

* Detection of lines in an aerial image
read_image(Image,'mreut4_3')
lines_gauss(Image,Lines,1.5,3,8,'light','true','bar-shaped','true')
dev_display(Lines)

Komplexität

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

Der Bedarf an temporären Speicher ist abhängig von der Höhe H der Region von ImageImageImageimageimage und der Breite W von ImageImageImageimageimage. Sei S = W*H, dann benötigt lines_gausslines_gaussLinesGaussLinesGausslines_gauss 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_gausslines_gaussLinesGaussLinesGausslines_gauss 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>)SetSystem("no_object_result",<Result>)set_system("no_object_result",<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Nachfolger

gen_polygons_xldgen_polygons_xldGenPolygonsXldGenPolygonsXldgen_polygons_xld

Alternativen

lines_facetlines_facetLinesFacetLinesFacetlines_facet

Siehe auch

bandpass_imagebandpass_imageBandpassImageBandpassImagebandpass_image, dyn_thresholddyn_thresholdDynThresholdDynThresholddyn_threshold, topographic_sketchtopographic_sketchTopographicSketchTopographicSketchtopographic_sketch

Literatur

C. Steger: „Extracting Curvilinear Structures: A Differential Geometric Approach“. In B. Buxton, R. Cipolla, eds., „Fourth European Conference on Computer Vision“, Lecture Notes in Computer Science, Volume 1064, Springer Verlag, pp. 630-641, 1996.
C. Steger: „Extraction of Curved Lines from Images“. In „13th International Conference on Pattern Recognition“, Volume II, pp. 251-255, 1996.
C. Steger: „An Unbiased Detector of Curvilinear Structures“. IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 20, no. 2, pp. 113-125, 1998.
C. Steger: „Unbiased extraction of lines with parabolic and Gaussian profiles“. Computer Vision and Image Understanding, vol. 117, no. 2, pp. 97-112, 2013.

Modul

2D Metrology