points_foerstnerT_points_foerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner (Operator)

Name

points_foerstnerT_points_foerstnerPointsFoerstnerPointsFoerstnerpoints_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_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_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 SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing auf 'gauss'"gauss""gauss""gauss""gauss""gauss" gesetzt, dann werden die Ableitungen mit einem Gaußfilter der Größe SigmaGradSigmaGradSigmaGradSigmaGradsigmaGradsigma_grad berechnet und die Glättung erfolgt durch einen Gaußfilter der Größe SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_int. Wird SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing auf 'mean'"mean""mean""mean""mean""mean" gesetzt, werden die Ableitungen mit einem 3 x 3 Sobelfilter berechnet (SigmaGradSigmaGradSigmaGradSigmaGradsigmaGradsigma_grad wird ignoriert) und die Glättung erfolgt durch einen SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_int x SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_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 ThreshInhomThreshInhomThreshInhomThreshInhomthreshInhomthresh_inhom und deren Isotropie gleichzeitig größer oder gleich ThreshShapeThreshShapeThreshShapeThreshShapethreshShapethresh_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 SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing = 'gauss'"gauss""gauss""gauss""gauss""gauss" erfolgt die Durchschnittsbildung mit einem Gaußfilter der Größe SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points. Für SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing = 'mean'"mean""mean""mean""mean""mean" erfolgt die Durchschnittsbildung mit einem SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points x SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points Mittelwertfilter. Die lokalen Minima der Optimierungsfunktionen ergeben die signifikanten Punkte. Ihre Position wird subpixelgenau in (RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctionsrow_junctions, ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctionscolumn_junctions) und (RowAreaRowAreaRowAreaRowArearowArearow_area, ColumnAreaColumnAreaColumnAreaColumnAreacolumnAreacolumn_area) zurückgegeben.

Neben der Position werden für jeden gefundenen Punkt auch die Elemente CoRRJunctionsCoRRJunctionsCoRRJunctionsCoRRJunctionscoRRJunctionsco_rrjunctions, CoRCJunctionsCoRCJunctionsCoRCJunctionsCoRCJunctionscoRCJunctionsco_rcjunctions und CoCCJunctionsCoCCJunctionsCoCCJunctionsCoCCJunctionscoCCJunctionsco_ccjunctions (bzw. CoRRAreaCoRRAreaCoRRAreaCoRRAreacoRRAreaco_rrarea, CoRCAreaCoRCAreaCoRCAreaCoRCAreacoRCAreaco_rcarea und CoCCAreaCoCCAreaCoCCAreaCoCCAreacoCCAreaco_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 intensityintensityIntensityIntensityIntensityintensity oder auf Bildbereiche mit einem rampenförmigen Grauwertverlauf plane_deviationplane_deviationPlaneDeviationPlaneDeviationPlaneDeviationplane_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 EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoubletseliminate_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 EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoubletseliminate_doublets 'false'"false""false""false""false""false", so werden alle gefundenen Punkte zurückgegeben.

Achtung

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

points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner mit SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing = '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 RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctionsrow_junctions und ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctionscolumn_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_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner aufrufen. Dadurch verwendet points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_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

Parameter

ImageImageImageImageimageimage (input_object)  (multichannel-)image objectHImageHObjectHImageHobject (byte / uint2 / real)

Eingabebild.

SigmaGradSigmaGradSigmaGradSigmaGradsigmaGradsigma_grad (input_control)  number HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

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

Empfohlene Schrittweite: 0.1

SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_int (input_control)  number HTupleUnion[float, int]HTupleHtuple (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

SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points (input_control)  number HTupleUnion[float, int]HTupleHtuple (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

ThreshInhomThreshInhomThreshInhomThreshInhomthreshInhomthresh_inhom (input_control)  number HTupleUnion[float, int]HTupleHtuple (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

ThreshShapeThreshShapeThreshShapeThreshShapethreshShapethresh_shape (input_control)  real HTuplefloatHTupleHtuple (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

SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing (input_control)  string HTuplestrHTupleHtuple (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"

EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoubletseliminate_doublets (input_control)  string HTuplestrHTupleHtuple (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"

RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctionsrow_junctions (output_control)  point.y-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Zeilenkoordinaten der gefundenen Kreuzungspunkte.

ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctionscolumn_junctions (output_control)  point.x-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Spaltenkoordinaten der gefundenen Kreuzungspunkte.

CoRRJunctionsCoRRJunctionsCoRRJunctionsCoRRJunctionscoRRJunctionsco_rrjunctions (output_control)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Zeilenanteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.

CoRCJunctionsCoRCJunctionsCoRCJunctionsCoRCJunctionscoRCJunctionsco_rcjunctions (output_control)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Gemischter Anteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.

CoCCJunctionsCoCCJunctionsCoCCJunctionsCoCCJunctionscoCCJunctionsco_ccjunctions (output_control)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Spaltenanteil der Kovarianzmatrix der gefundenen Kreuzungspunkte.

RowAreaRowAreaRowAreaRowArearowArearow_area (output_control)  point.y-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Zeilenkoordinaten der gefundenen Flächenpunkte.

ColumnAreaColumnAreaColumnAreaColumnAreacolumnAreacolumn_area (output_control)  point.x-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Spaltenkoordinaten der gefundenen Flächenpunkte.

CoRRAreaCoRRAreaCoRRAreaCoRRAreacoRRAreaco_rrarea (output_control)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Zeilenanteil der Kovarianzmatrix der gefundenen Flächenpunkte.

CoRCAreaCoRCAreaCoRCAreaCoRCAreacoRCAreaco_rcarea (output_control)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Gemischter Anteil der Kovarianzmatrix der gefundenen Flächenpunkte.

CoCCAreaCoCCAreaCoCCAreaCoCCAreacoCCAreaco_ccarea (output_control)  number-array HTupleSequence[float]HTupleHtuple (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_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_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_xldgen_cross_contour_xldGenCrossContourXldGenCrossContourXldGenCrossContourXldgen_cross_contour_xld, disp_crossdisp_crossDispCrossDispCrossDispCrossdisp_cross

Alternativen

points_harrispoints_harrisPointsHarrisPointsHarrisPointsHarrispoints_harris, points_lepetitpoints_lepetitPointsLepetitPointsLepetitPointsLepetitpoints_lepetit, points_harris_binomialpoints_harris_binomialPointsHarrisBinomialPointsHarrisBinomialPointsHarrisBinomialpoints_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