points_foerstnerT_points_foerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner (算子)

名称

points_foerstnerT_points_foerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner — 使用福斯特纳(Förstner)算子检测兴趣点。

签名

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   ( Windows only)

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]]

描述

points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner extracts significant points from an image. Significant points are points that differ from their neighborhood, i.e., points where the image function changes in two dimensions. These changes occur on the one hand at the intersection of image edges (called junction points), and on the other hand at places where color or brightness differs from the surrounding neighborhood (called area points).

The point extraction takes place in two steps: In the first step the point regions, i.e., the inhomogeneous, isotropic regions, are extracted from the image. To do so, the smoothed matrix is calculated, where and are the first derivatives of each image channel and S stands for a smoothing. If SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing is 'gauss'"gauss""gauss""gauss""gauss""gauss", the derivatives are computed with Gaussian derivatives of size SigmaGradSigmaGradSigmaGradSigmaGradsigmaGradsigma_grad and the smoothing is performed by a Gaussian of size SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_int. If SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing is 'mean'"mean""mean""mean""mean""mean", the derivatives are computed with a 3 x 3 Sobel filter (and hence SigmaGradSigmaGradSigmaGradSigmaGradsigmaGradsigma_grad is ignored) and the smoothing is performed by a SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_int x SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_int mean filter. Then inhomogeneity = Trace(M) is the degree of inhomogeneity in the image and is the degree of the isotropy of the texture in the image. Image points that have an inhomogeneity greater or equal to ThreshInhomThreshInhomThreshInhomThreshInhomthreshInhomthresh_inhom and at the same time an isotropy greater or equal to ThreshShapeThreshShapeThreshShapeThreshShapethreshShapethresh_shape are subsequently examined further.

In the second step, two optimization functions are calculated for the resulting points. Essentially, these optimization functions average for each point the distances to the edge directions (for junction points) and the gradient directions (for area points) within an observation window around the point. If SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing is 'gauss'"gauss""gauss""gauss""gauss""gauss", the averaging is performed by a Gaussian of size SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points, if SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing is 'mean'"mean""mean""mean""mean""mean", the averaging is performed by a SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points x SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points mean filter. The local minima of the optimization functions determine the extracted points. Their subpixel precise position is returned in (RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctionsrow_junctions, ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctionscolumn_junctions) and (RowAreaRowAreaRowAreaRowArearowArearow_area, ColumnAreaColumnAreaColumnAreaColumnAreacolumnAreacolumn_area).

In addition to their position, for each extracted point the elements CoRRJunctionsCoRRJunctionsCoRRJunctionsCoRRJunctionscoRRJunctionsco_rrjunctions, CoRCJunctionsCoRCJunctionsCoRCJunctionsCoRCJunctionscoRCJunctionsco_rcjunctions, and CoCCJunctionsCoCCJunctionsCoCCJunctionsCoCCJunctionscoCCJunctionsco_ccjunctions (and CoRRAreaCoRRAreaCoRRAreaCoRRAreacoRRAreaco_rrarea, CoRCAreaCoRCAreaCoRCAreaCoRCAreacoRCAreaco_rcarea, and CoCCAreaCoCCAreaCoCCAreaCoCCAreacoCCAreaco_ccarea, respectively) of the corresponding covariance matrix are returned. This matrix facilitates conclusions about the precision of the calculated point position. To obtain the actual values, it is necessary to estimate the amount of noise in the input image and to multiply all components of the covariance matrix with the variance of the noise. (To estimate the amount of noise, apply intensityintensityIntensityIntensityIntensityintensity to homogeneous image regions or plane_deviationplane_deviationPlaneDeviationPlaneDeviationPlaneDeviationplane_deviation to image regions, where the gray values form a plane. In both cases the amount of noise is returned in the parameter Deviation.) This is illustrated by the example program points_foerstner_ellipses.hdev.

It lies in the nature of this operator that corners often result in two distinct points: One junction point, where the edges of the corner actually meet, and one area point inside the corner. Such doublets will be eliminated automatically, if EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoubletseliminate_doublets is 'true'"true""true""true""true""true". To do so, each pair of one junction point and one area point is examined. If the points lie within each others' observation window of the optimization function, for both points the precision of the point position is calculated and the point with the lower precision is rejected. If EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoubletseliminate_doublets is 'false'"false""false""false""false""false", every detected point is returned.

注意

Note that only odd values for SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_int and SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points are allowed, if SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing is 'mean'"mean""mean""mean""mean""mean". Even values automatically will be replaced by the next larger odd value.

points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner with SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing = 'gauss'"gauss""gauss""gauss""gauss""gauss" uses a special implementation that is optimized using SSE2 instructions if the system parameter 'sse2_enable'"sse2_enable""sse2_enable""sse2_enable""sse2_enable""sse2_enable" is set to 'true'"true""true""true""true""true" (which is default if SSE2 is available on your machine). This implementation is slightly inaccurate compared to the pure C version due to numerical issues (for 'byte' images the difference in RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctionsrow_junctions and ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctionscolumn_junctions is in order of magnitude of 1.0e-5). If you prefer accuracy over performance you can set 'sse2_enable'"sse2_enable""sse2_enable""sse2_enable""sse2_enable""sse2_enable" to 'false'"false""false""false""false""false" (using set_systemset_systemSetSystemSetSystemSetSystemset_system) before you call points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner. This way points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner does not use SSE2 accelerations. Don't forget to set 'sse2_enable'"sse2_enable""sse2_enable""sse2_enable""sse2_enable""sse2_enable" back to 'true'"true""true""true""true""true" afterwards.

请注意,若使用域缩减后的图像作为输入,滤波器算子可能会返回意外结果。请参阅 滤波器 一章

执行信息

参数

ImageImageImageImageimageimage (输入对象)  (multichannel-)image objectHImageHObjectHImageHobject (byte / uint2 / real)

输入图像。

SigmaGradSigmaGradSigmaGradSigmaGradsigmaGradsigma_grad (输入控制)  number HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Amount of smoothing used for the calculation of the gradient. If SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing is 'mean', SigmaGradSigmaGradSigmaGradSigmaGradsigmaGradsigma_grad is ignored.

默认值: 1.0

建议值: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0

值范围: 0.0 ≤ SigmaGrad SigmaGrad SigmaGrad SigmaGrad sigmaGrad sigma_grad

建议增量: 0.1

SigmaIntSigmaIntSigmaIntSigmaIntsigmaIntsigma_int (输入控制)  number HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Amount of smoothing used for the integration of the gradients.

默认值: 2.0

建议值: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0

建议增量: 0.1

限制: SigmaInt > 0

SigmaPointsSigmaPointsSigmaPointsSigmaPointssigmaPointssigma_points (输入控制)  number HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Amount of smoothing used in the optimization functions.

默认值: 3.0

建议值: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0

建议增量: 0.1

限制: SigmaPoints >= SigmaInt && SigmaPoints > 0.6

ThreshInhomThreshInhomThreshInhomThreshInhomthreshInhomthresh_inhom (输入控制)  number HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Threshold for the segmentation of inhomogeneous image areas.

默认值: 200

建议值: 50, 100, 200, 500, 1000

值范围: 0.0 ≤ ThreshInhom ThreshInhom ThreshInhom ThreshInhom threshInhom thresh_inhom

ThreshShapeThreshShapeThreshShapeThreshShapethreshShapethresh_shape (输入控制)  real HTuplefloatHTupleHtuple (real) (double) (double) (double)

Threshold for the segmentation of point areas.

默认值: 0.3

建议值: 0.1, 0.2, 0.3, 0.4, 0.5, 0.7

值范围: 0.01 ≤ ThreshShape ThreshShape ThreshShape ThreshShape threshShape thresh_shape ≤ 1

最小增量: 0.01

建议增量: 0.1

SmoothingSmoothingSmoothingSmoothingsmoothingsmoothing (输入控制)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Used smoothing method.

默认值: 'gauss' "gauss" "gauss" "gauss" "gauss" "gauss"

值列表: 'gauss'"gauss""gauss""gauss""gauss""gauss", 'mean'"mean""mean""mean""mean""mean"

EliminateDoubletsEliminateDoubletsEliminateDoubletsEliminateDoubletseliminateDoubletseliminate_doublets (输入控制)  string HTuplestrHTupleHtuple (string) (string) (HString) (char*)

Elimination of multiply detected points.

默认值: 'false' "false" "false" "false" "false" "false"

值列表: 'false'"false""false""false""false""false", 'true'"true""true""true""true""true"

RowJunctionsRowJunctionsRowJunctionsRowJunctionsrowJunctionsrow_junctions (输出控制)  point.y-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Row coordinates of the detected junction points.

ColumnJunctionsColumnJunctionsColumnJunctionsColumnJunctionscolumnJunctionscolumn_junctions (输出控制)  point.x-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Column coordinates of the detected junction points.

CoRRJunctionsCoRRJunctionsCoRRJunctionsCoRRJunctionscoRRJunctionsco_rrjunctions (输出控制)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Row part of the covariance matrix of the detected junction points.

CoRCJunctionsCoRCJunctionsCoRCJunctionsCoRCJunctionscoRCJunctionsco_rcjunctions (输出控制)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Mixed part of the covariance matrix of the detected junction points.

CoCCJunctionsCoCCJunctionsCoCCJunctionsCoCCJunctionscoCCJunctionsco_ccjunctions (输出控制)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Column part of the covariance matrix of the detected junction points.

RowAreaRowAreaRowAreaRowArearowArearow_area (输出控制)  point.y-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Row coordinates of the detected area points.

ColumnAreaColumnAreaColumnAreaColumnAreacolumnAreacolumn_area (输出控制)  point.x-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Column coordinates of the detected area points.

CoRRAreaCoRRAreaCoRRAreaCoRRAreacoRRAreaco_rrarea (输出控制)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Row part of the covariance matrix of the detected area points.

CoRCAreaCoRCAreaCoRCAreaCoRCAreacoRCAreaco_rcarea (输出控制)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Mixed part of the covariance matrix of the detected area points.

CoCCAreaCoCCAreaCoCCAreaCoCCAreacoCCAreaco_ccarea (输出控制)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Column part of the covariance matrix of the detected area points.

结果

points_foerstnerpoints_foerstnerPointsFoerstnerPointsFoerstnerPointsFoerstnerpoints_foerstner returns 2 ( H_MSG_TRUE) if all parameters are correct and no error occurs during the execution. 如果输入为空则可设置行为通过 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>)。如有必要,则抛出异常。

可能的后继

gen_cross_contour_xldgen_cross_contour_xldGenCrossContourXldGenCrossContourXldGenCrossContourXldgen_cross_contour_xld, disp_crossdisp_crossDispCrossDispCrossDispCrossdisp_cross

替代

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

模块

基础