points_foerstner
— Suche nach signifikanten Punkten mittels des Förstner-Operators.
points_foerstner(Image : : SigmaGrad, SigmaInt, SigmaPoints, ThreshInhom, ThreshShape, Smoothing, EliminateDoublets : RowJunctions, ColumnJunctions, CoRRJunctions, CoRCJunctions, CoCCJunctions, RowArea, ColumnArea, CoRRArea, CoRCArea, CoCCArea)
points_foerstner
extrahiert signifikante Punkte aus einem Bild.
Signifikante Punkte sind Punkte im Bild, die sich von ihrer Umgebung
unterscheiden, also Punkte, an denen sich das Bildsignal zweidimensional
ändert. Diese Änderung tritt zum einen an den Schnittpunkte von
Grauwertkanten auf (sogenannte Kreuzungspunkte), zum anderen an
Stellen, deren Farbe oder Helligkeit sich von ihrer Umgebung unterscheidet
(sogenannte Flächenpunkte).
Die Punkextraktion erfolgt in zwei Stufen: Im ersten Schritt werden die
Punktregionen, also inhomogene Regionen mit hoher Isotropie, aus dem
Eingabebild extrahiert. Dazu wird die geglättete Matrix
berechnet, wobei und für die ersten
Ableitungen der einzelnen Bildkanäle und S für eine Glättung stehen.
Wird Smoothing
auf 'gauss' gesetzt, dann werden die
Ableitungen mit
einem Gaußfilter der Größe SigmaGrad
berechnet und die Glättung
erfolgt durch einen Gaußfilter der Größe SigmaInt
. Wird
Smoothing
auf 'mean' gesetzt, werden die Ableitungen
mit einem 3 x 3 Sobelfilter berechnet (SigmaGrad
wird ignoriert) und die Glättung erfolgt durch einen
SigmaInt
x
SigmaInt
Mittelwertfilter.
Dabei ist
Inhomogenität = Spur(M)
das Maß für die Inhomogenität im Bild und
das Maß der Isotropie der Textur im Bild. Bildpunkte, deren Inhomogenität
größer oder gleich ThreshInhom
und deren Isotropie gleichzeitig
größer oder gleich ThreshShape
ist, werden im Anschluss weiter
untersucht.
Im zweiten Schritt werden für diese Punkte zwei Optimierungsfunktionen
berechnet. Diese Optimierungsfunktionen geben im Wesentlichen für jeden
Bildpunkt die durchschnittlichen Abstände zu den Kanten- (Kreuzungspunkte)
bzw. Gradientenrichtungen (Flächenpunkte) innerhalb eines
Beobachtungsfensters um den Punkt wieder. Für Smoothing
=
'gauss' erfolgt die Durchschnittsbildung mit einem Gaußfilter
der Größe SigmaPoints
. Für Smoothing
=
'mean' erfolgt die Durchschnittsbildung mit einem
SigmaPoints
x
SigmaPoints
Mittelwertfilter. Die lokalen
Minima der Optimierungsfunktionen ergeben die signifikanten Punkte. Ihre
Position wird subpixelgenau in (RowJunctions
,
ColumnJunctions
) und (RowArea
, ColumnArea
)
zurückgegeben.
Neben der Position werden für jeden gefundenen Punkt auch
die Elemente CoRRJunctions
, CoRCJunctions
und
CoCCJunctions
(bzw. CoRRArea
, CoRCArea
und
CoCCArea
) seiner Kovarianzmatrix zurückgegeben. Diese erlaubt
Rückschlüsse auf die Genauigkeit der gefundenen Punktposition. Um die
tatsächlichen Werte zu erhalten, ist es notwendig, im Eingabebild die
Stärke des Rauschens zu ermitteln und anschließend alle Komponenten der
Kovarianzmatrix mit der Varianz des Rauschens zu multiplizieren. (Die
Stärke des Rauschens ermittelt man z.B., indem man auf Bildbereiche mit
konstantem Grauwert intensity
oder auf Bildbereiche mit einem
rampenförmigen Grauwertverlauf plane_deviation
anwendet. In beiden
Fällen wird die Stärke des Rauschens im Parameter Deviation zurückgegeben.)
Das Beispielprogram
%HALCONEXAMPLES%\hdevelop\Filter\Points\points_foerstner_ellipses.hdev
illustriert diesen Sachverhalt.
Es liegt in der Natur dieses Operators, dass an Ecken häufig zwei separate
Punkte erkannt werden: Ein Kreuzungspunkt im Schnittpunkt der Kanten der
Ecke und ein Flächenpunkt etwas weiter im Inneren der Ecke. Solche
Doubletten werden automatisch eliminiert, wenn man
EliminateDoublets
auf 'true' setzt. Dazu werden alle
möglichen Paare von jeweils einem Kreuzungs- und Flächenpunkt untersucht.
Liegen die Punkte innerhalb des Beobachtungsfensters der
Optimierungsfunktion des jeweiligen anderen Punktes, dann wird für beide
Punkte die Genauigkeit ihrer Position berechnet und der Punkt mit der
geringeren Genauigkeit verworfen. Ist EliminateDoublets
'false' , so werden alle gefundenen Punkte zurückgegeben.
Es ist zu beachten, dass für Smoothing
= 'mean' ,
nur ungerade Werte für SigmaInt
und SigmaPoints
zulässig sind. Gerade Werte werden automatisch durch den
nächstgrößeren ungeraden Wert ersetzt.
points_foerstner
mit Smoothing
= '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 (für 'byte' Bilder bewegt sich der Unterschied von
RowJunctions
und ColumnJunctions
in einer Größenordnung
von 1.0e-5). Falls für Ihre Anwendung Genauigkeit wichtiger ist als
Geschwindigkeit können Sie 'sse2_enable' auf 'false'
setzen, bevor Sie points_foerstner
aufrufen. Dadurch verwendet
points_foerstner
keine SSE2 Beschleunigungen. Vergessen Sie nicht
'sse2_enable' danach wieder auf 'true' zu setzen.
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.
Image
(input_object) (multichannel-)image →
object (byte / uint2 / real)
Eingabebild.
SigmaGrad
(input_control) number →
(real / integer)
Stärke der Glättung zur Berechnung des Gradienten.
Für Smoothing
= 'mean' wird
SigmaGrad
ignoriert.
Defaultwert: 1.0
Wertevorschläge: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0
Typischer Wertebereich: 0.7
≤
SigmaGrad
≤
50.0
Empfohlene Schrittweite: 0.1
Restriktion: SigmaGrad > 0.0
SigmaInt
(input_control) number →
(real / integer)
Stärke der Glättung zur Integration der Gradienten.
Defaultwert: 2.0
Wertevorschläge: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0
Typischer Wertebereich: 0.7
≤
SigmaInt
≤
50.0
Empfohlene Schrittweite: 0.1
Restriktion: SigmaInt > 0.0
SigmaPoints
(input_control) number →
(real / integer)
Stärke der Glättung in den Optimierungsfunktionen.
Defaultwert: 3.0
Wertevorschläge: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0
Typischer Wertebereich: 0.7
≤
SigmaPoints
≤
50.0
Empfohlene Schrittweite: 0.1
Restriktion: SigmaPoints >= SigmaInt && SigmaPoints > 0.6
ThreshInhom
(input_control) number →
(real / integer)
Schwellwert zur Bestimmung inhomogener Bildbereiche.
Defaultwert: 200
Wertevorschläge: 50, 100, 200, 500, 1000
Restriktion: ThreshInhom >= 0.0
ThreshShape
(input_control) real →
(real)
Schwellwert zur Bestimmung der Punktregionen.
Defaultwert: 0.3
Wertevorschläge: 0.1, 0.2, 0.3, 0.4, 0.5, 0.7
Typischer Wertebereich: 0.01
≤
ThreshShape
≤
1
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
Restriktion: 0.0 <= ThreshShape && ThreshShape <= 1.0
Smoothing
(input_control) string →
(string)
Verwendetes Glättungsverfahren.
Defaultwert: 'gauss'
Werteliste: 'gauss' , 'mean'
EliminateDoublets
(input_control) string →
(string)
Beseitigung mehrfach erkannter Punkte.
Defaultwert: 'false'
Werteliste: 'false' , 'true'
RowJunctions
(output_control) point.y-array →
(real)
Zeilenkoordinaten der gefundenen Kreuzungspunkte.
ColumnJunctions
(output_control) point.x-array →
(real)
Spaltenkoordinaten der gefundenen Kreuzungspunkte.
CoRRJunctions
(output_control) number-array →
(real)
Zeilenanteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.
CoRCJunctions
(output_control) number-array →
(real)
Gemischter Anteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.
CoCCJunctions
(output_control) number-array →
(real)
Spaltenanteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.
RowArea
(output_control) point.y-array →
(real)
Zeilenkoordinaten der gefundenen Flächenpunkte.
ColumnArea
(output_control) point.x-array →
(real)
Spaltenkoordinaten der gefundenen Flächenpunkte.
CoRRArea
(output_control) number-array →
(real)
Zeilenanteil der Kovarianzmatrix der gefundenen Flächenpunkte.
CoRCArea
(output_control) number-array →
(real)
Gemischter Anteil der Kovarianzmatrix der gefundenen Flächenpunkte.
CoCCArea
(output_control) number-array →
(real)
Spaltenanteil der Kovarianzmatrix der gefundenen Flächenpunkte.
Sind die Parameterwerte korrekt und tritt kein Fehler während der
Berechnung auf, liefert points_foerstner
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.
gen_cross_contour_xld
,
disp_cross
points_harris
,
points_lepetit
,
points_harris_binomial
W. Förstner, E. Gülch: „A Fast Operator for Detection and Precise
Location of Distinct Points, Corners and Circular features“. In
Proceedings of the Intercommission Conference on Fast Processing of
Photogrametric Data, Interlaken, pp. 281-305, 1987.
W. Förstner: „Statistische Verfahren für die automatische
Bildanalyse und ihre Bewertung bei der Objekterkennung und
-vermessung“. Volume 370, Series C, Deutsche Geodätische
Kommission, München, 1991.
W. Förstner: „A Framework for Low Level Feature
Extraction“. European Conference on Computer Vision, LNCS 802,
pp. 383-394, Springer Verlag, 1994.
C. Fuchs: „Extraktion polymorpher Bildstrukturen und ihre
topologische und geometrische Gruppierung“. Volume 502, Series C,
Deutsche Geodätische Kommission, München, 1998.
Foundation