points_foerstner T_points_foerstner PointsFoerstner PointsFoerstner points_foerstner (Operator)
Name
points_foerstner T_points_foerstner PointsFoerstner PointsFoerstner points_foerstner — Suche nach signifikanten Punkten mittels des Förstner-Operators.
Signatur
points_foerstner (Image : : SigmaGrad , SigmaInt , SigmaPoints , ThreshInhom , ThreshShape , Smoothing , EliminateDoublets : RowJunctions , ColumnJunctions , CoRRJunctions , CoRCJunctions , CoCCJunctions , RowArea , ColumnArea , CoRRArea , CoRCArea , CoCCArea )
Herror T_points_foerstner (const Hobject Image , const Htuple SigmaGrad , const Htuple SigmaInt , const Htuple SigmaPoints , const Htuple ThreshInhom , const Htuple ThreshShape , const Htuple Smoothing , const Htuple EliminateDoublets , Htuple* RowJunctions , Htuple* ColumnJunctions , Htuple* CoRRJunctions , Htuple* CoRCJunctions , Htuple* CoCCJunctions , Htuple* RowArea , Htuple* ColumnArea , Htuple* CoRRArea , Htuple* CoRCArea , Htuple* CoCCArea )
void PointsFoerstner (const HObject& Image , const HTuple& SigmaGrad , const HTuple& SigmaInt , const HTuple& SigmaPoints , const HTuple& ThreshInhom , const HTuple& ThreshShape , const HTuple& Smoothing , const HTuple& EliminateDoublets , HTuple* RowJunctions , HTuple* ColumnJunctions , HTuple* CoRRJunctions , HTuple* CoRCJunctions , HTuple* CoCCJunctions , HTuple* RowArea , HTuple* ColumnArea , HTuple* CoRRArea , HTuple* CoRCArea , HTuple* CoCCArea )
void HImage ::PointsFoerstner (const HTuple& SigmaGrad , const HTuple& SigmaInt , const HTuple& SigmaPoints , const HTuple& ThreshInhom , double ThreshShape , const HString& Smoothing , const HString& EliminateDoublets , HTuple* RowJunctions , HTuple* ColumnJunctions , HTuple* CoRRJunctions , HTuple* CoRCJunctions , HTuple* CoCCJunctions , HTuple* RowArea , HTuple* ColumnArea , HTuple* CoRRArea , HTuple* CoRCArea , HTuple* CoCCArea ) const
void HImage ::PointsFoerstner (double SigmaGrad , double SigmaInt , double SigmaPoints , double ThreshInhom , double ThreshShape , const HString& Smoothing , const HString& EliminateDoublets , HTuple* RowJunctions , HTuple* ColumnJunctions , HTuple* CoRRJunctions , HTuple* CoRCJunctions , HTuple* CoCCJunctions , HTuple* RowArea , HTuple* ColumnArea , HTuple* CoRRArea , HTuple* CoRCArea , HTuple* CoCCArea ) const
void HImage ::PointsFoerstner (double SigmaGrad , double SigmaInt , double SigmaPoints , double ThreshInhom , double ThreshShape , const char* Smoothing , const char* EliminateDoublets , HTuple* RowJunctions , HTuple* ColumnJunctions , HTuple* CoRRJunctions , HTuple* CoRCJunctions , HTuple* CoCCJunctions , HTuple* RowArea , HTuple* ColumnArea , HTuple* CoRRArea , HTuple* CoRCArea , HTuple* CoCCArea ) const
void HImage ::PointsFoerstner (double SigmaGrad , double SigmaInt , double SigmaPoints , double ThreshInhom , double ThreshShape , const wchar_t* Smoothing , const wchar_t* EliminateDoublets , HTuple* RowJunctions , HTuple* ColumnJunctions , HTuple* CoRRJunctions , HTuple* CoRCJunctions , HTuple* CoCCJunctions , HTuple* RowArea , HTuple* ColumnArea , HTuple* CoRRArea , HTuple* CoRCArea , HTuple* CoCCArea ) const
(Nur Windows)
static void HOperatorSet .PointsFoerstner (HObject image , HTuple sigmaGrad , HTuple sigmaInt , HTuple sigmaPoints , HTuple threshInhom , HTuple threshShape , HTuple smoothing , HTuple eliminateDoublets , out HTuple rowJunctions , out HTuple columnJunctions , out HTuple coRRJunctions , out HTuple coRCJunctions , out HTuple coCCJunctions , out HTuple rowArea , out HTuple columnArea , out HTuple coRRArea , out HTuple coRCArea , out HTuple coCCArea )
void HImage .PointsFoerstner (HTuple sigmaGrad , HTuple sigmaInt , HTuple sigmaPoints , HTuple threshInhom , double threshShape , string smoothing , string eliminateDoublets , out HTuple rowJunctions , out HTuple columnJunctions , out HTuple coRRJunctions , out HTuple coRCJunctions , out HTuple coCCJunctions , out HTuple rowArea , out HTuple columnArea , out HTuple coRRArea , out HTuple coRCArea , out HTuple coCCArea )
void HImage .PointsFoerstner (double sigmaGrad , double sigmaInt , double sigmaPoints , double threshInhom , double threshShape , string smoothing , string eliminateDoublets , out HTuple rowJunctions , out HTuple columnJunctions , out HTuple coRRJunctions , out HTuple coRCJunctions , out HTuple coCCJunctions , out HTuple rowArea , out HTuple columnArea , out HTuple coRRArea , out HTuple coRCArea , out HTuple coCCArea )
def points_foerstner (image : HObject, sigma_grad : Union[float, int], sigma_int : Union[float, int], sigma_points : Union[float, int], thresh_inhom : Union[float, int], thresh_shape : float, smoothing : str, eliminate_doublets : str) -> Tuple[Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[float]]
Beschreibung
points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner 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 Punktextraktion 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 Smoothing Smoothing Smoothing smoothing smoothing auf 'gauss' "gauss" "gauss" "gauss" "gauss" "gauss" gesetzt, dann werden die
Ableitungen mit
einem Gaußfilter der Größe SigmaGrad SigmaGrad SigmaGrad SigmaGrad sigmaGrad sigma_grad berechnet und die Glättung
erfolgt durch einen Gaußfilter der Größe SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_int . Wird
Smoothing Smoothing Smoothing Smoothing smoothing smoothing auf 'mean' "mean" "mean" "mean" "mean" "mean" gesetzt, werden die Ableitungen
mit einem 3 x 3 Sobelfilter berechnet (SigmaGrad SigmaGrad SigmaGrad SigmaGrad sigmaGrad sigma_grad
wird ignoriert) und die Glättung erfolgt durch einen
SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_int x
SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_int 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 ThreshInhom ThreshInhom ThreshInhom threshInhom thresh_inhom und deren Isotropie gleichzeitig
größer oder gleich ThreshShape ThreshShape ThreshShape ThreshShape threshShape thresh_shape 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 Smoothing Smoothing Smoothing smoothing smoothing =
'gauss' "gauss" "gauss" "gauss" "gauss" "gauss" erfolgt die Durchschnittsbildung mit einem Gaußfilter
der Größe SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points . Für Smoothing Smoothing Smoothing Smoothing smoothing smoothing =
'mean' "mean" "mean" "mean" "mean" "mean" erfolgt die Durchschnittsbildung mit einem
SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points x
SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points Mittelwertfilter. Die lokalen
Minima der Optimierungsfunktionen ergeben die signifikanten Punkte. Ihre
Position wird subpixelgenau in (RowJunctions RowJunctions RowJunctions RowJunctions rowJunctions row_junctions ,
ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions columnJunctions column_junctions ) und (RowArea RowArea RowArea RowArea rowArea row_area , ColumnArea ColumnArea ColumnArea ColumnArea columnArea column_area )
zurückgegeben.
Neben der Position werden für jeden gefundenen Punkt auch
die Elemente CoRRJunctions CoRRJunctions CoRRJunctions CoRRJunctions coRRJunctions co_rrjunctions , CoRCJunctions CoRCJunctions CoRCJunctions CoRCJunctions coRCJunctions co_rcjunctions und
CoCCJunctions CoCCJunctions CoCCJunctions CoCCJunctions coCCJunctions co_ccjunctions (bzw. CoRRArea CoRRArea CoRRArea CoRRArea coRRArea co_rrarea , CoRCArea CoRCArea CoRCArea CoRCArea coRCArea co_rcarea und
CoCCArea CoCCArea CoCCArea CoCCArea coCCArea co_ccarea ) 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 intensity Intensity Intensity Intensity intensity oder auf Bildbereiche mit einem
rampenförmigen Grauwertverlauf plane_deviation plane_deviation PlaneDeviation PlaneDeviation PlaneDeviation plane_deviation anwendet. In beiden
Fällen wird die Stärke des Rauschens im Parameter Deviation zurückgegeben.)
Das Beispielprogram 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
Dopplungen werden automatisch eliminiert, wenn man
EliminateDoublets EliminateDoublets EliminateDoublets EliminateDoublets eliminateDoublets eliminate_doublets auf 'true' "true" "true" "true" "true" "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 EliminateDoublets EliminateDoublets EliminateDoublets eliminateDoublets eliminate_doublets
'false' "false" "false" "false" "false" "false" , so werden alle gefundenen Punkte zurückgegeben.
Achtung
Es ist zu beachten, dass für Smoothing Smoothing Smoothing Smoothing smoothing smoothing = 'mean' "mean" "mean" "mean" "mean" "mean" ,
nur ungerade Werte für SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_int und SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points
zulässig sind. Gerade Werte werden automatisch durch den
nächstgrößeren ungeraden Wert ersetzt.
points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner points_foerstner mit Smoothing Smoothing Smoothing Smoothing smoothing smoothing = 'gauss' "gauss" "gauss" "gauss" "gauss" "gauss" wird
durch SSE2 Instruktionen beschleunigt, falls der Systemparameter
'sse2_enable' "sse2_enable" "sse2_enable" "sse2_enable" "sse2_enable" "sse2_enable" auf 'true' "true" "true" "true" "true" "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 RowJunctions RowJunctions RowJunctions rowJunctions row_junctions und ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions columnJunctions column_junctions in einer Größenordnung
von 1.0e-5). Falls für Ihre Anwendung Genauigkeit wichtiger ist als
Geschwindigkeit können Sie 'sse2_enable' "sse2_enable" "sse2_enable" "sse2_enable" "sse2_enable" "sse2_enable" auf 'false' "false" "false" "false" "false" "false"
setzen, bevor Sie points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner points_foerstner aufrufen. Dadurch verwendet
points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner points_foerstner keine SSE2 Beschleunigungen. Vergessen Sie nicht
'sse2_enable' "sse2_enable" "sse2_enable" "sse2_enable" "sse2_enable" "sse2_enable" danach wieder auf 'true' "true" "true" "true" "true" "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.
Ausführungsinformationen
Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
Automatisch parallelisiert auf interner Datenebene.
Parameter
Image Image Image Image image image (input_object) (multichannel-)image → object HImage HObject HImage Hobject (byte / uint2 / real)
Eingabebild.
SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_int (input_control) number → HTuple Union[float, int] HTuple Htuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)
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
Empfohlene Schrittweite: 0.1
Restriktion: SigmaInt > 0
SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points (input_control) number → HTuple Union[float, int] HTuple Htuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)
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
Empfohlene Schrittweite: 0.1
Restriktion: SigmaPoints >= SigmaInt && SigmaPoints > 0.6
ThreshInhom ThreshInhom ThreshInhom ThreshInhom threshInhom thresh_inhom (input_control) number → HTuple Union[float, int] HTuple Htuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)
Schwellenwert zur Bestimmung inhomogener Bildbereiche.
Defaultwert: 200
Wertevorschläge: 50, 100, 200, 500, 1000
Typischer Wertebereich: 0.0
≤
ThreshInhom
ThreshInhom
ThreshInhom
ThreshInhom
threshInhom
thresh_inhom
ThreshShape ThreshShape ThreshShape ThreshShape threshShape thresh_shape (input_control) real → HTuple float HTuple Htuple (real) (double ) (double ) (double )
Schwellenwert 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
ThreshShape
ThreshShape
ThreshShape
threshShape
thresh_shape
≤
1
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
Smoothing Smoothing Smoothing Smoothing smoothing smoothing (input_control) string → HTuple str HTuple Htuple (string) (string ) (HString ) (char* )
Verwendetes Glättungsverfahren.
Defaultwert:
'gauss'
"gauss"
"gauss"
"gauss"
"gauss"
"gauss"
Werteliste: 'gauss' "gauss" "gauss" "gauss" "gauss" "gauss" , 'mean' "mean" "mean" "mean" "mean" "mean"
EliminateDoublets EliminateDoublets EliminateDoublets EliminateDoublets eliminateDoublets eliminate_doublets (input_control) string → HTuple str HTuple Htuple (string) (string ) (HString ) (char* )
Beseitigung mehrfach erkannter Punkte.
Defaultwert:
'false'
"false"
"false"
"false"
"false"
"false"
Werteliste: 'false' "false" "false" "false" "false" "false" , 'true' "true" "true" "true" "true" "true"
RowJunctions RowJunctions RowJunctions RowJunctions rowJunctions row_junctions (output_control) point.y-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Zeilenkoordinaten der gefundenen Kreuzungspunkte.
ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions columnJunctions column_junctions (output_control) point.x-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Spaltenkoordinaten der gefundenen Kreuzungspunkte.
CoRRJunctions CoRRJunctions CoRRJunctions CoRRJunctions coRRJunctions co_rrjunctions (output_control) number-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Zeilenanteil der Kovarianzmatrix der gefundenen
Kreuzungspunkte.
CoRCJunctions CoRCJunctions CoRCJunctions CoRCJunctions coRCJunctions co_rcjunctions (output_control) number-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Gemischter Anteil der Kovarianzmatrix der gefundenen
Kreuzungspunkte.
CoCCJunctions CoCCJunctions CoCCJunctions CoCCJunctions coCCJunctions co_ccjunctions (output_control) number-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Spaltenanteil der Kovarianzmatrix der gefundenen
Kreuzungspunkte.
RowArea RowArea RowArea RowArea rowArea row_area (output_control) point.y-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Zeilenkoordinaten der gefundenen Flächenpunkte.
ColumnArea ColumnArea ColumnArea ColumnArea columnArea column_area (output_control) point.x-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Spaltenkoordinaten der gefundenen Flächenpunkte.
CoRRArea CoRRArea CoRRArea CoRRArea coRRArea co_rrarea (output_control) number-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Zeilenanteil der Kovarianzmatrix der gefundenen
Flächenpunkte.
CoRCArea CoRCArea CoRCArea CoRCArea coRCArea co_rcarea (output_control) number-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Gemischter Anteil der Kovarianzmatrix der gefundenen
Flächenpunkte.
CoCCArea CoCCArea CoCCArea CoCCArea coCCArea co_ccarea (output_control) number-array → HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Spaltenanteil der Kovarianzmatrix der gefundenen
Flächenpunkte.
Ergebnis
Sind die Parameterwerte korrekt und tritt kein Fehler während der
Berechnung auf, liefert points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner 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>) set_system("no_object_result",<Result>) SetSystem("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_cross_contour_xld gen_cross_contour_xld GenCrossContourXld GenCrossContourXld GenCrossContourXld gen_cross_contour_xld ,
disp_cross disp_cross DispCross DispCross DispCross disp_cross
Alternativen
points_harris points_harris PointsHarris PointsHarris PointsHarris points_harris ,
points_lepetit points_lepetit PointsLepetit PointsLepetit PointsLepetit points_lepetit ,
points_harris_binomial points_harris_binomial PointsHarrisBinomial PointsHarrisBinomial PointsHarrisBinomial points_harris_binomial
Literatur
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.
Modul
Foundation