points_foerstnerT_points_foerstnerPointsFoerstnerPointsFoerstner (Operator)

Name

points_foerstnerT_points_foerstnerPointsFoerstnerPointsFoerstner — 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)

Beschreibung

points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstner 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 SmoothingSmoothingSmoothingSmoothingsmoothing auf 'gauss'"gauss""gauss""gauss""gauss" gesetzt, dann werden die Ableitungen mit einem Gaußfilter der Größe SigmaGradSigmaGradSigmaGradSigmaGradsigmaGrad berechnet und die Glättung erfolgt durch einen Gaußfilter der Größe SigmaIntSigmaIntSigmaIntSigmaIntsigmaInt. Wird SmoothingSmoothingSmoothingSmoothingsmoothing auf 'mean'"mean""mean""mean""mean" gesetzt, werden die Ableitungen mit einem 3 x 3 Sobelfilter berechnet (SigmaGradSigmaGradSigmaGradSigmaGradsigmaGrad wird ignoriert) und die Glättung erfolgt durch einen SigmaIntSigmaIntSigmaIntSigmaIntsigmaInt x SigmaIntSigmaIntSigmaIntSigmaIntsigmaInt 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 ThreshInhomThreshInhomThreshInhomThreshInhomthreshInhom und deren Isotropie gleichzeitig größer oder gleich ThreshShapeThreshShapeThreshShapeThreshShapethreshShape 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 SmoothingSmoothingSmoothingSmoothingsmoothing = 'gauss'"gauss""gauss""gauss""gauss" erfolgt die Durchschnittsbildung mit einem Gaußfilter der Größe SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPoints. Für SmoothingSmoothingSmoothingSmoothingsmoothing = 'mean'"mean""mean""mean""mean" erfolgt die Durchschnittsbildung mit einem SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPoints x SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPoints Mittelwertfilter. Die lokalen Minima der Optimierungsfunktionen ergeben die signifikanten Punkte. Ihre Position wird subpixelgenau in (RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctions, ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctions) und (RowAreaRowAreaRowAreaRowArearowArea, ColumnAreaColumnAreaColumnAreaColumnAreacolumnArea) zurückgegeben.

Neben der Position werden für jeden gefundenen Punkt auch die Elemente CoRRJunctionsCoRRJunctionsCoRRJunctionsCoRRJunctionscoRRJunctions, CoRCJunctionsCoRCJunctionsCoRCJunctionsCoRCJunctionscoRCJunctions und CoCCJunctionsCoCCJunctionsCoCCJunctionsCoCCJunctionscoCCJunctions (bzw. CoRRAreaCoRRAreaCoRRAreaCoRRAreacoRRArea, CoRCAreaCoRCAreaCoRCAreaCoRCAreacoRCArea und CoCCAreaCoCCAreaCoCCAreaCoCCAreacoCCArea) 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 intensityintensityIntensityIntensityIntensity oder auf Bildbereiche mit einem rampenförmigen Grauwertverlauf plane_deviationplane_deviationPlaneDeviationPlaneDeviationPlaneDeviation 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 EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoublets auf '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 EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoublets 'false'"false""false""false""false", so werden alle gefundenen Punkte zurückgegeben.

Achtung

Es ist zu beachten, dass für SmoothingSmoothingSmoothingSmoothingsmoothing = 'mean'"mean""mean""mean""mean", nur ungerade Werte für SigmaIntSigmaIntSigmaIntSigmaIntsigmaInt und SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPoints zulässig sind. Gerade Werte werden automatisch durch den nächstgrößeren ungeraden Wert ersetzt.

points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstner mit SmoothingSmoothingSmoothingSmoothingsmoothing = 'gauss'"gauss""gauss""gauss""gauss" wird durch SSE2 Instruktionen beschleunigt, falls der Systemparameter 'sse2_enable'"sse2_enable""sse2_enable""sse2_enable""sse2_enable" auf '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 RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctions und ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctions 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" auf 'false'"false""false""false""false" setzen, bevor Sie points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstner aufrufen. Dadurch verwendet points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstner keine SSE2 Beschleunigungen. Vergessen Sie nicht 'sse2_enable'"sse2_enable""sse2_enable""sse2_enable""sse2_enable" danach wieder auf '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

Parameter

ImageImageImageImageimage (input_object)  (multichannel-)image objectHImageHImageHobject (byte / uint2 / real)

Eingabebild.

SigmaGradSigmaGradSigmaGradSigmaGradsigmaGrad (input_control)  number HTupleHTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Stärke der Glättung zur Berechnung des Gradienten. Für SmoothingSmoothingSmoothingSmoothingsmoothing = 'mean' wird SigmaGradSigmaGradSigmaGradSigmaGradsigmaGrad 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 SigmaGrad SigmaGrad SigmaGrad sigmaGrad ≤ 50.0

Empfohlene Schrittweite: 0.1

Restriktion: SigmaGrad > 0.0

SigmaIntSigmaIntSigmaIntSigmaIntsigmaInt (input_control)  number HTupleHTupleHtuple (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

Typischer Wertebereich: 0.7 ≤ SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt ≤ 50.0

Empfohlene Schrittweite: 0.1

Restriktion: SigmaInt > 0.0

SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPoints (input_control)  number HTupleHTupleHtuple (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

Typischer Wertebereich: 0.7 ≤ SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints ≤ 50.0

Empfohlene Schrittweite: 0.1

Restriktion: SigmaPoints >= SigmaInt && SigmaPoints > 0.6

ThreshInhomThreshInhomThreshInhomThreshInhomthreshInhom (input_control)  number HTupleHTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Schwellwert zur Bestimmung inhomogener Bildbereiche.

Defaultwert: 200

Wertevorschläge: 50, 100, 200, 500, 1000

Restriktion: ThreshInhom >= 0.0

ThreshShapeThreshShapeThreshShapeThreshShapethreshShape (input_control)  real HTupleHTupleHtuple (real) (double) (double) (double)

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 ≤ 1

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 0.1

Restriktion: 0.0 <= ThreshShape && ThreshShape <= 1.0

SmoothingSmoothingSmoothingSmoothingsmoothing (input_control)  string HTupleHTupleHtuple (string) (string) (HString) (char*)

Verwendetes Glättungsverfahren.

Defaultwert: 'gauss' "gauss" "gauss" "gauss" "gauss"

Werteliste: 'gauss'"gauss""gauss""gauss""gauss", 'mean'"mean""mean""mean""mean"

EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoublets (input_control)  string HTupleHTupleHtuple (string) (string) (HString) (char*)

Beseitigung mehrfach erkannter Punkte.

Defaultwert: 'false' "false" "false" "false" "false"

Werteliste: 'false'"false""false""false""false", 'true'"true""true""true""true"

RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctions (output_control)  point.y-array HTupleHTupleHtuple (real) (double) (double) (double)

Zeilenkoordinaten der gefundenen Kreuzungspunkte.

ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctions (output_control)  point.x-array HTupleHTupleHtuple (real) (double) (double) (double)

Spaltenkoordinaten der gefundenen Kreuzungspunkte.

CoRRJunctionsCoRRJunctionsCoRRJunctionsCoRRJunctionscoRRJunctions (output_control)  number-array HTupleHTupleHtuple (real) (double) (double) (double)

Zeilenanteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.

CoRCJunctionsCoRCJunctionsCoRCJunctionsCoRCJunctionscoRCJunctions (output_control)  number-array HTupleHTupleHtuple (real) (double) (double) (double)

Gemischter Anteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.

CoCCJunctionsCoCCJunctionsCoCCJunctionsCoCCJunctionscoCCJunctions (output_control)  number-array HTupleHTupleHtuple (real) (double) (double) (double)

Spaltenanteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.

RowAreaRowAreaRowAreaRowArearowArea (output_control)  point.y-array HTupleHTupleHtuple (real) (double) (double) (double)

Zeilenkoordinaten der gefundenen Flächenpunkte.

ColumnAreaColumnAreaColumnAreaColumnAreacolumnArea (output_control)  point.x-array HTupleHTupleHtuple (real) (double) (double) (double)

Spaltenkoordinaten der gefundenen Flächenpunkte.

CoRRAreaCoRRAreaCoRRAreaCoRRAreacoRRArea (output_control)  number-array HTupleHTupleHtuple (real) (double) (double) (double)

Zeilenanteil der Kovarianzmatrix der gefundenen Flächenpunkte.

CoRCAreaCoRCAreaCoRCAreaCoRCAreacoRCArea (output_control)  number-array HTupleHTupleHtuple (real) (double) (double) (double)

Gemischter Anteil der Kovarianzmatrix der gefundenen Flächenpunkte.

CoCCAreaCoCCAreaCoCCAreaCoCCAreacoCCArea (output_control)  number-array HTupleHTupleHtuple (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_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstner 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>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Nachfolger

gen_cross_contour_xldgen_cross_contour_xldGenCrossContourXldGenCrossContourXldGenCrossContourXld, disp_crossdisp_crossDispCrossDispCrossDispCross

Alternativen

points_harrispoints_harrisPointsHarrisPointsHarrisPointsHarris, points_lepetitpoints_lepetitPointsLepetitPointsLepetitPointsLepetit, points_harris_binomialpoints_harris_binomialPointsHarrisBinomialPointsHarrisBinomialPointsHarrisBinomial

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