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. Weitere Informationen zu Konturattributen können der
Referenz von get_contour_attrib_xld
entnommen 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.
Dieser Operator unterstützt Cancel-Timeouts und Interrupts.
Image
(input_object) singlechannelimage →
object (byte / int1 / int2 / uint2 / int4 / real)
Eingabebild.
Lines
(output_object) xld_cont-array →
object
Extrahierte Linien.
Sigma
(input_control) number →
(real / integer)
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
Low
(input_control) number →
(real / integer)
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
High
(input_control) number →
(real / integer)
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
LightDark
(input_control) string →
(string)
Helle oder dunkle Linien extrahieren.
Defaultwert: 'light'
Werteliste: 'dark' , 'light'
ExtractWidth
(input_control) string →
(string)
Soll die Linienbreite extrahiert werden?
Defaultwert: 'true'
Werteliste: 'false' , 'true'
LineModel
(input_control) string →
(string)
Linienmodell, das zur Korrektur der Linienposition und -breite verwendet wird.
Defaultwert: 'bar-shaped'
Werteliste: 'bar-shaped' , 'gaussian' , 'none' , 'parabolic'
CompleteJunctions
(input_control) string →
(string)
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