Operatoren |
lines_gauss — Erkennen von Linien und deren Breite.
lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )
Mit lines_gauss können Linien (gekrümmt-lineare Strukturen) aus einem Bild Image extrahiert werden. Die extrahierten Linien werden in Lines als subpixel-genaue XLD-Konturen zurückgegeben. Der Parameter LightDark bestimmt, ob helle oder dunkle Linien extrahiert werden sollen. Wenn ExtractWidth auf 'true' gesetzt wird, so wird für jeden Linienpunkt die Linienbreite extrahiert. Wenn LineModel auf einen Wert ungleich 'none' gesetzt wird, kompensiert lines_gauss die Effekte von asymmetrischen Linien (Linien mit unterschiedlichem Kontrast auf beiden Seiten der Linie), und korrigiert die Position und Breite der Linie. Für das zur Korrektur verwendete Linienmodell kann zwischen mit LineModel zwischen balkenförmigen Linien (LineModel = 'bar-shaped' ), parabolischen Linien (LineModel = 'parabolic' ) und Gaußschen Linien (LineModel = 'gaussian' ) ausgewählt werden. Balkenförmige Linien sind für die meisten Anwendungen die richtige Wahl. Für die Extraktion von röhrenförmigen Objekten im Durchlicht (z.B. Blutgefäße in Röntgenaufnahmen) bieten sich die anderen zwei Modi an. Dabei sollte das parabolische Linienmodell für Bilder verwendet werden, in denen die Linien sehr scharf abgebildet sind, und das Gaußsche Linienmodell für Bilder, in denen die Linien weniger scharf abgebildet sind. Der Parameter LineModel wird nur beachtet, falls ExtractWidth='true' . Da der Linienextraktor aus differentialgeometrischen Gründen bestimmte Kreuzungspunkte nicht extrahieren kann, wird versucht, diese mit anderen Mitteln zu extrahieren, falls CompleteJunctions='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 Sigma bestimmt dabei die Stärke der Glättung. Große Werte für Sigma sorgen für eine stärkere Glättung der Eingabedaten, können aber zu ungenauerer Lokalisation der Linien führen. Im Gegensatz zu lines_facet ist aber kein Schwingen der Linien für große Glättung zu beobachten. Ein weiterer Vorteil gegenüber lines_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 High ist, sofort als sichere Linienpunkte akzeptiert. Punkte, deren zweite Ableitung kleiner als Low 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_threshold). Allerdings wird diese Funktion nicht benutzt, da sonst keine subpixel-genaue Extraktion möglich wäre.
Bei der Wahl der Schwellenwerte High und Low ist zu beachten, dass die zweite Richtungsableitung von der Amplitude und Breite der Linie, sowie von der Größe des Glättungsparameters Sigma 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 Sigma: Je größer Sigma gewählt wird, desto kleiner wird die zweite Ableitung. Das bedeutet, dass für starke Glättung entsprechend kleinere Werte für High und Low 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 Sigma = 1.5 extrahiert werden sollen, so sollte High größer als 14 gewählt werden. Wenn dagegen 10 Pixel breite Linien mit einer Amplitude größer als 100 und einer Glättung Sigma = 3 gefunden werden sollen, so sollte High größer als 3.5 gesetzt werden. Als Werte für Low empfehlen sich Werte zwischen 0.25 High und 0.5 High.
Die Parameter Low und High können aus den entsprechende Grauwertkontrastwerten der zu extrahierenden Linien (ContrastLow und ContrastHigh) und dem gewählten Wert für Sigma wie folgt berechnet werden:
Die extrahierten Linien werden in einer topologisch sauberen Struktur in Lines zurückgeliefert. Das bedeutet, dass die Linien an Kreuzungspunkten sauber aufgetrennt werden.
lines_gauss definiert folgende Attribute für jeden Linienpunkt, falls ExtractWidth auf 'false' gesetzt wurde:
Der Winkel der Richtung senkrecht zur Linie
Die Größe der zweiten Ableitung
Falls ExtractWidth auf 'true' gesetzt wurde, werden zusätzlich zu 'angle' und 'response' noch folgende Attribute definiert:
Die Linienbreite links von der Linie
Die Linienbreite rechts von der Linie
Falls ExtractWidth auf 'true' und LineModel auf einen Wert ungleich 'none' gesetzt wurde, werden zusätzlich zu 'angle' , 'response' , 'width_left' und 'width_right' noch folgende Attribute definiert:
Die Asymmetrie des Linienpunkts
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.
Alle Attribute können mit get_contour_attrib_xld ausgelesen werden.
lines_gauss kann auf OpenCL-Geräten ausgeführt werden.
Im allgemeinen, aber besonders, wenn die Linienbreite extrahiert werden soll, sollte gewählt werden, wobei w die Breite (der halbe Durchmesser) der zu extrahierenden Linien im Bild ist. Als unterste Grenze muß gewählt werden. Falls z.B. Linien mit einer Breite von 4 Pixel (Durchmesser 8 Pixel) extrahiert werden sollen, sollte gewählt werden. Wird Sigma zu klein gewählt, so werden die Attribute 'width_left' , 'width_right' , 'asymmetry' und 'contrast' auf Null gesetzt.
lines_gauss wird durch SSE2 Instruktionen beschleunigt, falls der Systemparameter 'sse2_enable' auf 'true' gesetzt ist (dies ist Standard, sofern SSE2 auf Ihrem Rechner verfügbar ist). 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 'sse2_enable' auf 'false' setzen, bevor Sie lines_gauss aufrufen. Dadurch verwendet lines_gauss keine SSE2 Beschleunigungen. Vergessen Sie nicht 'sse2_enable' danach wieder auf 'true' zu setzen.
Wird lines_gauss auf OpenCL-Geräten ausgeführt, gelten die selben Einschränkungen wie für derivate_gauss: Sigma muss so gewählt werden, dass die resultierende Filtermask 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.
Eingabebild.
Extrahierte Linien.
Stärke der Gaußschen Glättung.
Defaultwert: 1.5
Wertevorschläge: 1, 1.2, 1.5, 1.8, 2, 2.5, 3, 4, 5
Typischer Wertebereich: 0.7 ≤ Sigma ≤ 20
Empfohlene Schrittweite: 0.1
Untere Schwelle für Hysterese-Schwellenwertoperation.
Defaultwert: 3
Wertevorschläge: 0, 0.5, 1, 2, 3, 4, 5, 8, 10
Typischer Wertebereich: 0 ≤ Low ≤ 20
Empfohlene Schrittweite: 0.5
Restriktion: Low >= 0
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 ≤ 35
Empfohlene Schrittweite: 0.5
Restriktion: High >= 0 && High >= Low
Helle oder dunkle Linien extrahieren.
Defaultwert: 'light'
Werteliste: 'dark' , 'light'
Soll die Linienbreite extrahiert werden?
Defaultwert: 'true'
Werteliste: 'false' , 'true'
Linienmodell, das zur Korrektur der Linienposition und -breite verwendet wird.
Defaultwert: 'bar-shaped'
Werteliste: 'bar-shaped' , 'gaussian' , 'none' , 'parabolic'
Sollen die Kreuzungspunkte vervollständigt werden?
Defaultwert: 'true'
Werteliste: 'false' , 'true'
* 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)
Sei A die Anzahl von Pixeln in der Region von Image. Dann ist die Laufzeitkomplexität O(A*Sigma).
Der Bedarf an temporären Speicher ist abhängig von der Höhe H der Region von Image und der Breite W von Image. Sei S = W*H, dann benötigt lines_gauss mindestens 55*S Bytes an temporärem Speicher bei der Ausführung.
Sind die Parameterwerte korrekt und tritt kein Fehler während der Berechnung auf, liefert lines_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>:) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
bandpass_image, dyn_threshold, topographic_sketch
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.
2D Metrology
Operatoren |