points_foerstner T_points_foerstner PointsFoerstner PointsFoerstner points_foerstner (Operator)
Name
points_foerstner T_points_foerstner PointsFoerstner PointsFoerstner points_foerstner
— Detect points of interest using the Förstner operator.
Signature
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]]
Description
points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner points_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
Smoothing Smoothing Smoothing Smoothing smoothing smoothing
is 'gauss' "gauss" "gauss" "gauss" "gauss" "gauss" , the derivatives are computed with
Gaussian derivatives of size SigmaGrad SigmaGrad SigmaGrad SigmaGrad sigmaGrad sigma_grad
and the smoothing is
performed by a Gaussian of size SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_int
. If Smoothing Smoothing Smoothing Smoothing smoothing smoothing
is 'mean' "mean" "mean" "mean" "mean" "mean" , the derivatives are computed with a
3 x 3 Sobel filter (and hence SigmaGrad SigmaGrad SigmaGrad SigmaGrad sigmaGrad sigma_grad
is ignored)
and the smoothing is performed by a SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_int
x SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_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 ThreshInhom ThreshInhom ThreshInhom ThreshInhom threshInhom thresh_inhom
and at the
same time an isotropy greater or equal to ThreshShape ThreshShape ThreshShape ThreshShape threshShape thresh_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 Smoothing Smoothing Smoothing Smoothing smoothing smoothing
is 'gauss' "gauss" "gauss" "gauss" "gauss" "gauss" , the averaging is
performed by a Gaussian of size SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points
, if Smoothing Smoothing Smoothing Smoothing smoothing smoothing
is 'mean' "mean" "mean" "mean" "mean" "mean" , the averaging is performed by a SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points
x SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points
mean filter. The local minima of the optimization
functions determine the extracted points. Their subpixel precise position is
returned in (RowJunctions RowJunctions RowJunctions RowJunctions rowJunctions row_junctions
, ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions columnJunctions column_junctions
) and
(RowArea RowArea RowArea RowArea rowArea row_area
, ColumnArea ColumnArea ColumnArea ColumnArea columnArea column_area
).
In addition to their position, for each extracted point the elements
CoRRJunctions CoRRJunctions CoRRJunctions CoRRJunctions coRRJunctions co_rrjunctions
, CoRCJunctions CoRCJunctions CoRCJunctions CoRCJunctions coRCJunctions co_rcjunctions
, and CoCCJunctions CoCCJunctions CoCCJunctions CoCCJunctions coCCJunctions co_ccjunctions
(and CoRRArea CoRRArea CoRRArea CoRRArea coRRArea co_rrarea
, CoRCArea CoRCArea CoRCArea CoRCArea coRCArea co_rcarea
, and CoCCArea CoCCArea CoCCArea CoCCArea coCCArea co_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 intensity intensity Intensity Intensity Intensity intensity
to homogeneous image regions or
plane_deviation plane_deviation PlaneDeviation PlaneDeviation PlaneDeviation plane_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 EliminateDoublets EliminateDoublets EliminateDoublets EliminateDoublets eliminateDoublets eliminate_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
EliminateDoublets EliminateDoublets EliminateDoublets EliminateDoublets eliminateDoublets eliminate_doublets
is 'false' "false" "false" "false" "false" "false" , every detected point is
returned.
Attention
Note that only odd values for SigmaInt SigmaInt SigmaInt SigmaInt sigmaInt sigma_int
and
SigmaPoints SigmaPoints SigmaPoints SigmaPoints sigmaPoints sigma_points
are allowed, if Smoothing Smoothing Smoothing Smoothing smoothing smoothing
is
'mean' "mean" "mean" "mean" "mean" "mean" . Even values automatically will be replaced by the
next larger odd value.
points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner points_foerstner
with Smoothing Smoothing Smoothing Smoothing smoothing smoothing
= '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 RowJunctions RowJunctions RowJunctions RowJunctions rowJunctions row_junctions
and
ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions columnJunctions column_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_system set_system SetSystem SetSystem SetSystem set_system
) before you call
points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner points_foerstner
. This way points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner points_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.
Note that filter operators may return unexpected results if
an image with a reduced domain is used as input. Please refer to the
chapter Filters .
Execution Information
Multithreading type: reentrant (runs in parallel with non-exclusive operators).
Multithreading scope: global (may be called from any thread).
Automatically parallelized on internal data level.
Parameters
Image Image Image Image image image
(input_object) (multichannel-)image →
object HImage HObject HImage Hobject (byte / uint2 / real)
Input image.
SigmaGrad SigmaGrad SigmaGrad SigmaGrad sigmaGrad sigma_grad
(input_control) number →
HTuple Union[float, int] HTuple Htuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)
Amount of smoothing used for the calculation of the
gradient. If Smoothing Smoothing Smoothing Smoothing smoothing smoothing
is 'mean',
SigmaGrad SigmaGrad SigmaGrad SigmaGrad sigmaGrad sigma_grad
is ignored.
Default value: 1.0
Suggested values: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0
Typical range of values: 0.7
≤
SigmaGrad
SigmaGrad
SigmaGrad
SigmaGrad
sigmaGrad
sigma_grad
≤
50.0
Recommended increment: 0.1
Restriction: SigmaGrad > 0.0
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)
Amount of smoothing used for the integration of the
gradients.
Default value: 2.0
Suggested values: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0
Typical range of values: 0.7
≤
SigmaInt
SigmaInt
SigmaInt
SigmaInt
sigmaInt
sigma_int
≤
50.0
Recommended increment: 0.1
Restriction: SigmaInt > 0.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)
Amount of smoothing used in the optimization
functions.
Default value: 3.0
Suggested values: 0.7, 0.8, 0.9, 1.0, 1.2, 1.5, 2.0, 3.0
Typical range of values: 0.7
≤
SigmaPoints
SigmaPoints
SigmaPoints
SigmaPoints
sigmaPoints
sigma_points
≤
50.0
Recommended increment: 0.1
Restriction: 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)
Threshold for the segmentation of inhomogeneous image
areas.
Default value: 200
Suggested values: 50, 100, 200, 500, 1000
Restriction: ThreshInhom >= 0.0
ThreshShape ThreshShape ThreshShape ThreshShape threshShape thresh_shape
(input_control) real →
HTuple float HTuple Htuple (real) (double ) (double ) (double )
Threshold for the segmentation of point areas.
Default value: 0.3
Suggested values: 0.1, 0.2, 0.3, 0.4, 0.5, 0.7
Typical range of values: 0.01
≤
ThreshShape
ThreshShape
ThreshShape
ThreshShape
threshShape
thresh_shape
≤
1
Minimum increment: 0.01
Recommended increment: 0.1
Restriction: 0.0 <= ThreshShape && ThreshShape <= 1.0
Smoothing Smoothing Smoothing Smoothing smoothing smoothing
(input_control) string →
HTuple str HTuple Htuple (string) (string ) (HString ) (char* )
Used smoothing method.
Default value:
'gauss'
"gauss"
"gauss"
"gauss"
"gauss"
"gauss"
List of values: '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* )
Elimination of multiply detected points.
Default value:
'false'
"false"
"false"
"false"
"false"
"false"
List of values: '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 )
Row coordinates of the detected junction points.
ColumnJunctions ColumnJunctions ColumnJunctions ColumnJunctions columnJunctions column_junctions
(output_control) point.x-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Column coordinates of the detected junction points.
CoRRJunctions CoRRJunctions CoRRJunctions CoRRJunctions coRRJunctions co_rrjunctions
(output_control) number-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Row part of the covariance matrix of the detected
junction points.
CoRCJunctions CoRCJunctions CoRCJunctions CoRCJunctions coRCJunctions co_rcjunctions
(output_control) number-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Mixed part of the covariance matrix of the detected
junction points.
CoCCJunctions CoCCJunctions CoCCJunctions CoCCJunctions coCCJunctions co_ccjunctions
(output_control) number-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Column part of the covariance matrix of the detected
junction points.
RowArea RowArea RowArea RowArea rowArea row_area
(output_control) point.y-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Row coordinates of the detected area points.
ColumnArea ColumnArea ColumnArea ColumnArea columnArea column_area
(output_control) point.x-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Column coordinates of the detected area points.
CoRRArea CoRRArea CoRRArea CoRRArea coRRArea co_rrarea
(output_control) number-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Row part of the covariance matrix of the detected
area points.
CoRCArea CoRCArea CoRCArea CoRCArea coRCArea co_rcarea
(output_control) number-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Mixed part of the covariance matrix of the detected
area points.
CoCCArea CoCCArea CoCCArea CoCCArea coCCArea co_ccarea
(output_control) number-array →
HTuple Sequence[float] HTuple Htuple (real) (double ) (double ) (double )
Column part of the covariance matrix of the detected
area points.
Result
points_foerstner points_foerstner PointsFoerstner PointsFoerstner PointsFoerstner points_foerstner
returns TRUE if all parameters are correct
and no error occurs during the execution. If the input is empty the
behavior can be set via
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>)
. If necessary, an
exception is raised.
Possible Successors
gen_cross_contour_xld gen_cross_contour_xld GenCrossContourXld GenCrossContourXld GenCrossContourXld gen_cross_contour_xld
,
disp_cross disp_cross DispCross DispCross DispCross disp_cross
Alternatives
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
References
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.
Module
Foundation