Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __itkBSplineDeformableTransformInitializer_txx
00019 #define __itkBSplineDeformableTransformInitializer_txx
00020
00021 #include "itkBSplineDeformableTransformInitializer.h"
00022
00023 namespace itk
00024 {
00025
00026
00027 template < class TTransform, class TImage >
00028 BSplineDeformableTransformInitializer<TTransform, TImage >
00029 ::BSplineDeformableTransformInitializer()
00030 {
00031 this->m_GridSizeInsideTheImage.Fill( 5 );
00032 }
00033
00034
00035 template < class TTransform, class TImage >
00036 void
00037 BSplineDeformableTransformInitializer<TTransform, TImage >
00038 ::InitializeTransform() const
00039 {
00040
00041 if( ! this->m_Image )
00042 {
00043 itkExceptionMacro( "Reference Image has not been set" );
00044 return;
00045 }
00046
00047 if( ! this->m_Transform )
00048 {
00049 itkExceptionMacro( "Transform has not been set" );
00050 return;
00051 }
00052
00053
00054 if( this->m_Image->GetSource() )
00055 {
00056 this->m_Image->GetSource()->Update();
00057 }
00058
00059 typedef typename TransformType::RegionType RegionType;
00060
00061 typename RegionType::SizeType numberOfGridNodesOutsideTheImageSupport;
00062 typename RegionType::SizeType totalGridSize;
00063
00064 numberOfGridNodesOutsideTheImageSupport.Fill( TransformType::SplineOrder );
00065
00066 totalGridSize = this->m_GridSizeInsideTheImage;
00067 totalGridSize += numberOfGridNodesOutsideTheImageSupport;
00068
00069 RegionType gridRegion;
00070 gridRegion.SetSize( totalGridSize );
00071
00072 typedef typename TransformType::SpacingType SpacingType;
00073 const SpacingType & imageSpacing = this->m_Image->GetSpacing();
00074
00075 typedef typename TransformType::OriginType OriginType;
00076 const OriginType & imageOrigin = this->m_Image->GetOrigin();;
00077
00078 const typename TransformType::RegionType & imageRegion =
00079 this->m_Image->GetLargestPossibleRegion();
00080
00081 typename ImageType::SizeType fixedImageSize = imageRegion.GetSize();
00082
00083 SpacingType gridSpacing;
00084 SpacingType gridOriginShift;
00085
00086 const unsigned int orderShift = TransformType::SplineOrder / 2;
00087
00088 for( unsigned int r = 0; r < SpaceDimension; r++ )
00089 {
00090 const unsigned int numberOfGridCells = this->m_GridSizeInsideTheImage[r] - 1;
00091 const unsigned int numberOfImagePixels = fixedImageSize[r];
00092
00093 gridSpacing[r] = imageSpacing[r] *
00094 static_cast<double>(numberOfImagePixels) /
00095 static_cast<double>(numberOfGridCells);
00096
00097
00098 const double imageSupportShift = - imageSpacing[r] / 2.0;
00099
00100
00101
00102 const double gridSupportShift = -1.0 * gridSpacing[r] * orderShift;
00103
00104
00105
00106 gridOriginShift[r] = gridSupportShift + imageSupportShift;
00107 }
00108
00109 typename ImageType::DirectionType gridDirection = this->m_Image->GetDirection();
00110 SpacingType gridOriginOffset = gridDirection * gridOriginShift;
00111
00112 OriginType gridOrigin = imageOrigin + gridOriginOffset;
00113
00114 this->m_Transform->SetGridRegion( gridRegion );
00115 this->m_Transform->SetGridOrigin( gridOrigin );
00116 this->m_Transform->SetGridSpacing( gridSpacing );
00117 this->m_Transform->SetGridDirection( gridDirection );
00118 }
00119
00120
00121 template < class TTransform, class TImage >
00122 void
00123 BSplineDeformableTransformInitializer<TTransform, TImage >
00124 ::PrintSelf(std::ostream& os, Indent indent) const
00125 {
00126 Superclass::PrintSelf(os,indent);
00127
00128 os << indent << "Transform = " << std::endl;
00129 if( this->m_Transform )
00130 {
00131 os << indent << this->m_Transform << std::endl;
00132 }
00133 else
00134 {
00135 os << indent << "None" << std::endl;
00136 }
00137
00138 os << indent << "Image = " << std::endl;
00139 if( this->m_Image )
00140 {
00141 os << indent << this->m_Image << std::endl;
00142 }
00143 else
00144 {
00145 os << indent << "None" << std::endl;
00146 }
00147
00148 }
00149
00150 }
00151
00152 #endif