Name
points_foerstner T_points_foerstner PointsFoerstner points_foerstner PointsFoerstner PointsFoerstner — 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 )
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 )
Herror points_foerstner (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 )
HTuple HImage ::PointsFoerstner (const HTuple& SigmaGrad , const HTuple& SigmaInt , const HTuple& SigmaPoints , const HTuple& ThreshInhom , const HTuple& ThreshShape , const HTuple& Smoothing , const HTuple& EliminateDoublets , HTuple* ColumnJunctions , HTuple* CoRRJunctions , HTuple* CoRCJunctions , HTuple* CoCCJunctions , HTuple* RowArea , HTuple* ColumnArea , HTuple* CoRRArea , HTuple* CoRCArea , HTuple* CoCCArea ) const
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 HOperatorSetX .PointsFoerstner ( [in] IHUntypedObjectX* Image , [in] VARIANT SigmaGrad , [in] VARIANT SigmaInt , [in] VARIANT SigmaPoints , [in] VARIANT ThreshInhom , [in] VARIANT ThreshShape , [in] VARIANT Smoothing , [in] VARIANT EliminateDoublets , [out] VARIANT* RowJunctions , [out] VARIANT* ColumnJunctions , [out] VARIANT* CoRRJunctions , [out] VARIANT* CoRCJunctions , [out] VARIANT* CoCCJunctions , [out] VARIANT* RowArea , [out] VARIANT* ColumnArea , [out] VARIANT* CoRRArea , [out] VARIANT* CoRCArea , [out] VARIANT* CoCCArea )
VARIANT HImageX .PointsFoerstner ( [in] VARIANT SigmaGrad , [in] VARIANT SigmaInt , [in] VARIANT SigmaPoints , [in] VARIANT ThreshInhom , [in] double ThreshShape , [in] BSTR Smoothing , [in] BSTR EliminateDoublets , [out] VARIANT* ColumnJunctions , [out] VARIANT* CoRRJunctions , [out] VARIANT* CoRCJunctions , [out] VARIANT* CoCCJunctions , [out] VARIANT* RowArea , [out] VARIANT* ColumnArea , [out] VARIANT* CoRRArea , [out] VARIANT* CoRCArea , [out] VARIANT* CoCCArea )
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 )
points_foerstner points_foerstner PointsFoerstner points_foerstner PointsFoerstner PointsFoerstner 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 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 sigmaGrad berechnet und die Glättung
erfolgt durch einen Gaußfilter der Größe SigmaInt SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt . 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 sigmaGrad
wird ignoriert) und die Glättung erfolgt durch einen
SigmaInt SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt x
SigmaInt SigmaInt SigmaInt SigmaInt SigmaInt 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 ThreshInhom ThreshInhom ThreshInhom ThreshInhom threshInhom und deren Isotropie gleichzeitig
größer oder gleich ThreshShape ThreshShape ThreshShape ThreshShape ThreshShape 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 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 sigmaPoints . Für Smoothing Smoothing Smoothing Smoothing Smoothing smoothing =
'mean' "mean" "mean" "mean" "mean" "mean" erfolgt die Durchschnittsbildung mit einem
SigmaPoints SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints x
SigmaPoints SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints Mittelwertfilter. Die lokalen
Minima der Optimierungsfunktionen ergeben die signifikanten Punkte. Ihre
Position wird subpixelgenau in (RowJunctions RowJunctions RowJunctions RowJunctions RowJunctions rowJunctions ,
ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions columnJunctions ) und (RowArea RowArea RowArea RowArea RowArea rowArea , ColumnArea ColumnArea ColumnArea ColumnArea ColumnArea columnArea )
zurückgegeben.
Neben der Position werden für jeden gefundenen Punkt auch
die Elemente CoRRJunctions CoRRJunctions CoRRJunctions CoRRJunctions CoRRJunctions coRRJunctions , CoRCJunctions CoRCJunctions CoRCJunctions CoRCJunctions CoRCJunctions coRCJunctions und
CoCCJunctions CoCCJunctions CoCCJunctions CoCCJunctions CoCCJunctions coCCJunctions (bzw. CoRRArea CoRRArea CoRRArea CoRRArea CoRRArea coRRArea , CoRCArea CoRCArea CoRCArea CoRCArea CoRCArea coRCArea und
CoCCArea CoCCArea CoCCArea CoCCArea CoCCArea 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 intensity Intensity intensity Intensity Intensity oder auf Bildbereiche mit einem
rampenförmigen Grauwertverlauf plane_deviation plane_deviation PlaneDeviation plane_deviation PlaneDeviation PlaneDeviation 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 EliminateDoublets EliminateDoublets EliminateDoublets EliminateDoublets eliminateDoublets 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 eliminateDoublets
'false' "false" "false" "false" "false" "false" , so werden alle gefundenen Punkte zurückgegeben.
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 sigmaInt und SigmaPoints SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints
zulässig sind. Gerade Werte werden automatisch durch den
nächstgrößeren ungeraden Wert ersetzt.
points_foerstner points_foerstner PointsFoerstner points_foerstner PointsFoerstner PointsFoerstner 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 rowJunctions und ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions columnJunctions 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 points_foerstner PointsFoerstner PointsFoerstner aufrufen. Dadurch verwendet
points_foerstner points_foerstner PointsFoerstner points_foerstner PointsFoerstner PointsFoerstner 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.
Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
Automatisch parallelisiert auf interner Datenebene.
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
SigmaInt
SigmaInt
SigmaInt
SigmaInt
sigmaInt
≤
50.0
Empfohlene Schrittweite: 0.1
Restriktion: SigmaInt > 0.0
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
SigmaPoints
SigmaPoints
SigmaPoints
SigmaPoints
sigmaPoints
≤
50.0
Empfohlene Schrittweite: 0.1
Restriktion: SigmaPoints >= SigmaInt && SigmaPoints > 0.6
Schwellwert zur Bestimmung inhomogener Bildbereiche.
Defaultwert: 200
Wertevorschläge: 50, 100, 200, 500, 1000
Restriktion: ThreshInhom >= 0.0
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
ThreshShape
ThreshShape
ThreshShape
ThreshShape
threshShape
≤
1
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.1
Restriktion: 0.0 <= ThreshShape && ThreshShape <= 1.0
Verwendetes Glättungsverfahren.
Defaultwert:
'gauss'
"gauss"
"gauss"
"gauss"
"gauss"
"gauss"
Werteliste: 'gauss' "gauss" "gauss" "gauss" "gauss" "gauss" , 'mean' "mean" "mean" "mean" "mean" "mean"
Beseitigung mehrfach erkannter Punkte.
Defaultwert:
'false'
"false"
"false"
"false"
"false"
"false"
Werteliste: 'false' "false" "false" "false" "false" "false" , 'true' "true" "true" "true" "true" "true"
Zeilenkoordinaten der gefundenen Kreuzungspunkte.
Spaltenkoordinaten der gefundenen Kreuzungspunkte.
Zeilenanteil der Kovarianzmatrix der gefundenen
Kreuzungspunkte.
Gemischter Anteil der Kovarianzmatrix der gefundenen
Kreuzungspunkte.
Spaltenanteil der Kovarianzmatrix der gefundenen
Kreuzungspunkte.
Zeilenkoordinaten der gefundenen Flächenpunkte.
Spaltenkoordinaten der gefundenen Flächenpunkte.
Zeilenanteil der Kovarianzmatrix der gefundenen
Flächenpunkte.
Gemischter Anteil der Kovarianzmatrix der gefundenen
Flächenpunkte.
Spaltenanteil der Kovarianzmatrix der gefundenen
Flächenpunkte.
Sind die Parameterwerte korrekt und tritt kein Fehler während der
Berechnung auf, liefert points_foerstner points_foerstner PointsFoerstner points_foerstner PointsFoerstner PointsFoerstner 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>) set_system("no_object_result",<Result>) SetSystem("no_object_result",<Result>) SetSystem("no_object_result",<Result>)
festlegen. Gegebenenfalls wird eine Fehlerbehandlung
durchgeführt.
gen_cross_contour_xld gen_cross_contour_xld GenCrossContourXld gen_cross_contour_xld GenCrossContourXld GenCrossContourXld ,
disp_cross disp_cross DispCross disp_cross DispCross DispCross
points_harris points_harris PointsHarris points_harris PointsHarris PointsHarris ,
points_lepetit points_lepetit PointsLepetit points_lepetit PointsLepetit PointsLepetit ,
points_harris_binomial points_harris_binomial PointsHarrisBinomial points_harris_binomial PointsHarrisBinomial PointsHarrisBinomial
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