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

# GradientOperator3d

Provides different algorithms to perform an edge detection based on the first derivative of a three-dimensional image.
Access to parameter description
This command is deprecated, it will be removed in ImageDev 2025.1.
You can use GradientVector3d or GradientMagnitude3d instead.
For an introduction:

- section Edge Detection
- section Gradient
- section Images Filters

GradientOperator3d computes a first order derivative in each image axis direction. To minimize the effect of noise, the algorithm can be combined with a smoothing filter for computing the gradient. A smoothing scale parameter determines the smoothing intensity. If its value is large, noise is reduced but edges are less sharp and only the most significant edges are revealed. It is important to select the right coefficient to lower the noise just enough without defocusing the edges. Finally the algorithm optionally computes the magnitude of the gradient vectors either by selecting its maximum component or its Euclidean norm.
For color images the same algorithm is iterated on each color channel.
The following algorithms are provided to extract the edges of an image:

- Canny-Deriche: It performs a recursive gradient computation with an IIR (Infinite Impulse Response) filter by derivating the Deriche [1] smoothing filter which has the three-dimensional form: $$ f(x,y,z)=b^3(\alpha|x|+1)e^{-\alpha|x|}\cdot(\alpha|y|+1)e^{-\alpha|y|}\cdot(\alpha|z|+1)e^{-\alpha|z|} ~~where~~b=\frac{\alpha}{4} $$
- Canny: It is similar to Canny-Deriche but uses a FIR (finite impulse response) filter [2]. It performs an approximation to get the Canny-Deriche in the X, Y, and Z directions using a convolution kernel 7x5x5 for X, 5x7x5 for Y and 5x5x7 for Z. The result is nearly the same as Canny-Deriche but the process is much faster.
- Gaussian: It performs a convolution with the derivatives of a Gaussian function along each image axis.
- Sobel: It performs a convolution with the Sobel Kernel. This kernel is the 3D generalization of the Sobel kernel described in GradientOperator2d.
- Prewitt: It performs a convolution with the Prewitt Kernel. This kernel is the 3D generalization of the Prewitt kernel described in GradientOperator2d.

Notices:

- The output data type is determined by applying the Basic rules defined for arithmetic operations.
- To limit overflows some normalizations are applied with most of the proposed operators by dividing the output gray levels by the sum of absolute values of the kernel coefficients.
- The Prewitt and Sobel operators do not apply normalizations and are thus inclined to produce overflows.
- By default, the maximum component of each directional gradient is computed. Depending on the selected operator, other output can be selected such as the Euclidean norm or the gradient components.
- The smoothing factor has a totally different meaning depending on the selected gradient operator. It represents a smoothing percentage with Canny-Deriche, a standard-deviation with the Gaussian and is ignored with Canny, Sobel and Prewitt.

References
[1] R.Deriche. "Using Canny's criteria to derive a recursively implemented optimal edge detector". International Journal of Computer Vision, vol.1, no 2, pp. 167-187, Jun. 1987.
[2] J.F.Canny. "A computational approach to edge detection." IEEE Transactions on Pattern Analysis and Machine Intelligence, vol.8, No 6, pp. 679-698, Nov. 1986.
See also

- VectorToMagnitude3d
- GradientOperator2d
- MorphologicalGradient3d

##
Function Syntax

This function returns a GradientOperator3dOutput structure containing outputImageX, outputImageY, outputImageZ and outputAmplitudeImage.

    // Output structure of the gradientOperator3d function.
    struct GradientOperator3dOutput
    {
        /// The X-gradient output image.
        std::shared_ptr< iolink::ImageView > outputImageX;
        /// The Y-gradient output image.
        std::shared_ptr< iolink::ImageView > outputImageY;
        /// The Z-gradient output image.
        std::shared_ptr< iolink::ImageView > outputImageZ;
        /// The gradient amplitude output image.
        std::shared_ptr< iolink::ImageView > outputAmplitudeImage;
    };

    // Function prototype
    GradientOperator3dOutput
    gradientOperator3d( std::shared_ptr< iolink::ImageView > inputImage,
                        GradientOperator3d::GradientOperator gradientOperator,
                        GradientOperator3d::GradientMode gradientMode,
                        double smoothingFactor,
                        std::shared_ptr< iolink::ImageView > outputImageX = nullptr,
                        std::shared_ptr< iolink::ImageView > outputImageY = nullptr,
                        std::shared_ptr< iolink::ImageView > outputImageZ = nullptr,
                        std::shared_ptr< iolink::ImageView > outputAmplitudeImage = nullptr );

This function returns a tuple containing output_image_x, output_image_y, output_image_z and output_amplitude_image.

    // Function prototype.
    gradient_operator_3d(input_image: idt.ImageType,
                         gradient_operator: GradientOperator3d.GradientOperator = GradientOperator3d.GradientOperator.CANNY_DERICHE,
                         gradient_mode: GradientOperator3d.GradientMode = GradientOperator3d.GradientMode.AMPLITUDE_MAXIMUM,
                         smoothing_factor: float = 60,
                         output_image_x: idt.ImageType = None,
                         output_image_y: idt.ImageType = None,
                         output_image_z: idt.ImageType = None,
                         output_amplitude_image: idt.ImageType = None) -> Tuple[idt.ImageType, idt.ImageType, idt.ImageType, idt.ImageType]

This function returns a GradientOperator3dOutput structure containing outputImageX, outputImageY, outputImageZ and outputAmplitudeImage.

    /// Output structure of the GradientOperator3d function.
    public struct GradientOperator3dOutput
    {
        /// The X-gradient output image.
        public IOLink.ImageView outputImageX;
        /// The Y-gradient output image.
        public IOLink.ImageView outputImageY;
        /// The Z-gradient output image.
        public IOLink.ImageView outputImageZ;
        /// The gradient amplitude output image.
        public IOLink.ImageView outputAmplitudeImage;
    };

    // Function prototype.
    public static GradientOperator3dOutput
    GradientOperator3d( IOLink.ImageView inputImage,
                        GradientOperator3d.GradientOperator gradientOperator = ImageDev.GradientOperator3d.GradientOperator.CANNY_DERICHE,
                        GradientOperator3d.GradientMode gradientMode = ImageDev.GradientOperator3d.GradientMode.AMPLITUDE_MAXIMUM,
                        double smoothingFactor = 60,
                        IOLink.ImageView outputImageX = null,
                        IOLink.ImageView outputImageY = null,
                        IOLink.ImageView outputImageZ = null,
                        IOLink.ImageView outputAmplitudeImage = null );

##
Class Syntax

    // Command constructor.
    GradientOperator3d();

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

    /// Gets the gradientOperator parameter.
    /// The gradient operator to apply.
    GradientOperator3d::GradientOperator gradientOperator() const;
    /// Sets the gradientOperator parameter.
    /// The gradient operator to apply.
    void setGradientOperator( const GradientOperator3d::GradientOperator& gradientOperator );

    /// Gets the gradientMode parameter.
    /// Select an output mode.
    GradientOperator3d::GradientMode gradientMode() const;
    /// Sets the gradientMode parameter.
    /// Select an output mode.
    void setGradientMode( const GradientOperator3d::GradientMode& gradientMode );

    /// Gets the smoothingFactor parameter.
    /// The smoothing factor defines the gradient sharpness. It is only used with Canny Deriche, and Gaussian operators. It has a totally different meaning depending on the selected gradient operator. Its value must be between 0 and 100.
    double smoothingFactor() const;
    /// Sets the smoothingFactor parameter.
    /// The smoothing factor defines the gradient sharpness. It is only used with Canny Deriche, and Gaussian operators. It has a totally different meaning depending on the selected gradient operator. Its value must be between 0 and 100.
    void setSmoothingFactor( const double& smoothingFactor );

    /// Gets the outputImageX parameter.
    /// The X-gradient output image.
    std::shared_ptr< iolink::ImageView > outputImageX() const;
    /// Sets the outputImageX parameter.
    /// The X-gradient output image.
    void setOutputImageX( std::shared_ptr< iolink::ImageView > outputImageX );

    /// Gets the outputImageY parameter.
    /// The Y-gradient output image.
    std::shared_ptr< iolink::ImageView > outputImageY() const;
    /// Sets the outputImageY parameter.
    /// The Y-gradient output image.
    void setOutputImageY( std::shared_ptr< iolink::ImageView > outputImageY );

    /// Gets the outputImageZ parameter.
    /// The Z-gradient output image.
    std::shared_ptr< iolink::ImageView > outputImageZ() const;
    /// Sets the outputImageZ parameter.
    /// The Z-gradient output image.
    void setOutputImageZ( std::shared_ptr< iolink::ImageView > outputImageZ );

    /// Gets the outputAmplitudeImage parameter.
    /// The gradient amplitude output image.
    std::shared_ptr< iolink::ImageView > outputAmplitudeImage() const;
    /// Sets the outputAmplitudeImage parameter.
    /// The gradient amplitude output image.
    void setOutputAmplitudeImage( std::shared_ptr< iolink::ImageView > outputAmplitudeImage );

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

    # Property of the inputImage parameter.
    GradientOperator3d.input_image
    # Property of the gradientOperator parameter.
    GradientOperator3d.gradient_operator
    # Property of the gradientMode parameter.
    GradientOperator3d.gradient_mode
    # Property of the smoothingFactor parameter.
    GradientOperator3d.smoothing_factor
    # Property of the outputImageX parameter.
    GradientOperator3d.output_image_x
    # Property of the outputImageY parameter.
    GradientOperator3d.output_image_y
    # Property of the outputImageZ parameter.
    GradientOperator3d.output_image_z
    # Property of the outputAmplitudeImage parameter.
    GradientOperator3d.output_amplitude_image

    // Method to launch the command.
    execute()

    // Command constructor.
    GradientOperator3d()

    // Property of the inputImage parameter.
    GradientOperator3d.inputImage
    // Property of the gradientOperator parameter.
    GradientOperator3d.gradientOperator
    // Property of the gradientMode parameter.
    GradientOperator3d.gradientMode
    // Property of the smoothingFactor parameter.
    GradientOperator3d.smoothingFactor
    // Property of the outputImageX parameter.
    GradientOperator3d.outputImageX
    // Property of the outputImageY parameter.
    GradientOperator3d.outputImageY
    // Property of the outputImageZ parameter.
    GradientOperator3d.outputImageZ
    // Property of the outputAmplitudeImage parameter.
    GradientOperator3d.outputAmplitudeImage

    // Method to launch the command.
    Execute()

## Parameters

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| inputImage | The input image. | Image | Binary, Label, Grayscale or Multispectral | nullptr
| gradientOperator | The gradient operator to apply.
CANNY_DERICHE | The gradient is computed using the Canny-Deriche algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM, and X_Y_AND_Z_GRADIENTS.
CANNY | The gradient is computed using the Canny algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM.
GAUSSIAN | The gradient is computed using the Gaussian algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
PREWITT | The gradient is computed using the Prewitt algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
SOBEL | The gradient is computed using the Sobel algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
| Enumeration |  | CANNY_DERICHE
| gradientMode | Select an output mode.
AMPLITUDE_MAXIMUM | This option computes the gradient maximal amplitude. Only the outputAmplitudeImage output is set using this mode.
X_Y_AND_Z_GRADIENTS | This option computes gradient in X, Y and Z directions. outputGradientXImage, outGradientYImage and outputGradientZImage outputs are set using this mode.
AMPLITUDE_EUCLIDEAN | This option computes the Euclidean amplitude gradient. Only the outputAmplitudeImage output is set using this mode.
| Enumeration |  | AMPLITUDE_MAXIMUM
| smoothingFactor | The smoothing factor defines the gradient sharpness. It is only used with Canny Deriche, and Gaussian operators. It has a totally different meaning depending on the selected gradient operator. Its value must be between 0 and 100. Canny-Deriche: it is inversely proportional to Deriche alpha smoothing factor, in pixels. Low values provide sharp gradient. $SmoothingFactor=\frac{(5.3-\alpha)}{5}\times 100$ Gaussian: the Gaussian kernel standard deviation, in pixels. Low values provide sharp gradient. Prewitt, Sobel, Canny: it is ignored. | Float64 | ]0, 100] | 60
| outputImageX | The X-gradient output image. | Image |  | nullptr
| outputImageY | The Y-gradient output image. | Image |  | nullptr
| outputImageZ | The Z-gradient output image. | Image |  | nullptr
| outputAmplitudeImage | The gradient amplitude output image. | Image |  | nullptr

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| input_image | The input image. | image | Binary, Label, Grayscale or Multispectral | None
| gradient_operator | The gradient operator to apply.
CANNY_DERICHE | The gradient is computed using the Canny-Deriche algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM, and X_Y_AND_Z_GRADIENTS.
CANNY | The gradient is computed using the Canny algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM.
GAUSSIAN | The gradient is computed using the Gaussian algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
PREWITT | The gradient is computed using the Prewitt algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
SOBEL | The gradient is computed using the Sobel algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
| enumeration |  | CANNY_DERICHE
| gradient_mode | Select an output mode.
AMPLITUDE_MAXIMUM | This option computes the gradient maximal amplitude. Only the outputAmplitudeImage output is set using this mode.
X_Y_AND_Z_GRADIENTS | This option computes gradient in X, Y and Z directions. outputGradientXImage, outGradientYImage and outputGradientZImage outputs are set using this mode.
AMPLITUDE_EUCLIDEAN | This option computes the Euclidean amplitude gradient. Only the outputAmplitudeImage output is set using this mode.
| enumeration |  | AMPLITUDE_MAXIMUM
| smoothing_factor | The smoothing factor defines the gradient sharpness. It is only used with Canny Deriche, and Gaussian operators. It has a totally different meaning depending on the selected gradient operator. Its value must be between 0 and 100. Canny-Deriche: it is inversely proportional to Deriche alpha smoothing factor, in pixels. Low values provide sharp gradient. $SmoothingFactor=\frac{(5.3-\alpha)}{5}\times 100$ Gaussian: the Gaussian kernel standard deviation, in pixels. Low values provide sharp gradient. Prewitt, Sobel, Canny: it is ignored. | float64 | ]0, 100] | 60
| output_image_x | The X-gradient output image. | image |  | None
| output_image_y | The Y-gradient output image. | image |  | None
| output_image_z | The Z-gradient output image. | image |  | None
| output_amplitude_image | The gradient amplitude output image. | image |  | None

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| inputImage | The input image. | Image | Binary, Label, Grayscale or Multispectral | null
| gradientOperator | The gradient operator to apply.
CANNY_DERICHE | The gradient is computed using the Canny-Deriche algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM, and X_Y_AND_Z_GRADIENTS.
CANNY | The gradient is computed using the Canny algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM.
GAUSSIAN | The gradient is computed using the Gaussian algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
PREWITT | The gradient is computed using the Prewitt algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
SOBEL | The gradient is computed using the Sobel algorithm. Supported gradient output modes : AMPLITUDE_MAXIMUM and X_Y_AND_Z_GRADIENTS.
| Enumeration |  | CANNY_DERICHE
| gradientMode | Select an output mode.
AMPLITUDE_MAXIMUM | This option computes the gradient maximal amplitude. Only the outputAmplitudeImage output is set using this mode.
X_Y_AND_Z_GRADIENTS | This option computes gradient in X, Y and Z directions. outputGradientXImage, outGradientYImage and outputGradientZImage outputs are set using this mode.
AMPLITUDE_EUCLIDEAN | This option computes the Euclidean amplitude gradient. Only the outputAmplitudeImage output is set using this mode.
| Enumeration |  | AMPLITUDE_MAXIMUM
| smoothingFactor | The smoothing factor defines the gradient sharpness. It is only used with Canny Deriche, and Gaussian operators. It has a totally different meaning depending on the selected gradient operator. Its value must be between 0 and 100. Canny-Deriche: it is inversely proportional to Deriche alpha smoothing factor, in pixels. Low values provide sharp gradient. $SmoothingFactor=\frac{(5.3-\alpha)}{5}\times 100$ Gaussian: the Gaussian kernel standard deviation, in pixels. Low values provide sharp gradient. Prewitt, Sobel, Canny: it is ignored. | Float64 | ]0, 100] | 60
| outputImageX | The X-gradient output image. | Image |  | null
| outputImageY | The Y-gradient output image. | Image |  | null
| outputImageZ | The Z-gradient output image. | Image |  | null
| outputAmplitudeImage | The gradient amplitude output image. | Image |  | null

## Object Examples

    auto foam = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "foam.vip" );

    GradientOperator3d gradientOperator3dAlgo;
    gradientOperator3dAlgo.setInputImage( foam );
    gradientOperator3dAlgo.setGradientOperator( GradientOperator3d::GradientOperator::CANNY_DERICHE );
    gradientOperator3dAlgo.setGradientMode( GradientOperator3d::GradientMode::AMPLITUDE_MAXIMUM );
    gradientOperator3dAlgo.setSmoothingFactor( 60.0 );
    gradientOperator3dAlgo.execute();

    std::cout << "outputImageX:" << gradientOperator3dAlgo.outputImageX()->toString();
    std::cout << "outputImageY:" << gradientOperator3dAlgo.outputImageY()->toString();
    std::cout << "outputImageZ:" << gradientOperator3dAlgo.outputImageZ()->toString();
    std::cout << "outputAmplitudeImage:" << gradientOperator3dAlgo.outputAmplitudeImage()->toString();

    foam = imagedev.read_vip_image(imagedev_data.get_image_path("foam.vip"))

    gradient_operator_3d_algo = imagedev.GradientOperator3d()
    gradient_operator_3d_algo.input_image = foam
    gradient_operator_3d_algo.gradient_operator = imagedev.GradientOperator3d.CANNY_DERICHE
    gradient_operator_3d_algo.gradient_mode = imagedev.GradientOperator3d.AMPLITUDE_MAXIMUM
    gradient_operator_3d_algo.smoothing_factor = 60.0
    gradient_operator_3d_algo.execute()

    print("output_image_x:", str(gradient_operator_3d_algo.output_image_x))
    print("output_image_y:", str(gradient_operator_3d_algo.output_image_y))
    print("output_image_z:", str(gradient_operator_3d_algo.output_image_z))
    print("output_amplitude_image:", str(gradient_operator_3d_algo.output_amplitude_image))

    ImageView foam = Data.ReadVipImage( @"Data/images/foam.vip" );

    GradientOperator3d gradientOperator3dAlgo = new GradientOperator3d
    {
        inputImage = foam,
        gradientOperator = GradientOperator3d.GradientOperator.CANNY_DERICHE,
        gradientMode = GradientOperator3d.GradientMode.AMPLITUDE_MAXIMUM,
        smoothingFactor = 60.0
    };
    gradientOperator3dAlgo.Execute();

    Console.WriteLine( "outputImageX:" + gradientOperator3dAlgo.outputImageX.ToString() );
    Console.WriteLine( "outputImageY:" + gradientOperator3dAlgo.outputImageY.ToString() );
    Console.WriteLine( "outputImageZ:" + gradientOperator3dAlgo.outputImageZ.ToString() );
    Console.WriteLine( "outputAmplitudeImage:" + gradientOperator3dAlgo.outputAmplitudeImage.ToString() );

## Function Examples

    auto foam = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "foam.vip" );

    auto result = gradientOperator3d( foam, GradientOperator3d::GradientOperator::CANNY_DERICHE, GradientOperator3d::GradientMode::AMPLITUDE_MAXIMUM, 60.0 );

    std::cout << "outputImageX:" << result.outputImageX->toString();
    std::cout << "outputImageY:" << result.outputImageY->toString();
    std::cout << "outputImageZ:" << result.outputImageZ->toString();
    std::cout << "outputAmplitudeImage:" << result.outputAmplitudeImage->toString();

    foam = imagedev.read_vip_image(imagedev_data.get_image_path("foam.vip"))

    result_output_image_x, result_output_image_y, result_output_image_z, result_output_amplitude_image = imagedev.gradient_operator_3d(foam, imagedev.GradientOperator3d.CANNY_DERICHE, imagedev.GradientOperator3d.AMPLITUDE_MAXIMUM, 60.0)

    print("output_image_x:", str(result_output_image_x))
    print("output_image_y:", str(result_output_image_y))
    print("output_image_z:", str(result_output_image_z))
    print("output_amplitude_image:", str(result_output_amplitude_image))

    ImageView foam = Data.ReadVipImage( @"Data/images/foam.vip" );

    Processing.GradientOperator3dOutput result = Processing.GradientOperator3d( foam, GradientOperator3d.GradientOperator.CANNY_DERICHE, GradientOperator3d.GradientMode.AMPLITUDE_MAXIMUM, 60.0 );

    Console.WriteLine( "outputImageX:" + result.outputImageX.ToString() );
    Console.WriteLine( "outputImageY:" + result.outputImageY.ToString() );
    Console.WriteLine( "outputImageZ:" + result.outputImageZ.ToString() );
    Console.WriteLine( "outputAmplitudeImage:" + result.outputAmplitudeImage.ToString() );

© 2025 Thermo Fisher Scientific Inc. All rights reserved.