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

# DentalUnfolding3d

Extracts a flattened volume and image from an input three-dimensional image mapped to a surface mesh.
Access to parameter description
This algorithm unfolds a 3D surface defined in an input mesh, in order to make it appear as a flat layer of the output 3D panoramic volume.
The panoramic output volume is a 3D image corresponding to the region of the input volume defined by the input surface and a given thickness. The dimensions in voxels of the output image are automatically adjusted to preserve the resolution of the input volume. The X axis of the output volume corresponds to the teeth arch curve, its Y axis to the extrusion direction (generally the Z axis of the initial volume) and its Z axis the slab thickness (orthogonal direction to the mesh cells).
By default the thickness of the output volume is taken in the direction of the normal vectors to each cell of the input mesh. If this behavior is not desired, these directions can be redefined with the directions parameter. The panoramic output image is computed as the maxima projection of the panoramic volume along its thickness. A sharpening is applied to mitigate the blur induced by the resampling and projection steps.
See also

- DentalWallSegmentation3d
- DentalMeshExtraction3d

##
Function Syntax

This function returns a DentalUnfolding3dOutput structure containing outputPanoramicImage and outputPanoramicVolume.

    // Output structure of the dentalUnfolding3d function.
    struct DentalUnfolding3dOutput
    {
        /// The output panoramic image representing unfolded jaws. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths.
        std::shared_ptr< iolink::ImageView > outputPanoramicImage;
        /// The output panoramic volume given by unfolding the surface defined by the arch mesh. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. Its thickness is defined by the volume thickness.
        std::shared_ptr< iolink::ImageView > outputPanoramicVolume;
        /// The quadrilateral mesh forming the surface fitted to the dental wall used to generate the output panoramic This mesh is represented as a three-dimensional array storing the coordinates of each vertex.
        std::shared_ptr<iolink::ArrayXd> inputMesh;
        /// Optional direction vectors used to define the Z axis of the output volume.
        std::shared_ptr<iolink::ArrayXd> inputDirections;
    };

    // Function prototype
    DentalUnfolding3dOutput
    dentalUnfolding3d( std::shared_ptr< iolink::ImageView > inputImage,
                       std::shared_ptr<iolink::ArrayXd> inputMesh,
                       std::shared_ptr<iolink::ArrayXd> inputDirections,
                       double volumeThickness,
                       uint32_t slabThickness,
                       double sharpening,
                       std::shared_ptr< iolink::ImageView > outputPanoramicImage = nullptr,
                       std::shared_ptr< iolink::ImageView > outputPanoramicVolume = nullptr );

This function returns a tuple containing output_panoramic_image and output_panoramic_volume.

    // Function prototype.
    dental_unfolding_3d(input_image: idt.ImageType,
                        input_mesh: Union[idt.NDArrayFloat, None],
                        input_directions: Union[idt.NDArrayFloat, None],
                        volume_thickness: float = 15,
                        slab_thickness: int = 3,
                        sharpening: float = 4,
                        output_panoramic_image: idt.ImageType = None,
                        output_panoramic_volume: idt.ImageType = None) -> Tuple[idt.ImageType, idt.ImageType]

This function returns a DentalUnfolding3dOutput structure containing outputPanoramicImage and outputPanoramicVolume.

    /// Output structure of the DentalUnfolding3d function.
    public struct DentalUnfolding3dOutput
    {
        ///
        /// The output panoramic image representing unfolded jaws. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths.
        ///
        public IOLink.ImageView outputPanoramicImage;
        ///
        /// The output panoramic volume given by unfolding the surface defined by the arch mesh. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. Its thickness is defined by the volume thickness.
        ///
        public IOLink.ImageView outputPanoramicVolume;
        ///
        /// The quadrilateral mesh forming the surface fitted to the dental wall used to generate the output panoramic This mesh is represented as a three-dimensional array storing the coordinates of each vertex.
        ///
        public IOLink.ArrayXd inputMesh;
        /// Optional direction vectors used to define the Z axis of the output volume.
        public IOLink.ArrayXd inputDirections;
    };

    // Function prototype.
    public static DentalUnfolding3dOutput
    DentalUnfolding3d( IOLink.ImageView inputImage,
                       IOLink.ArrayXd inputMesh,
                       IOLink.ArrayXd inputDirections,
                       double volumeThickness = 15,
                       UInt32 slabThickness = 3,
                       double sharpening = 4,
                       IOLink.ImageView outputPanoramicImage = null,
                       IOLink.ImageView outputPanoramicVolume = null );

##
Class Syntax

    // Command constructor.
    DentalUnfolding3d();

    /// Gets the inputImage parameter.
    /// The input 3D CBCT image of the head (LP orientation) to unfold.
    std::shared_ptr< iolink::ImageView > inputImage() const;
    /// Sets the inputImage parameter.
    /// The input 3D CBCT image of the head (LP orientation) to unfold.
    void setInputImage( std::shared_ptr< iolink::ImageView > inputImage );

    /// Gets the inputMesh parameter.
    /// The quadrilateral mesh forming the surface fitted to the dental wall used to generate the output panoramic This mesh is represented as a three-dimensional array storing the coordinates of each vertex.
    std::shared_ptr<iolink::ArrayXd> inputMesh() const;
    /// Sets the inputMesh parameter.
    /// The quadrilateral mesh forming the surface fitted to the dental wall used to generate the output panoramic This mesh is represented as a three-dimensional array storing the coordinates of each vertex.
    void setInputMesh( std::shared_ptr<iolink::ArrayXd> inputMesh );

    /// Gets the inputDirections parameter.
    /// Optional direction vectors used to define the Z axis of the output volume.
    std::shared_ptr<iolink::ArrayXd> inputDirections() const;
    /// Sets the inputDirections parameter.
    /// Optional direction vectors used to define the Z axis of the output volume.
    void setInputDirections( std::shared_ptr<iolink::ArrayXd> inputDirections );

    /// Gets the volumeThickness parameter.
    /// The thickness of the output panoramic volume. This thickness is expressed in mm.
    double volumeThickness() const;
    /// Sets the volumeThickness parameter.
    /// The thickness of the output panoramic volume. This thickness is expressed in mm.
    void setVolumeThickness( const double& volumeThickness );

    /// Gets the slabThickness parameter.
    /// Set the number of slices of the panoramic volume used to build the output panoramic image.
    uint32_t slabThickness() const;
    /// Sets the slabThickness parameter.
    /// Set the number of slices of the panoramic volume used to build the output panoramic image.
    void setSlabThickness( const uint32_t& slabThickness );

    /// Gets the sharpening parameter.
    /// The extrusion length of dental arch curve in the direction of head towards feet. This length is expressed in mm.
    double sharpening() const;
    /// Sets the sharpening parameter.
    /// The extrusion length of dental arch curve in the direction of head towards feet. This length is expressed in mm.
    void setSharpening( const double& sharpening );

    /// Gets the outputPanoramicImage parameter.
    /// The output panoramic image representing unfolded jaws. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths.
    std::shared_ptr< iolink::ImageView > outputPanoramicImage() const;
    /// Sets the outputPanoramicImage parameter.
    /// The output panoramic image representing unfolded jaws. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths.
    void setOutputPanoramicImage( std::shared_ptr< iolink::ImageView > outputPanoramicImage );

    /// Gets the outputPanoramicVolume parameter.
    /// The output panoramic volume given by unfolding the surface defined by the arch mesh. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. Its thickness is defined by the volume thickness.
    std::shared_ptr< iolink::ImageView > outputPanoramicVolume() const;
    /// Sets the outputPanoramicVolume parameter.
    /// The output panoramic volume given by unfolding the surface defined by the arch mesh. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. Its thickness is defined by the volume thickness.
    void setOutputPanoramicVolume( std::shared_ptr< iolink::ImageView > outputPanoramicVolume );

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

    # Property of the inputImage parameter.
    DentalUnfolding3d.input_image
    # Property of the inputMesh parameter.
    DentalUnfolding3d.input_mesh
    # Property of the inputDirections parameter.
    DentalUnfolding3d.input_directions
    # Property of the volumeThickness parameter.
    DentalUnfolding3d.volume_thickness
    # Property of the slabThickness parameter.
    DentalUnfolding3d.slab_thickness
    # Property of the sharpening parameter.
    DentalUnfolding3d.sharpening
    # Property of the outputPanoramicImage parameter.
    DentalUnfolding3d.output_panoramic_image
    # Property of the outputPanoramicVolume parameter.
    DentalUnfolding3d.output_panoramic_volume

    // Method to launch the command.
    execute()

    // Command constructor.
    DentalUnfolding3d()

    // Property of the inputImage parameter.
    DentalUnfolding3d.inputImage
    // Property of the inputMesh parameter.
    DentalUnfolding3d.inputMesh
    // Property of the inputDirections parameter.
    DentalUnfolding3d.inputDirections
    // Property of the volumeThickness parameter.
    DentalUnfolding3d.volumeThickness
    // Property of the slabThickness parameter.
    DentalUnfolding3d.slabThickness
    // Property of the sharpening parameter.
    DentalUnfolding3d.sharpening
    // Property of the outputPanoramicImage parameter.
    DentalUnfolding3d.outputPanoramicImage
    // Property of the outputPanoramicVolume parameter.
    DentalUnfolding3d.outputPanoramicVolume

    // Method to launch the command.
    Execute()

## Parameters

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| inputImage | The input 3D CBCT image of the head (LP orientation) to unfold. | Image | Grayscale | nullptr
| inputMesh | The quadrilateral mesh forming the surface fitted to the dental wall used to generate the output panoramic This mesh is represented as a three-dimensional array storing the coordinates of each vertex. The dimensions of this ArrayXd are [3, N, M] with : 3, the number of coordinates of a 3D point, respectively corresponding to X, Y, and Z expressed in the calibration unit. N, the number of vertices per column of the mesh (N-1 cells per column). M, the number of vertices per row of the mesh (M-1 cells per row). | ArrayXd |  | nullptr
| inputDirections | Optional direction vectors used to define the Z axis of the output volume. By default this parameter does not contain any data, which means that the algorithm will compute direction vectors as the normal vector to each vertex of the input mesh. Nevertheless, it is recommended to set the directions calculated on the initial mesh prior to fitting, at the mesh extraction step. If provided, its dimensions must be equivalent to the [3, N, M] dimensions of the inputMesh with : 3, the number of coordinates of a 3D vector, respectively corresponding to X, Y, and Z. N, the number of vertices per column of the mesh (N-1 cells per column). M, the number of vertices per row of the mesh (M-1 cells per row). | ArrayXd |  | nullptr
| volumeThickness | The thickness of the output panoramic volume. This thickness is expressed in mm. | Float64 | >=0 | 15
| slabThickness | Set the number of slices of the panoramic volume used to build the output panoramic image. | UInt32 | >=1 | 3
| sharpening | The extrusion length of dental arch curve in the direction of head towards feet. This length is expressed in mm. | Float64 | >0 | 4
| outputPanoramicImage | The output panoramic image representing unfolded jaws. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. | Image |  | nullptr
| outputPanoramicVolume | The output panoramic volume given by unfolding the surface defined by the arch mesh. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. Its thickness is defined by the volume thickness. | Image |  | nullptr

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| input_image | The input 3D CBCT image of the head (LP orientation) to unfold. | image | Grayscale | None
| input_mesh | The quadrilateral mesh forming the surface fitted to the dental wall used to generate the output panoramic This mesh is represented as a three-dimensional array storing the coordinates of each vertex. The dimensions of this ArrayXd are [3, N, M] with : 3, the number of coordinates of a 3D point, respectively corresponding to X, Y, and Z expressed in the calibration unit. N, the number of vertices per column of the mesh (N-1 cells per column). M, the number of vertices per row of the mesh (M-1 cells per row). | arrayXd |  | nullptr
| input_directions | Optional direction vectors used to define the Z axis of the output volume. By default this parameter does not contain any data, which means that the algorithm will compute direction vectors as the normal vector to each vertex of the input mesh. Nevertheless, it is recommended to set the directions calculated on the initial mesh prior to fitting, at the mesh extraction step. If provided, its dimensions must be equivalent to the [3, N, M] dimensions of the inputMesh with : 3, the number of coordinates of a 3D vector, respectively corresponding to X, Y, and Z. N, the number of vertices per column of the mesh (N-1 cells per column). M, the number of vertices per row of the mesh (M-1 cells per row). | arrayXd |  | nullptr
| volume_thickness | The thickness of the output panoramic volume. This thickness is expressed in mm. | float64 | >=0 | 15
| slab_thickness | Set the number of slices of the panoramic volume used to build the output panoramic image. | uint32 | >=1 | 3
| sharpening | The extrusion length of dental arch curve in the direction of head towards feet. This length is expressed in mm. | float64 | >0 | 4
| output_panoramic_image | The output panoramic image representing unfolded jaws. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. | image |  | None
| output_panoramic_volume | The output panoramic volume given by unfolding the surface defined by the arch mesh. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. Its thickness is defined by the volume thickness. | image |  | None

Parameter Name | Description | Type | Supported Values | Default Value
--- | --- | --- | --- | ---
| inputImage | The input 3D CBCT image of the head (LP orientation) to unfold. | Image | Grayscale | null
| inputMesh | The quadrilateral mesh forming the surface fitted to the dental wall used to generate the output panoramic This mesh is represented as a three-dimensional array storing the coordinates of each vertex. The dimensions of this ArrayXd are [3, N, M] with : 3, the number of coordinates of a 3D point, respectively corresponding to X, Y, and Z expressed in the calibration unit. N, the number of vertices per column of the mesh (N-1 cells per column). M, the number of vertices per row of the mesh (M-1 cells per row). | ArrayXd |  | nullptr
| inputDirections | Optional direction vectors used to define the Z axis of the output volume. By default this parameter does not contain any data, which means that the algorithm will compute direction vectors as the normal vector to each vertex of the input mesh. Nevertheless, it is recommended to set the directions calculated on the initial mesh prior to fitting, at the mesh extraction step. If provided, its dimensions must be equivalent to the [3, N, M] dimensions of the inputMesh with : 3, the number of coordinates of a 3D vector, respectively corresponding to X, Y, and Z. N, the number of vertices per column of the mesh (N-1 cells per column). M, the number of vertices per row of the mesh (M-1 cells per row). | ArrayXd |  | nullptr
| volumeThickness | The thickness of the output panoramic volume. This thickness is expressed in mm. | Float64 | >=0 | 15
| slabThickness | Set the number of slices of the panoramic volume used to build the output panoramic image. | UInt32 | >=1 | 3
| sharpening | The extrusion length of dental arch curve in the direction of head towards feet. This length is expressed in mm. | Float64 | >0 | 4
| outputPanoramicImage | The output panoramic image representing unfolded jaws. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. | Image |  | null
| outputPanoramicVolume | The output panoramic volume given by unfolding the surface defined by the arch mesh. The width of this volume is defined by arch curve length. Its height is defined by the sum of the lower and upper extrusion lengths. Its thickness is defined by the volume thickness. | Image |  | null

## Object Examples

    auto dental_cbct = ioformat::readImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "dental_cbct.am" );
    std::shared_ptr< iolink::ArrayXd> dental_fitted_mesh( new iolink::ArrayXd( { 0 } ) );
    readArrayXd( std::string( IMAGEDEVDATA_OBJECTS_FOLDER ) + "dental_fitted_mesh.arrayxd", dental_fitted_mesh);
    std::shared_ptr< iolink::ArrayXd> dental_directions( new iolink::ArrayXd( { 0 } ) );
    readArrayXd( std::string( IMAGEDEVDATA_OBJECTS_FOLDER ) + "dental_directions.arrayxd", dental_directions);

    DentalUnfolding3d dentalUnfolding3dAlgo;
    dentalUnfolding3dAlgo.setInputImage( dental_cbct );
    dentalUnfolding3dAlgo.setInputMesh( dental_fitted_mesh );
    dentalUnfolding3dAlgo.setInputDirections( dental_directions );
    dentalUnfolding3dAlgo.setVolumeThickness( 15 );
    dentalUnfolding3dAlgo.setSlabThickness( 3 );
    dentalUnfolding3dAlgo.setSharpening( 4 );
    dentalUnfolding3dAlgo.execute();

    std::cout << "outputPanoramicImage:" << dentalUnfolding3dAlgo.outputPanoramicImage()->toString();
    std::cout << "outputPanoramicVolume:" << dentalUnfolding3dAlgo.outputPanoramicVolume()->toString();

    dental_cbct = ioformat.read_image(imagedev_data.get_image_path("dental_cbct.am"))
    dental_fitted_mesh = np.zeros(0, dtype=np.double)
    dental_fitted_mesh = imagedev.read_array_xd(imagedev_data.get_object_path("dental_fitted_mesh.arrayxd"), dental_fitted_mesh)
    dental_directions = np.zeros(0, dtype=np.double)
    dental_directions = imagedev.read_array_xd(imagedev_data.get_object_path("dental_directions.arrayxd"), dental_directions)

    dental_unfolding_3d_algo = imagedev.DentalUnfolding3d()
    dental_unfolding_3d_algo.input_image = dental_cbct
    dental_unfolding_3d_algo.input_mesh = dental_fitted_mesh
    dental_unfolding_3d_algo.input_directions = dental_directions
    dental_unfolding_3d_algo.volume_thickness = 15
    dental_unfolding_3d_algo.slab_thickness = 3
    dental_unfolding_3d_algo.sharpening = 4
    dental_unfolding_3d_algo.execute()

    print("output_panoramic_image:", str(dental_unfolding_3d_algo.output_panoramic_image))
    print("output_panoramic_volume:", str(dental_unfolding_3d_algo.output_panoramic_volume))

    ImageView dental_cbct = ViewIO.ReadImage( @"Data/images/dental_cbct.am" );
    IOLink.ArrayXd dental_fitted_mesh = new IOLink.ArrayXd(new IOLink.VectorXu64( 0 ) ) ;
    dental_fitted_mesh = Data.ReadArrayXd( @"Data/objects/dental_fitted_mesh.arrayxd", dental_fitted_mesh );
    IOLink.ArrayXd dental_directions = new IOLink.ArrayXd(new IOLink.VectorXu64( 0 ) ) ;
    dental_directions = Data.ReadArrayXd( @"Data/objects/dental_directions.arrayxd", dental_directions );

    DentalUnfolding3d dentalUnfolding3dAlgo = new DentalUnfolding3d
    {
        inputImage = dental_cbct,
        inputMesh = dental_fitted_mesh,
        inputDirections = dental_directions,
        volumeThickness = 15,
        slabThickness = 3,
        sharpening = 4
    };
    dentalUnfolding3dAlgo.Execute();

    Console.WriteLine( "outputPanoramicImage:" + dentalUnfolding3dAlgo.outputPanoramicImage.ToString() );
    Console.WriteLine( "outputPanoramicVolume:" + dentalUnfolding3dAlgo.outputPanoramicVolume.ToString() );

## Function Examples

    auto dental_cbct = ioformat::readImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "dental_cbct.am" );
    std::shared_ptr< iolink::ArrayXd> dental_fitted_mesh( new iolink::ArrayXd( { 0 } ) );
    readArrayXd( std::string( IMAGEDEVDATA_OBJECTS_FOLDER ) + "dental_fitted_mesh.arrayxd", dental_fitted_mesh);
    std::shared_ptr< iolink::ArrayXd> dental_directions( new iolink::ArrayXd( { 0 } ) );
    readArrayXd( std::string( IMAGEDEVDATA_OBJECTS_FOLDER ) + "dental_directions.arrayxd", dental_directions);

    auto result = dentalUnfolding3d( dental_cbct, dental_fitted_mesh, dental_directions, 15, 3, 4 );

    std::cout << "outputPanoramicImage:" << result.outputPanoramicImage->toString();
    std::cout << "outputPanoramicVolume:" << result.outputPanoramicVolume->toString();

    dental_cbct = ioformat.read_image(imagedev_data.get_image_path("dental_cbct.am"))
    dental_fitted_mesh = np.zeros(0, dtype=np.double)
    dental_fitted_mesh = imagedev.read_array_xd(imagedev_data.get_object_path("dental_fitted_mesh.arrayxd"), dental_fitted_mesh)
    dental_directions = np.zeros(0, dtype=np.double)
    dental_directions = imagedev.read_array_xd(imagedev_data.get_object_path("dental_directions.arrayxd"), dental_directions)

    result_output_panoramic_image, result_output_panoramic_volume = imagedev.dental_unfolding_3d(dental_cbct, dental_fitted_mesh, dental_directions, 15, 3, 4)

    print("output_panoramic_image:", str(result_output_panoramic_image))
    print("output_panoramic_volume:", str(result_output_panoramic_volume))

    ImageView dental_cbct = ViewIO.ReadImage( @"Data/images/dental_cbct.am" );
    IOLink.ArrayXd dental_fitted_mesh = new IOLink.ArrayXd(new IOLink.VectorXu64( 0 ) ) ;
    dental_fitted_mesh = Data.ReadArrayXd( @"Data/objects/dental_fitted_mesh.arrayxd", dental_fitted_mesh );
    IOLink.ArrayXd dental_directions = new IOLink.ArrayXd(new IOLink.VectorXu64( 0 ) ) ;
    dental_directions = Data.ReadArrayXd( @"Data/objects/dental_directions.arrayxd", dental_directions );

    Processing.DentalUnfolding3dOutput result = Processing.DentalUnfolding3d( dental_cbct, dental_fitted_mesh, dental_directions, 15, 3, 4 );

    Console.WriteLine( "outputPanoramicImage:" + result.outputPanoramicImage.ToString() );
    Console.WriteLine( "outputPanoramicVolume:" + result.outputPanoramicVolume.ToString() );

© 2025 Thermo Fisher Scientific Inc. All rights reserved.