Skip to content

Libs/Alignment/Procrustes3D.h

Classes

Name
struct SimilarityTransform3D
class Procrustes3D

Source code

/*=========================================================================
  Program:   ShapeWorks: Particle-based Shape Correspondence & Visualization
  Module:    $RCSfile: Procrustes3D.h,v $
  Date:      $Date: 2009/05/06 21:49:15 $
  Version:   $Revision: 1.1.1.1 $
  Author:    $Author: cates $

  Copyright (c) 2009 Scientific Computing and Imaging Institute.
  See ShapeWorksLicense.txt for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.

     updated by Shireen Elhabian (Dec. 2013)
     consolidated with ITKParticleSystem/Procrustes  (Shireen Aug 2019)
=========================================================================*/
#ifndef __Procrustes3D_h
#define __Procrustes3D_h

#include <vector>
#include <vnl/vnl_matrix.h>
#include <vnl/vnl_vector_fixed.h>
#include <vnl/vnl_matrix_fixed.h>

struct SimilarityTransform3D
{
    vnl_matrix_fixed<double, 3, 3> rotation;
    double scale;
    vnl_vector_fixed<double, 3> translation;
};

class Procrustes3D
{
public:
    typedef double RealType;
    typedef vnl_vector_fixed<double, 3> PointType;
    typedef std::vector<PointType> ShapeType;
    typedef ShapeType::iterator ShapeIteratorType;

    typedef std::vector<ShapeType> ShapeListType;
    typedef ShapeListType::iterator ShapeListIteratorType;

    typedef std::vector<SimilarityTransform3D> SimilarityTransformListType;
    typedef SimilarityTransformListType::iterator
    SimilarityTransformListIteratorType;

    typedef vnl_matrix_fixed<double, 3+1, 3+1> TransformMatrixType;
    typedef std::vector<TransformMatrixType> TransformMatrixListType;
    typedef TransformMatrixListType::iterator TransformMatrixIteratorType;

    Procrustes3D() : m_Scaling(true), m_RotationTranslation(true) { }
    Procrustes3D(bool do_scaling, bool do_rotation_translation) : m_Scaling(do_scaling), m_RotationTranslation(do_rotation_translation) { }

    bool GetScaling() const
    { return m_Scaling; }
    void ScalingOn()
    { m_Scaling = true; }
    void ScalingOff()
    { m_Scaling = false; }

    bool GetRotationTranslation() const
    { return m_RotationTranslation; }
    void RotationTranslationOn()
    { m_RotationTranslation = true; }
    void RotationTranslationOff()
    { m_RotationTranslation = false; }

    // Align a list of shapes using Generalized Procrustes Analysis
    void AlignShapes(SimilarityTransformListType & transforms,
                     ShapeListType & shapes);

    void RemoveTranslation(SimilarityTransformListType & transforms,
                           ShapeListType & shapes);

    // Helper function to transform a shape by a similarity transform
    static void TransformShape(ShapeType & shape,
                               SimilarityTransform3D & transform);

    // Helper function to transform a list of shapes by a list of transforms
    static void TransformShapes(ShapeListType & shapes,
                                SimilarityTransformListType & transforms);

    static RealType ComputeSumOfSquares(ShapeListType & shapes);

    // Transform from Configuration space to Procrustes space.  Translation
    // followed by rotation and scaling.
    void ConstructTransformMatrices(SimilarityTransformListType & transforms,TransformMatrixListType & transformMatrices);
    void ConstructTransformMatrix(SimilarityTransform3D & transform,TransformMatrixType & transformMatrix);

    void ComputeMeanShape(ShapeType & mean, ShapeListType & shapeList);
    void ComputeCenterOfMass(ShapeType & shape, PointType& center);
    void CenterShape(ShapeType & shape);

    // this is the center which needed for translation of the shapes to coincide on the image origin
    // so that the whole object is in the image and won't go outside
    void ComputeCommonCenter(SimilarityTransformListType & transforms,PointType& center);

    // Align source shape to target using Ordinary Procrustes Analysis (translation, scaling and rotation)
    // the target shape is assumed to be centered at the origin
    void AlignSourceToTarget(SimilarityTransform3D & transform,
                        ShapeType & target, ShapeType & source);

    /* The median shape is
         defined as the shape with the minimum sum of Euclidean L1 norms to all
         other shapes in that group.  */
    int ComputeMedianShape(ShapeListType & shapeList);


private:

    // Align two shapes (rotation & scale) using Ordinary Procrustes Analysis
    void AlignTwoShapes(SimilarityTransform3D & transform,
                        ShapeType & shape1, ShapeType & shape2);

    //  const RealType SOS_EPSILON = 1.0e-8;

    bool m_Scaling; // a flag to factor out scaling
    bool m_RotationTranslation; // a flag for rotation + translation + (scale depending on m_Scaling), if false, the transformation will only be scaling
};



#endif

Updated on 2022-03-31 at 09:51:19 -0600