17 #ifndef __itkDisplacementFieldJacobianDeterminantFilter_txx
18 #define __itkDisplacementFieldJacobianDeterminantFilter_txx
28 #include "vnl/vnl_math.h"
33 template <
typename TInputImage,
typename TRealType,
typename TOutputImage>
37 m_UseImageSpacing =
false;
38 m_RequestedNumberOfThreads = this->GetNumberOfThreads();
39 for (
unsigned int i = 0; i < ImageDimension; i++)
41 m_NeighborhoodRadius[i] = 1;
42 m_DerivativeWeights[i] =
static_cast<TRealType
>(1.0);
43 m_HalfDerivativeWeights[i] =
static_cast<TRealType
>(0.5);
46 template <
typename TInputImage,
typename TRealType,
typename TOutputImage>
51 m_UseImageSpacing =
false;
53 for (
unsigned int i = 0; i < ImageDimension; ++i)
55 if (m_DerivativeWeights[i] != data[i])
58 m_DerivativeWeights[i] = data[i];
59 m_HalfDerivativeWeights[i] = 0.5*data[i];
64 template <
typename TInputImage,
typename TRealType,
typename TOutputImage>
69 if (m_UseImageSpacing == f)
76 if (f ==
false && m_UseImageSpacing ==
true)
78 for (
unsigned int i = 0; i < ImageDimension; ++i)
80 m_DerivativeWeights[i] =
static_cast<TRealType
>(1.0);
81 m_HalfDerivativeWeights[i] =
static_cast<TRealType
>(0.5);
85 m_UseImageSpacing = f;
89 template <
typename TInputImage,
typename TRealType,
typename TOutputImage>
95 Superclass::GenerateInputRequestedRegion();
102 if ( !inputPtr || !outputPtr )
109 typename TInputImage::RegionType inputRequestedRegion;
110 inputRequestedRegion = inputPtr->GetRequestedRegion();
113 inputRequestedRegion.PadByRadius( m_NeighborhoodRadius );
116 if ( inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()) )
118 inputPtr->SetRequestedRegion( inputRequestedRegion );
127 inputPtr->SetRequestedRegion( inputRequestedRegion );
130 InvalidRequestedRegionError e(__FILE__, __LINE__);
132 e.
SetDescription(
"Requested region is (at least partially) outside the largest possible region.");
138 template<
typename TInputImage,
typename TRealType,
typename TOutputImage >
143 Superclass::BeforeThreadedGenerateData();
148 if (m_UseImageSpacing ==
true)
151 for (
unsigned int i = 0; i < ImageDimension; i++)
153 if (static_cast<TRealType>(this->GetInput()->GetSpacing()[i]) == 0.0)
155 itkExceptionMacro(<<
"Image spacing in dimension " << i <<
" is zero.");
157 m_DerivativeWeights[i]
158 =
static_cast<TRealType
>( 1.0 /
159 static_cast<TRealType
>(this->GetInput()->GetSpacing()[i]) );
160 m_HalfDerivativeWeights[i]=0.5*m_DerivativeWeights[i];
167 if (
typeid(
typename InputImageType::PixelType ) !=
typeid(
RealVectorType ) )
171 caster->SetInput(this->GetInput());
173 m_RealValuedInputImage = caster->GetOutput();
177 m_RealValuedInputImage
183 template<
typename TInputImage,
typename TRealType,
typename TOutputImage >
196 FaceListType faceList;
198 faceList = bC(dynamic_cast<const RealVectorImageType *>(m_RealValuedInputImage.GetPointer()),
199 outputRegionForThread, m_NeighborhoodRadius);
202 FaceListType::iterator fit;
203 fit = faceList.begin();
206 ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels());
211 for (fit=faceList.begin(); fit != faceList.end(); ++fit)
214 dynamic_cast<const RealVectorImageType *>(m_RealValuedInputImage.GetPointer()),
222 it.
Set( static_cast<OutputPixelType>( this->EvaluateAtNeighborhood(bit) ) );
225 progress.CompletedPixel();
230 template <
typename TInputImage,
typename TRealType,
typename TOutputImage>
235 vnl_matrix_fixed<TRealType,ImageDimension,VectorDimension> J;
236 for (
unsigned int i = 0; i < ImageDimension; ++i)
238 for (
unsigned int j = 0; j < VectorDimension; ++j)
248 template <
typename TInputImage,
typename TRealType,
typename TOutputImage>
254 Superclass::PrintSelf(os,indent);
255 os << indent <<
"m_UseImageSpacing = " << m_UseImageSpacing
257 os << indent <<
"m_RequestedNumberOfThreads = " << m_RequestedNumberOfThreads
259 os << indent <<
"m_DerivativeWeights = ";
260 for (i = 0; i < ImageDimension; i++)
261 { os << m_DerivativeWeights[i] <<
" "; }
263 os << indent <<
"m_HalfDerivativeWeights = ";
264 for (i = 0; i < ImageDimension; i++)
265 { os << m_HalfDerivativeWeights[i] <<
" "; }
267 os << indent <<
"m_NeighborhoodRadius = " << m_NeighborhoodRadius
269 os << indent <<
"m_RealValuedInputImage = " << m_RealValuedInputImage.GetPointer()