ImageDev

- Getting Started
- ImageDev Python
- ImageDev C#
- ImageDev C++
- Licensing Information
- Redistributable Files
- Processing
- Image Manipulation
- - Synthetic Images
  - - RandomImage2d
    - RandomImage3d
    - RandomGaussianImage2d
    - RandomGaussianImage3d
    - RadialFunctionImage2d
    - RadialFunctionImage3d
    - OrientedLinesImage2d
    - OrientedLinesImage3d
    - RandomSphereImage3d
    - BoxGridImage2d
    - BoxGridImage3d
    - WedgeMaskImage3d
    - PointSpreadFunctionImage3d
  - Image Editing
  - - ConvertImage
    - ResetImage
    - CopyImage
    - PasteImage2d
    - PasteImage3d
    - CropImage2d
    - CropImage3d
    - SampleImage2d
    - SampleImage3d
    - InterlaceFrames2d
    - DeinterlaceFrames2d
  - Stack Operations
  - - SequenceConcatenation
    - SequenceToMultispectral
    - SequenceToVolume
    - VolumeToSequence
    - MultispectralToSequence
    - GetSliceFromVolume3d
    - SetSliceToVolume3d
    - GetObliqueSliceFromVolume3d
    - ImageStackProjection3d
    - VolumeProjection3d
- Geometry And Matching
- - Geometric Transforms
  - - Shearing3d
    - TranslateImage2d
    - TranslateImage3d
    - Flip2d
    - Flip3d
    - FlipImage2d
    - FlipImage3d
    - TransposeImage2d
    - TransposeImage3d
    - SwapQuadrants
    - Rotate2d
    - Rotate3d
    - RotationGenerator3d
    - Resize2d
    - Resize3d
    - RescaleByFactor
    - RescaleImageByFactor
    - ResampleAffine2d
    - ResampleAffine3d
    - ResampleElastic2d
    - SurfaceUnfolding3d
  - Pattern Recognition
  - - BinaryCorrelation2d
    - CrossCorrelation2d
    - CorrelationByDifference2d
    - CorrelationBySignChange2d
  - Registration
  - - ImagePrealignment3d
    - AffineRegistration
    - ElasticRegistration2d
- Arithmetic And Logic
- - Arithmetical Operations
  - - AbsoluteValue
    - AbsoluteMaximumWithImage
    - ArithmeticOperationWithImage
    - ArithmeticOperationWithValue
    - BlendWithImage
    - BlendWithValue
    - DirectionalBlending2d
    - CombineByMask
    - ImageFormula
    - EigenDecomposition2d
    - EigenDecomposition3d
  - Logical Operations
  - - MaskImage
    - LogicalOperationWithImage
    - LogicalOperationWithValue
    - LogicalNot
    - InvertImage
    - BitShift
- Image Filtering
- - Grayscale Transforms
  - - RescaleIntensity
    - StackRescaleIntensity
    - MatchContrast
    - HistogramEqualization
    - Clahe2d
    - Clahe3d
    - AdaptiveHistogramEqualization
    - ApplyGrayscaleLut
    - BackgroundImage2d
    - RadialBackgroundImage2d
    - ShadingCorrection
    - Exponential
    - Logarithm
    - Square
    - SquareRoot
    - RingArtifactRemoval3d
    - BeamHardeningCorrection3d
  - Color Transforms
  - - ColorToLightness
    - GetColorChannel
    - ColorToGrayscale
    - GrayscaleToColor
    - ColorSpaceConversion
    - ColorAntialiasing2d
    - BayerToRgb2d
    - DecorrelationStretch2d
    - BlendAlphaChannelWithImage
    - BlendAlphaChannelWithValue
  - Smoothing And Denoising
  - - BoxFilter2d
    - BoxFilter3d
    - MedianFilter2d
    - MedianFilter3d
    - GaussianFilter2d
    - GaussianFilter3d
    - ExponentialFilter2d
    - RecursiveExponentialFilter2d
    - RecursiveExponentialFilter3d
    - NonLocalMeansFilter2d
    - NonLocalMeansFilter3d
    - CurvatureDrivenDiffusion
    - BilateralFilter2d
    - BilateralFilter3d
    - MajorityFilter2d
    - MajorityFilter3d
    - SigmaFilter2d
    - SigmaFilter3d
    - Despeckle2d
    - Despeckle3d
    - NagaoFilter2d
    - NagaoFilter3d
    - SnnFilter2d
    - SnnFilter3d
    - FlowInpainting
  - Sharpening
  - - Deblurring2d
    - Delineate2d
    - Delineate3d
    - UnsharpMasking2d
    - UnsharpMasking3d
    - Shade2d
    - RichardsonLucyDeconvolution
  - Texture Filters
  - - MeanFilter2d
    - MeanFilter3d
    - VarianceFilter2d
    - VarianceFilter3d
    - SkewnessFilter2d
    - SkewnessFilter3d
    - KurtosisFilter2d
    - KurtosisFilter3d
    - ContrastFilter2d
    - ContrastFilter3d
    - VariationFilter2d
    - VariationFilter3d
    - EnergyFilter2d
    - EnergyFilter3d
    - EntropyFilter2d
    - EntropyFilter3d
    - AutocorrelationFilter
    - LocalAutocorrelationFilter2d
    - ImageCurvature2d
    - ImageCurvature3d
    - StructureEnhancementFilter2d
    - StructureEnhancementFilter3d
    - ScaleSpaceLogFilter2d
    - ScaleSpaceLogFilter3d
  - Frequency Domain
  - - ComplexFft
    - ComplexFftInverse
    - ComplexCenteredFft
    - ComplexCenteredFftInverse
    - CartesianToPolar2d
    - PolarToCartesian2d
    - ConvolutionWithImage
    - ConvolutionWithImage2d
    - RadialFrequencyFilter2d
    - GaborFiltering2d
- Edge Detection
- - Gradient
  - - GradientOperator2d
    - GradientOperator3d
    - VectorToMagnitude2d
    - VectorToMagnitude3d
    - GradientVector2d
    - GradientVector3d
    - GradientMagnitude2d
    - GradientMagnitude3d
    - MorphologicalGradient2d
    - MorphologicalGradient3d
    - RadialGradientCentered2d
    - RadialGradientCentered3d
    - RadialGradientContour2d
    - RadialGradientContour3d
    - RadialGradientLabel2d
    - RadialGradientLabel3d
  - Laplacian
  - - DobFilter2d
    - DobFilter3d
    - MorphologicalLaplacian
    - RecursiveLaplacian2d
    - RecursiveLaplacian3d
  - Other Derivatives
  - - GaussianDerivative2d
    - GaussianDerivative3d
    - GaussianHessianMatrix2d
    - GaussianHessianMatrix3d
    - GaussianGradientTensor2d
    - GaussianGradientTensor3d
  - Edge Marking
  - - ImageLocalMaxima2d
    - ImageLocalMaxima3d
    - RidgeDetection
    - ZeroCrossings2d
    - DijkstraShortestPath2d
    - EigenvaluesToStructureness2d
    - EigenvaluesToStructureness3d
    - TensorVoting2d
    - CannyEdgeDetector2d
    - CannyEdgeDetector3d
- Image Segmentation
- - Binarization
  - - Thresholding
    - ThresholdingByCriterion
    - AutoThresholdingBright
    - AutoThresholdingDark
    - ColorThresholding
    - TopHat
    - FeatureAdaptiveThresholding
    - AdaptiveThresholding2d
    - AdaptiveThresholding3d
    - HysteresisThresholding
  - Labeling
  - - Labeling2d
    - Labeling3d
    - ReorderLabels
    - AssignLabel
    - AddObjectToLabel
    - GroupCloseLabelsl2d
  - Feature Selection
  - - KillBorder2d
    - KillBorder3d
    - RemoveSmallSpots
    - ObjectBoundaries
    - BinarySmoothing2d
    - BinarySmoothing3d
    - LabelInterfaces
  - Separating And Filling
  - - FillHoles2d
    - FillHoles3d
    - RemoveSmallHoles
    - FillImageBorder3d
    - ExpandLabelBoundaries
    - SeparateObjects
    - HExtremaWatershed
    - SeparateObjectsByBlock
    - HExtremaWatershedByBlock
    - ConvexHull2d
  - Region Growing
  - - MarkerBasedWatershed2d
    - MarkerBasedWatershed3d
    - MarkerBasedWatershedByBlock
    - MarkerBasedWatershedBasinsByBlock
    - ExpandLabelsOnBackground
    - FloodFillThreshold2d
    - FloodFillThreshold3d
    - Waterpixel
  - Computational Geometry
  - - PolylineResampler2d
    - PolylineResampler3d
    - PolylineExtrusion3d
    - SurfaceFitting3d
- Mathematical Morphology
- - Erosion And Dilation
  - - Erosion2d
    - Erosion3d
    - Dilation2d
    - Dilation3d
    - ErosionDisk2d
    - ErosionDisk3d
    - ErosionBall3d
    - DilationDisk2d
    - DilationDisk3d
    - DilationBall3d
    - ErosionLine2d
    - ErosionLine3d
    - DilationLine2d
    - DilationLine3d
    - ErosionColor2d
    - DilationColor2d
    - SelectiveErosion2d
    - SelectiveErosion3d
    - SelectiveDilation2d
    - SelectiveDilation3d
  - Opening And Closing
  - - Opening2d
    - Opening3d
    - Closing2d
    - Closing3d
    - OpeningDisk2d
    - OpeningDisk3d
    - OpeningBall3d
    - ClosingDisk2d
    - ClosingDisk3d
    - ClosingBall3d
    - OpeningLine2d
    - OpeningLine3d
    - ClosingLine2d
    - ClosingLine3d
    - OpeningLineMaximum
    - ClosingLineMinimum
    - OpeningColor2d
    - ClosingColor2d
    - OpeningByReconstruction2d
    - OpeningByReconstruction3d
    - ClosingByReconstruction2d
    - ClosingByReconstruction3d
    - OpeningDiskByReconstruction2d
    - OpeningBallByReconstruction3d
    - ClosingDiskByReconstruction2d
    - ClosingBallByReconstruction3d
    - SelectiveOpening2d
    - SelectiveOpening3d
    - SelectiveClosing2d
    - SelectiveClosing3d
  - Hit Or Miss And Skeleton
  - - Skeleton
    - Centerline3d
    - InfluenceZones
    - Centroid2d
    - EndPoints2d
    - EndPoints3d
    - Pruning2d
    - Pruning3d
    - IsolatedPoints2d
    - IsolatedPoints3d
    - TriplePoints2d
    - InteriorPoints2d
    - ApplyMorphologicalLut2d
    - ApplyMorphologicalLut3d
  - Geodesic Transformations
  - - ReconstructionFromMarkers2d
    - ReconstructionFromMarkers3d
    - GrayscaleReconstruction2d
    - GrayscaleReconstruction3d
    - GrayscaleFillHoles2d
    - GrayscaleFillHoles3d
    - HExtrema2d
    - HExtrema3d
    - RegionalExtrema2d
    - RegionalExtrema3d
    - UltimateErosion
  - Distance Maps
  - - DistanceMap2d
    - DistanceMap3d
    - EuclideanDistanceMap3d
    - EuclideanDistanceMap2d
    - GeodesicDistanceMap
    - ClosestBoundaryPoints2d
    - ClosestBoundaryPoints3d
    - TimeMap
    - LocalThicknessMap3d
    - GeodesicPropagation2d
    - GeodesicMaxima
    - GeodesicMinima
- Image Analysis
- - Image Measurements
  - - BinaryAnalysis
    - Area2d
    - Area3d
    - IntensityIntegral2d
    - IntensityIntegral3d
    - ObjectCount
    - DistanceMean2d
    - EulerNumber2d
    - EulerNumber3d
    - FractalDimension
    - CurvatureIntegrals3d
  - Image Statistics
  - - IntensityExtrema
    - IntensityStatistics
    - IntensityMaskedStatistics
    - IntensityHistogram
    - IntensityBinHistogram
    - AutoThresholdingValue
    - CompareImage
    - CompareValue
    - SimilarityMetricValue
    - SsimValue2d
    - SsimValue3d
    - RegionSimilarity
    - RadialIntensityProfile2d
    - RadialIntensityProfile3d
    - CylindricalIntensityProfile3d
    - RadialAutocorrelationProfile
    - Cooccurrence2d
    - MeasureGaussianNoise
    - LocalMaxima2d
    - LocalMaxima3d
    - PeakExtractor
    - LocalDensityMap2d
    - LocalDensityMap3d
    - SegmentationMetrics
  - Individual Measurements
  - - VolumeFractionByLabel
    - LabelCountByRegion
    - VolumeFractionByRegion
    - LabelAnalysis
    - LabelFiltering
    - LabelFilteringAnalysis
    - FilterAnalysis
    - MeasurementToImage
    - FilterByMeasurement
    - SieveLabeling
  - Moments And Orientations
  - - MomentsOfInertia2d
    - MomentsOfInertia3d
    - InertiaMoment2d
    - Eccentricity2d
    - OrientationMapFourier3d
    - OrientationMatchingFourier3d
  - Morphometry
  - - ObjectVolume
    - TotalImageVolume
    - ObjectBoundaryArea
    - TotalImageBoundaryArea
    - AverageObjectAreaPerSlice3d
    - AverageObjectCountPerSlice3d
    - ObjectImageRatio
    - ObjectSpecificSurface
    - ObjectSurfaceDensity
    - PorosityPercentage3d
    - FragmentationIndex
    - StructureModelIndex3d
    - AverageObjectThickness3d
    - AverageSpaceThickness3d
    - ObjectLinearDensity3d
    - DegreeOfAnisotropy
  - Propagation
  - - AxisPropagationBinary3d
    - AxisPropagationBinaryWithSeeds3d
    - AxisPropagationLabel3d
    - AxisPropagationLabelWithSeeds3d
    - AxisPropagationDistance3d
    - EstimateShortestPath3d
    - PercolationThreshold3d
    - AxisConnectivity3d
    - CentroidPathTortuosity3d
- Machine Learning
- - Classification
  - - AutoSegmentation3Phases
    - AutoIntensityClassification
    - SupervisedTextureClassification2d
    - SupervisedTextureClassification3d
    - TextureClassificationCreate
    - TextureClassificationTrain
    - TextureClassificationApply
  - Deep learning
  - - OnnxPredictionFiltering2d
    - OnnxPredictionFiltering3d
    - OnnxPredictionSegmentation2d
    - OnnxPredictionSegmentation3d
    - OnnxPredictionTwoOutputs2d
    - OnnxPredictionTwoOutputs3d
- Business Application
- - Dental
  - - DentalWallSegmentation3d
    - DentalMeshExtraction3d
    - DentalUnfolding3d
- IO
- - Image Data
  - - ReadVipImage
    - WriteVipImage
  - Algebraic Data
  - - ReadArrayXd
    - ReadArrayXi64
    - WriteArrayXd
    - WriteArrayXi64
  - Model
  - - ReadOnnxModel
- CUDA
- - Geometry And Matching
  - - CudaCrossCorrelation2d
    - CudaTemplateMatching3d
  - Image Filtering
  - - CudaBoxFilter2d
    - CudaMedianFilter2d
    - CudaGaussianFilter3d
    - CudaAdaptiveManifoldNlmFilter
  - Mathematical Morphology
  - - CudaErosion2d
    - CudaDilation2d
    - CudaOpening2d
    - CudaClosing2d
- Utilities
- Initialization
- Processing
- Syntax Check
- Visualization
- Data Object
- Image Data
- Kernels
- - MorphologicalKernel2d
  - MorphologicalKernel3d
  - MorphologicalLut2d
  - MorphologicalLut3d
- Model
- - TextureClassificationModel
  - OnnxModel
- Global Measurements
- - Image Measurements
  - - Area2dMsr
    - Area3dMsr
    - IntensityIntegral2dMsr
    - IntensityIntegral3dMsr
    - ObjectCountMsr
    - DistanceMeanMsr
    - Euler2dMsr
    - Euler3dMsr
    - FractalMsr
    - CurvatureIntegralsMsr
  - Image Statistics
  - - IntensityExtremaMsr
    - StatisticsMsr
    - IntensityHistogramMsr
    - IntensityBinHistogramMsr
    - CompareMsr
    - SimilarityMetricValueMsr
    - SsimValueMsr
    - RegionSimilarityMsr
    - SegmentationMetricsObjectMsr
    - SegmentationMetricsImageMsr
    - CylindricalIntensityProfileMsr
    - RadialIntensityProfileMsr
    - CorrelationMsr
    - CoocurrrenceMsr
    - GaussianNoiseMsr
    - LocalMaximaMsr
    - PeakExtractorMsr
  - Individual Measurements
  - - VolumeFractionByLabelMsr
    - LabelCountByRegionMsr
    - VolumeFractionByRegionMsr
  - Moments And Orientations
  - - MomentsOfInertia2dMsr
    - MomentsOfInertia3dMsr
    - MeanInertiaMomentMsr
    - Eccentricity2dMsr
    - LocalOrientation3dMsr
  - Morphometry
  - - ObjectVolumeMsr
    - ImageVolumeMsr
    - ObjectBoundaryAreaMsr
    - ImageBoundaryAreaMsr
    - AverageObjectAreaPerSliceMsr
    - AverageObjectCountPerSliceMsr
    - ObjectImageRatioMsr
    - ObjectSpecificSurfaceMsr
    - ObjectSurfaceDensityMsr
    - PorosityPercentageMsr
    - FragmentationMsr
    - StructureModelIndexMsr
    - AverageObjectThicknessMsr
    - AverageSpaceThicknessMsr
    - ObjectLinearDensityMsr
    - AnisotropyDegreeMsr
  - Propagation
  - - AxisPropagationBinary3dMsr
    - AxisPropagationLabel3dMsr
    - AxisPropagationDistance3dMsr
    - PercolationThreshold3dMsr
    - CentroidTortuosity3dMsr
  - Geometry And Matching
  - - CrossCorrelation2dMsr
  - Edge Detection
  - - CannyEdgeDetectorMsr
  - Image Segmentation
  - - AutoThresholdingMsr
    - AutoSegmentation3PhasesMsr
  - Mathematical Morphology
  - - ApplyMorphologicalLutMsr
- Analysis Measurements
- - AnalysisMsr
  - Measurement
  - Native Measurements
  - - Geometry
    - Feret
    - Intensity
    - Histogram
    - Inertia
    - Locate
    - Segment
    - Cooccurrence
  - CustomMeasurement
  - MeasurementAttributes
  - - Quantile
    - Histogram
    - Feret2d
    - Feret3d
    - NeighborCount
    - Cooccurrence
    - Breadth3d
  - MeasurementGroup
- Measurement Information
- - FieldInformation
  - CustomMeasurementInfo
- CUDA
- - CudaContext
- User Guide
- First Steps
- - Hello ImageDev
  - Initialize ImageDev
- Image Management
- - Create 2D Image
  - Create 3D Image
  - Data Transfer
- Standard Processing
- - Denoising
  - Thresholding
- Image Analysis
- - Global Analysis
  - Label Analysis
  - Measurement Browsing
  - Measurement Group
  - Custom Analysis
- Advanced Processing
- - Algorithm Tracking
- Typical Use Cases
- - Particle Analysis
  - Pore Analysis

# LocalMaxima2d

Extracts the local maxima of an image using a two-dimensional neighborhood analysis.
Access to parameter description
This algorithm considers $I(i,j)$ as a local maximum of $I$ if the two conditions below are verified

1. $I(i,j)$ is a local maximum in a $(2p+1)\times(2q+1)$ neighborhood, i.e., considering $k \in [1,p]$, $l \in [1,q]$ and m in [-p,p], $I(i,j)$

- $I(i,j)>I(i+m,j-l)$
- $I(i,j)>I(i-k,j)$
- $I(i,j) \geq I(i+k,j)$
- $I(i,j) \geq I(i+m,j+l)$

2. $I(i,j)$ is higher than a specified threshold

- $I(i,j)>threshold$

Figure 1. Graphic visualization of the 2D neighborhood analysis

## Examples

The examples below show the effect of the LocalMaxima2d algorithm with different parameters sets applied on the image illustrated in Figure 2.
Figure 2. Input image for local maxima extraction

### Example 1

First parameter set:

- p=0
- q=0
- threshold=4
- number=50

The extracted local maxima are the points higher than or equal to 4.
Figure 3. Extracted maxima with the first parameter set
The actual number of local maxima detected is 7.
The local maxima are located at positions: (7,3), (6,5), (5,7), (6,7), (6,8), (2,9) and (6,9)
This algorithm configuration corresponds to a single thresholding operator.

### Example 2

Second parameter set:

- p=1
- q=1
- threshold=3
- number=50

Figure 4. Extracted maxima with the second parameter set
The actual number of local maxima detected is 4.
The local maxima are located at positions: (7,3), (6,5), (5,7) and (2,9)
Note: If there is an area in the image at constant level, the algorithm returns the upper left corner of this area. The other points of this area are not considered as "local maxima".

### Example 3

Third parameter set:

- p=2
- q=2
- threshold=3
- number=50

Figure 5. Extracted maxima with the third parameter set
The actual number of local maxima detected is 2.
The local maxima are located at positions: (7,3) and (5,7)
Note: The algorithm is not performed on the image border depending on the $n$ and $m$ values. This is the reason why the point (2,9) is not considered as a local maximum.

## Sub-Pixel Position Determination

The maxima can be returned either as a discrete position in the image grid, or as a sub-pixel position by interpolation with parabola.
On example 3, the algorithm detects 2 local maxima. The positions are converted to sub-pixel positions as follows
Figure 6. First maximum identified in example 3
Figure 7. X sub-pixel position determined by parabola approximation
Figure 8. Y sub-pixel position determined by parabola approximation
The maximum detected in pixel precision at (7,3) becomes (6.95,4.05) with sub-pixel precision.
See also

- CrossCorrelation2d
- LocalMaxima3d

##
Function Syntax

This function returns outputMeasurement.

    // Function prototype
    LocalMaximaMsr::Ptr
    localMaxima2d( std::shared_ptr< iolink::ImageView > inputGrayImage,
                   const iolink::Vector2i32& localWindow,
                   double thresholdRange,
                   LocalMaxima2d::Precision precision,
                   int32_t numberOfPatterns,
                   LocalMaximaMsr::Ptr outputMeasurement = nullptr );

This function returns outputMeasurement.

    // Function prototype.
    local_maxima_2d(input_gray_image: idt.ImageType,
                    local_window: Iterable[int] = [3, 3],
                    threshold_range: float = 0,
                    precision: LocalMaxima2d.Precision = LocalMaxima2d.Precision.PIXEL,
                    number_of_patterns: int = 1,
                    output_measurement: Union[Any, None] = None) -> LocalMaximaMsr

This function returns outputMeasurement.

    // Function prototype.
    public static LocalMaximaMsr
    LocalMaxima2d( IOLink.ImageView inputGrayImage,
                   int[] localWindow = null,
                   double thresholdRange = 0,
                   LocalMaxima2d.Precision precision = ImageDev.LocalMaxima2d.Precision.PIXEL,
                   Int32 numberOfPatterns = 1,
                   LocalMaximaMsr outputMeasurement = null );

##
Class Syntax

    // Command constructor.
    LocalMaxima2d();

    /// Gets the inputGrayImage parameter.
    /// The input grayscale image.
    std::shared_ptr< iolink::ImageView > inputGrayImage() const;
    /// Sets the inputGrayImage parameter.
    /// The input grayscale image.
    void setInputGrayImage( std::shared_ptr< iolink::ImageView > inputGrayImage );

    /// Gets the localWindow parameter.
    /// The neighborhood size in pixels, along the X and Y directions.
    iolink::Vector2i32 localWindow() const;
    /// Sets the localWindow parameter.
    /// The neighborhood size in pixels, along the X and Y directions.
    void setLocalWindow( const iolink::Vector2i32& localWindow );

    /// Gets the thresholdRange parameter.
    /// The threshold value higher than which maxima are retained.
    double thresholdRange() const;
    /// Sets the thresholdRange parameter.
    /// The threshold value higher than which maxima are retained.
    void setThresholdRange( const double& thresholdRange );

    /// Gets the precision parameter.
    /// The precision of the maxima localization.
    LocalMaxima2d::Precision precision() const;
    /// Sets the precision parameter.
    /// The precision of the maxima localization.
    void setPrecision( const LocalMaxima2d::Precision& precision );

    /// Gets the numberOfPatterns parameter.
    /// The maximum number of patterns to be detected.
    int32_t numberOfPatterns() const;
    /// Sets the numberOfPatterns parameter.
    /// The maximum number of patterns to be detected.
    void setNumberOfPatterns( const int32_t& numberOfPatterns );

    /// Gets the outputMeasurement parameter.
    /// The result object containing the maxima positions.
    LocalMaximaMsr::Ptr outputMeasurement() const;

    // Method to launch the command.
    void execute();

    # Property of the inputGrayImage parameter.
    LocalMaxima2d.input_gray_image
    # Property of the localWindow parameter.
    LocalMaxima2d.local_window
    # Property of the thresholdRange parameter.
    LocalMaxima2d.threshold_range
    # Property of the precision parameter.
    LocalMaxima2d.precision
    # Property of the numberOfPatterns parameter.
    LocalMaxima2d.number_of_patterns
    # Property of the outputMeasurement parameter.
    LocalMaxima2d.output_measurement

    // Method to launch the command.
    execute()

    // Command constructor.
    LocalMaxima2d()

    // Property of the inputGrayImage parameter.
    LocalMaxima2d.inputGrayImage
    // Property of the localWindow parameter.
    LocalMaxima2d.localWindow
    // Property of the thresholdRange parameter.
    LocalMaxima2d.thresholdRange
    // Property of the precision parameter.
    LocalMaxima2d.precision
    // Property of the numberOfPatterns parameter.
    LocalMaxima2d.numberOfPatterns
    // Property of the outputMeasurement parameter.
    LocalMaxima2d.outputMeasurement

    // Method to launch the command.
    Execute()

## Parameters

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| inputGrayImage | The input grayscale image. | Image | Binary, Label or Grayscale | nullptr
| localWindow | The neighborhood size in pixels, along the X and Y directions. | Vector2i32 | >0 | {3, 3}
| thresholdRange | The threshold value higher than which maxima are retained. | Float64 | >=0 | 0
| precision | The precision of the maxima localization.
PIXEL | No sub-pixel approximation.
SUB_PIXEL | Sub-pixel approximation determined by parabola fitting.
| Enumeration |  | PIXEL
| numberOfPatterns | The maximum number of patterns to be detected. | Int32 | >=1 | 1
| outputMeasurement | The result object containing the maxima positions. | LocalMaximaMsr |  | nullptr

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| input_gray_image | The input grayscale image. | image | Binary, Label or Grayscale | None
| local_window | The neighborhood size in pixels, along the X and Y directions. | vector2i32 | >0 | [3, 3]
| threshold_range | The threshold value higher than which maxima are retained. | float64 | >=0 | 0
| precision | The precision of the maxima localization.
PIXEL | No sub-pixel approximation.
SUB_PIXEL | Sub-pixel approximation determined by parabola fitting.
| enumeration |  | PIXEL
| number_of_patterns | The maximum number of patterns to be detected. | int32 | >=1 | 1
| output_measurement | The result object containing the maxima positions. | LocalMaximaMsr |  | None

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| inputGrayImage | The input grayscale image. | Image | Binary, Label or Grayscale | null
| localWindow | The neighborhood size in pixels, along the X and Y directions. | Vector2i32 | >0 | {3, 3}
| thresholdRange | The threshold value higher than which maxima are retained. | Float64 | >=0 | 0
| precision | The precision of the maxima localization.
PIXEL | No sub-pixel approximation.
SUB_PIXEL | Sub-pixel approximation determined by parabola fitting.
| Enumeration |  | PIXEL
| numberOfPatterns | The maximum number of patterns to be detected. | Int32 | >=1 | 1
| outputMeasurement | The result object containing the maxima positions. | LocalMaximaMsr |  | null

## Object Examples

    auto polystyrene = ioformat::readImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene.tif" );

    LocalMaxima2d localMaxima2dAlgo;
    localMaxima2dAlgo.setInputGrayImage( polystyrene );
    localMaxima2dAlgo.setLocalWindow( {3, 3} );
    localMaxima2dAlgo.setThresholdRange( 0 );
    localMaxima2dAlgo.setPrecision( LocalMaxima2d::Precision::PIXEL );
    localMaxima2dAlgo.setNumberOfPatterns( 1 );
    localMaxima2dAlgo.execute();

    std::cout << "value: " << localMaxima2dAlgo.outputMeasurement()->value( ) ;

    polystyrene = ioformat.read_image(imagedev_data.get_image_path("polystyrene.tif"))

    local_maxima_2d_algo = imagedev.LocalMaxima2d()
    local_maxima_2d_algo.input_gray_image = polystyrene
    local_maxima_2d_algo.local_window = [3, 3]
    local_maxima_2d_algo.threshold_range = 0
    local_maxima_2d_algo.precision = imagedev.LocalMaxima2d.PIXEL
    local_maxima_2d_algo.number_of_patterns = 1
    local_maxima_2d_algo.execute()

    print("value: ", str(local_maxima_2d_algo.output_measurement.value()))

    ImageView polystyrene = ViewIO.ReadImage( @"Data/images/polystyrene.tif" );

    LocalMaxima2d localMaxima2dAlgo = new LocalMaxima2d
    {
        inputGrayImage = polystyrene,
        localWindow = new int[]{3, 3},
        thresholdRange = 0,
        precision = LocalMaxima2d.Precision.PIXEL,
        numberOfPatterns = 1
    };
    localMaxima2dAlgo.Execute();

    Console.WriteLine( "value: " + localMaxima2dAlgo.outputMeasurement.value( ) );

## Function Examples

    auto polystyrene = ioformat::readImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene.tif" );

    auto result = localMaxima2d( polystyrene, {3, 3}, 0, LocalMaxima2d::Precision::PIXEL, 1 );

    std::cout << "value: " << result->value( ) ;

    polystyrene = ioformat.read_image(imagedev_data.get_image_path("polystyrene.tif"))

    result = imagedev.local_maxima_2d(polystyrene, [3, 3], 0, imagedev.LocalMaxima2d.PIXEL, 1)

    print("value: ", str(result.value()))

    ImageView polystyrene = ViewIO.ReadImage( @"Data/images/polystyrene.tif" );

    LocalMaximaMsr result = Processing.LocalMaxima2d( polystyrene, new int[]{3, 3}, 0, LocalMaxima2d.Precision.PIXEL, 1 );

    Console.WriteLine(  "value: " + result.value( )  );

© 2025 Thermo Fisher Scientific Inc. All rights reserved.