17 #ifndef __itkOptImageToImageMetric_txx
18 #define __itkOptImageToImageMetric_txx
31 template <
class TFixedImage,
class TMovingImage>
35 m_NumberOfFixedImageSamples = 50000;
36 m_UseAllPixels =
false;
37 m_UseSequentialSampling =
false;
38 m_UseFixedImageIndexes =
false;
39 m_UseFixedImageSamplesIntensityThreshold =
false;
40 m_FixedImageSamplesIntensityThreshold = 0;
41 m_ReseedIterator =
false;
44 m_TransformIsBSpline =
false;
45 m_NumBSplineWeights = 0;
46 m_BSplineTransform =
NULL;
48 m_Threader = MultiThreaderType::New();
49 m_ThreaderParameter.metric =
this;
50 m_ThreaderNumberOfMovingImageSamples =
NULL;
51 m_WithinThreadPreProcess =
false;
52 m_WithinThreadPostProcess =
false;
58 m_MovingImageMask = 0;
59 m_NumberOfPixelsCounted = 0;
62 m_ThreaderTransform =
NULL;
67 m_ComputeGradient =
true;
68 m_GradientImage =
NULL;
70 m_InterpolatorIsBSpline =
false;
71 m_BSplineInterpolator =
NULL;
72 m_DerivativeCalculator =
NULL;
74 m_NumberOfThreads = m_Threader->GetNumberOfThreads();
76 this->m_ThreaderBSplineTransformWeights =
NULL;
77 this->m_ThreaderBSplineTransformIndices =
NULL;
79 this->m_UseCachingOfBSplineWeights =
true;
92 template <
class TFixedImage,
class TMovingImage>
97 if(m_ThreaderNumberOfMovingImageSamples !=
NULL)
99 delete [] m_ThreaderNumberOfMovingImageSamples;
101 m_ThreaderNumberOfMovingImageSamples =
NULL;
103 if(m_ThreaderTransform !=
NULL)
105 delete [] m_ThreaderTransform;
107 m_ThreaderTransform =
NULL;
109 if( this->m_ThreaderBSplineTransformWeights !=
NULL )
111 delete [] this->m_ThreaderBSplineTransformWeights;
113 this->m_ThreaderBSplineTransformWeights =
NULL;
115 if( this->m_ThreaderBSplineTransformIndices !=
NULL )
117 delete [] this->m_ThreaderBSplineTransformIndices;
119 this->m_ThreaderBSplineTransformIndices =
NULL;
126 template <
class TFixedImage,
class TMovingImage>
131 m_Threader->SetNumberOfThreads( numberOfThreads);
132 m_NumberOfThreads = m_Threader->GetNumberOfThreads();
138 template <
class TFixedImage,
class TMovingImage>
145 itkExceptionMacro(<<
"Transform has not been assigned");
147 m_Transform->SetParameters( parameters );
149 m_Parameters = parameters;
152 template <
class TFixedImage,
class TMovingImage>
157 if( numSamples != m_NumberOfFixedImageSamples )
159 m_NumberOfFixedImageSamples = numSamples;
160 if( m_NumberOfFixedImageSamples != this->m_FixedImageRegion.GetNumberOfPixels() )
162 this->SetUseAllPixels(
false );
168 template <
class TFixedImage,
class TMovingImage>
173 this->SetUseFixedImageIndexes(
true );
174 m_NumberOfFixedImageSamples = indexes.size();
175 m_FixedImageIndexes.resize( m_NumberOfFixedImageSamples );
176 for(
unsigned int i=0; i<m_NumberOfFixedImageSamples; i++)
178 m_FixedImageIndexes[i] = indexes[i];
182 template <
class TFixedImage,
class TMovingImage>
187 if( useIndexes != m_UseFixedImageIndexes )
189 m_UseFixedImageIndexes = useIndexes;
190 if( m_UseFixedImageIndexes )
192 this->SetUseAllPixels(
false );
201 template <
class TFixedImage,
class TMovingImage>
206 if( thresh != m_FixedImageSamplesIntensityThreshold )
208 m_FixedImageSamplesIntensityThreshold = thresh;
209 this->SetUseFixedImageSamplesIntensityThreshold(
true );
214 template <
class TFixedImage,
class TMovingImage>
219 if( useThresh != m_UseFixedImageSamplesIntensityThreshold )
221 m_UseFixedImageSamplesIntensityThreshold = useThresh;
222 if( m_UseFixedImageSamplesIntensityThreshold )
224 this->SetUseAllPixels(
false );
233 template <
class TFixedImage,
class TMovingImage>
238 if( reg != m_FixedImageRegion )
240 m_FixedImageRegion = reg;
241 if( this->GetUseAllPixels() )
243 this->SetNumberOfFixedImageSamples( this->m_FixedImageRegion.GetNumberOfPixels() );
248 template <
class TFixedImage,
class TMovingImage>
253 if( useAllPixels != m_UseAllPixels )
255 m_UseAllPixels = useAllPixels;
258 this->SetUseFixedImageSamplesIntensityThreshold(
false );
259 this->SetNumberOfFixedImageSamples( this->m_FixedImageRegion.GetNumberOfPixels() );
260 this->SetUseSequentialSampling(
true );
264 this->SetUseSequentialSampling(
false );
271 template <
class TFixedImage,
class TMovingImage>
276 if( useSequential != m_UseSequentialSampling )
278 m_UseSequentialSampling = useSequential;
279 if( !m_UseSequentialSampling )
281 this->SetUseAllPixels(
false );
293 template <
class TFixedImage,
class TMovingImage>
301 itkExceptionMacro(<<
"Transform is not present");
303 m_NumberOfParameters = m_Transform->GetNumberOfParameters();
305 if( !m_Interpolator )
307 itkExceptionMacro(<<
"Interpolator is not present");
312 itkExceptionMacro(<<
"MovingImage is not present");
317 itkExceptionMacro(<<
"FixedImage is not present");
320 if( m_FixedImageRegion.GetNumberOfPixels() == 0 )
322 itkExceptionMacro(<<
"FixedImageRegion is empty");
326 if( m_MovingImage->GetSource() )
328 m_MovingImage->GetSource()->Update();
332 if( m_FixedImage->GetSource() )
334 m_FixedImage->GetSource()->Update();
338 if ( !m_FixedImageRegion.Crop( m_FixedImage->GetBufferedRegion() ) )
341 <<
"FixedImageRegion does not overlap the fixed image buffered region" );
344 m_Interpolator->SetInputImage( m_MovingImage );
346 if ( m_ComputeGradient )
353 this->InvokeEvent( InitializeEvent() );
361 template <
class TFixedImage,
class TMovingImage>
367 m_Threader->SetNumberOfThreads( m_NumberOfThreads );
369 if(m_ThreaderNumberOfMovingImageSamples !=
NULL)
371 delete [] m_ThreaderNumberOfMovingImageSamples;
373 m_ThreaderNumberOfMovingImageSamples =
new unsigned int[m_NumberOfThreads-1];
376 if(m_ThreaderTransform !=
NULL)
378 delete [] m_ThreaderTransform;
381 for(
unsigned int ithread=0; ithread < m_NumberOfThreads-1; ++ithread)
392 transformCopy->
SetParameters( this->m_Transform->GetParameters() );
393 this->m_ThreaderTransform[ithread] = transformCopy;
396 m_FixedImageSamples.resize( m_NumberOfFixedImageSamples );
397 if( m_UseSequentialSampling )
403 SampleFullFixedImageRegion( m_FixedImageSamples );
407 if( m_UseFixedImageIndexes )
413 SampleFixedImageIndexes( m_FixedImageSamples );
421 SampleFixedImageRegion( m_FixedImageSamples );
431 m_InterpolatorIsBSpline =
true;
434 this->m_Interpolator.GetPointer() );
437 m_InterpolatorIsBSpline =
false;
439 m_DerivativeCalculator = DerivativeFunctionType::New();
441 #ifdef ITK_USE_ORIENTED_IMAGE_DIRECTION
442 m_DerivativeCalculator->UseImageDirectionOn();
445 m_DerivativeCalculator->SetInputImage( this->m_MovingImage );
447 m_BSplineInterpolator =
NULL;
448 itkDebugMacro(
"Interpolator is not BSpline" );
452 m_BSplineInterpolator = testPtr;
455 #ifdef ITK_USE_ORIENTED_IMAGE_DIRECTION
456 m_BSplineInterpolator->UseImageDirectionOn();
459 m_DerivativeCalculator =
NULL;
460 itkDebugMacro(
"Interpolator is BSpline" );
473 m_TransformIsBSpline =
true;
476 this->m_Transform.GetPointer() );
479 m_TransformIsBSpline =
false;
480 m_BSplineTransform =
NULL;
481 itkDebugMacro(
"Transform is not BSplineDeformable" );
485 m_BSplineTransform = testPtr2;
487 itkDebugMacro(
"Transform is BSplineDeformable" );
490 if( this->m_TransformIsBSpline )
493 this->m_BSplineTransformWeightsArray.SetSize( 1, 1 );
494 this->m_BSplineTransformIndicesArray.SetSize( 1, 1 );
495 this->m_BSplinePreTransformPointsArray.resize( 1 );
496 this->m_WithinBSplineSupportRegionArray.resize( 1 );
497 this->m_BSplineTransformWeights.SetSize( 1 );
498 this->m_BSplineTransformIndices.SetSize( 1 );
500 if( this->m_ThreaderBSplineTransformWeights !=
NULL )
502 delete [] this->m_ThreaderBSplineTransformWeights;
504 this->m_ThreaderBSplineTransformWeights =
NULL;
506 if( this->m_ThreaderBSplineTransformIndices !=
NULL )
508 delete [] this->m_ThreaderBSplineTransformIndices;
510 this->m_ThreaderBSplineTransformIndices =
NULL;
512 if( this->m_UseCachingOfBSplineWeights )
514 m_BSplineTransformWeightsArray.SetSize(
515 m_NumberOfFixedImageSamples, m_NumBSplineWeights );
516 m_BSplineTransformIndicesArray.SetSize(
517 m_NumberOfFixedImageSamples, m_NumBSplineWeights );
518 m_BSplinePreTransformPointsArray.resize( m_NumberOfFixedImageSamples );
519 m_WithinBSplineSupportRegionArray.resize( m_NumberOfFixedImageSamples );
521 this->PreComputeTransformValues();
525 this->m_BSplineTransformWeights.SetSize( this->m_NumBSplineWeights );
526 this->m_BSplineTransformIndices.SetSize( this->m_NumBSplineWeights );
531 for(
unsigned int ithread=0; ithread < m_NumberOfThreads-1; ++ithread)
533 this->m_ThreaderBSplineTransformWeights[ithread].
SetSize( this->m_NumBSplineWeights );
534 this->m_ThreaderBSplineTransformIndices[ithread].SetSize( this->m_NumBSplineWeights );
538 for (
unsigned int j = 0; j < FixedImageDimension; j++ )
540 this->m_BSplineParametersOffset[j] = j * this->m_BSplineTransform->GetNumberOfParametersPerDimension();
550 template <
class TFixedImage,
class TMovingImage >
555 typename FixedImageSampleContainer::iterator iter;
557 unsigned long len = m_FixedImageIndexes.size();
558 if( len != m_NumberOfFixedImageSamples
559 || samples.size() != m_NumberOfFixedImageSamples )
561 throw ExceptionObject(__FILE__, __LINE__,
562 "Index list size does not match desired number of samples" );
565 iter=samples.begin();
566 for(
unsigned long i=0; i<len; i++)
571 m_FixedImage->TransformIndexToPhysicalPoint( index, (*iter).point );
574 (*iter).value = m_FixedImage->GetPixel( index );
575 (*iter).valueIndex = 0;
584 template <
class TFixedImage,
class TMovingImage >
589 if( samples.size() != m_NumberOfFixedImageSamples )
591 throw ExceptionObject(__FILE__, __LINE__,
592 "Sample size does not match desired number of samples" );
597 RandomIterator randIter( m_FixedImage, GetFixedImageRegion() );
599 typename FixedImageSampleContainer::iterator iter;
600 typename FixedImageSampleContainer::const_iterator end=samples.end();
602 if( m_FixedImageMask.IsNotNull()
603 || m_UseFixedImageSamplesIntensityThreshold )
607 iter=samples.begin();
608 unsigned long int samplesFound = 0;
609 randIter.SetNumberOfSamples( m_NumberOfFixedImageSamples * 1000 );
610 randIter.GoToBegin();
613 if( randIter.IsAtEnd() )
619 unsigned long int count = 0;
622 (*iter).point = samples[count].point;
623 (*iter).value = samples[count].value;
624 (*iter).valueIndex = 0;
626 if(count >= samplesFound)
638 m_FixedImage->TransformIndexToPhysicalPoint( index, inputPoint );
640 if( m_FixedImageMask.IsNotNull() )
643 if( m_FixedImageMask->ValueAt( inputPoint, val ) )
658 if( m_UseFixedImageSamplesIntensityThreshold &&
659 randIter.Get() < m_FixedImageSamplesIntensityThreshold )
666 (*iter).point = inputPoint;
668 (*iter).value = randIter.Get();
669 (*iter).valueIndex = 0;
678 randIter.SetNumberOfSamples( m_NumberOfFixedImageSamples );
679 randIter.GoToBegin();
680 for( iter=samples.begin(); iter != end; ++iter )
685 m_FixedImage->TransformIndexToPhysicalPoint( index,
688 (*iter).value = randIter.Get();
689 (*iter).valueIndex = 0;
700 template <
class TFixedImage,
class TMovingImage >
706 if( samples.size() != m_NumberOfFixedImageSamples )
708 throw ExceptionObject(__FILE__, __LINE__,
709 "Sample size does not match desired number of samples" );
714 RegionIterator regionIter( m_FixedImage, GetFixedImageRegion() );
716 regionIter.GoToBegin();
718 typename FixedImageSampleContainer::iterator iter;
719 typename FixedImageSampleContainer::const_iterator end=samples.end();
721 if( m_FixedImageMask.IsNotNull()
722 || m_UseFixedImageSamplesIntensityThreshold )
727 iter=samples.begin();
733 m_FixedImage->TransformIndexToPhysicalPoint( index, inputPoint );
735 if( m_FixedImageMask.IsNotNull() )
738 if( !m_FixedImageMask->IsInside( inputPoint ) )
741 if( regionIter.IsAtEnd() )
743 regionIter.GoToBegin();
749 if( m_UseFixedImageSamplesIntensityThreshold &&
750 regionIter.Get() < m_FixedImageSamplesIntensityThreshold )
753 if( regionIter.IsAtEnd() )
755 regionIter.GoToBegin();
761 (*iter).point = inputPoint;
763 (*iter).value = regionIter.Get();
764 (*iter).valueIndex = 0;
767 if( regionIter.IsAtEnd() )
769 regionIter.GoToBegin();
776 for( iter=samples.begin(); iter != end; ++iter )
782 m_FixedImage->TransformIndexToPhysicalPoint( index,
785 (*iter).value = regionIter.Get();
786 (*iter).valueIndex = 0;
789 if( regionIter.IsAtEnd() )
791 regionIter.GoToBegin();
800 template <
class TFixedImage,
class TMovingImage>
805 GradientImageFilterPointer gradientFilter = GradientImageFilterType::New();
807 gradientFilter->SetInput( m_MovingImage );
809 const typename MovingImageType::SpacingType & spacing = m_MovingImage
811 double maximumSpacing=0.0;
812 for(
unsigned int i=0; i<MovingImageDimension; i++)
814 if( spacing[i] > maximumSpacing )
816 maximumSpacing = spacing[i];
819 gradientFilter->SetSigma( maximumSpacing );
820 gradientFilter->SetNormalizeAcrossScale(
true );
821 gradientFilter->SetNumberOfThreads( m_NumberOfThreads );
823 #ifdef ITK_USE_ORIENTED_IMAGE_DIRECTION
824 gradientFilter->SetUseImageDirection(
true );
827 gradientFilter->Update();
829 m_GradientImage = gradientFilter->GetOutput();
833 template <
class TFixedImage,
class TMovingImage >
void
841 template <
class TFixedImage,
class TMovingImage >
void
853 template <
class TFixedImage,
class TMovingImage >
875 dummyParameters.
Fill( 0.0 );
876 m_Transform->SetParameters( dummyParameters );
885 typename FixedImageSampleContainer::const_iterator fiter;
886 typename FixedImageSampleContainer::const_iterator fend =
887 m_FixedImageSamples.end();
888 unsigned long counter = 0;
890 for( fiter = m_FixedImageSamples.begin(); fiter != fend; ++fiter, counter++ )
892 m_BSplineTransform->TransformPoint( m_FixedImageSamples[counter].point,
893 mappedPoint, weights, indices, valid );
895 for(
unsigned long k = 0; k < m_NumBSplineWeights; k++ )
897 m_BSplineTransformWeightsArray[counter][k] = weights[k];
898 m_BSplineTransformIndicesArray[counter][k] = indices[k];
901 m_BSplinePreTransformPointsArray[counter] = mappedPoint;
902 m_WithinBSplineSupportRegionArray[counter] = valid;
914 template <
class TFixedImage,
class TMovingImage >
920 double & movingImageValue,
921 unsigned int threadID )
const
928 transform = this->m_ThreaderTransform[threadID-1];
932 transform = this->m_Transform;
935 if ( !m_TransformIsBSpline )
938 mappedPoint = transform->
TransformPoint( m_FixedImageSamples[sampleNumber].point );
943 if( this->m_UseCachingOfBSplineWeights )
945 sampleOk = m_WithinBSplineSupportRegionArray[sampleNumber];
952 m_BSplineTransformWeightsArray[sampleNumber];
954 m_BSplineTransformIndicesArray[sampleNumber];
956 for(
unsigned int j = 0; j < FixedImageDimension; j++ )
958 mappedPoint[j] = m_BSplinePreTransformPointsArray[sampleNumber][j];
961 for (
unsigned int k = 0; k < m_NumBSplineWeights; k++ )
963 for (
unsigned int j = 0; j < FixedImageDimension; j++ )
965 mappedPoint[j] += weights[k] * m_Parameters[ indices[k]
966 + m_BSplineParametersOffset[j] ];
978 weightsHelper = &(this->m_ThreaderBSplineTransformWeights[threadID-1]);
979 indicesHelper = &(this->m_ThreaderBSplineTransformIndices[threadID-1]);
983 weightsHelper = &(this->m_BSplineTransformWeights);
984 indicesHelper = &(this->m_BSplineTransformIndices);
989 this->m_BSplineTransform->TransformPoint(
990 this->m_FixedImageSamples[sampleNumber].point,
991 mappedPoint, *weightsHelper, *indicesHelper, sampleOk);
998 if ( m_MovingImageMask )
1002 sampleOk = sampleOk && m_MovingImageMask->IsInside( mappedPoint );
1006 if( m_InterpolatorIsBSpline )
1009 sampleOk = sampleOk && m_BSplineInterpolator->IsInsideBuffer( mappedPoint );
1012 movingImageValue = m_BSplineInterpolator->Evaluate( mappedPoint, threadID );
1018 sampleOk = sampleOk && m_Interpolator->IsInsideBuffer( mappedPoint );
1021 movingImageValue = m_Interpolator->Evaluate( mappedPoint );
1032 template <
class TFixedImage,
class TMovingImage >
1038 double& movingImageValue,
1040 unsigned int threadID )
const
1047 transform = this->m_ThreaderTransform[threadID-1];
1051 transform = this->m_Transform;
1054 if ( !m_TransformIsBSpline )
1057 mappedPoint = transform->
TransformPoint( m_FixedImageSamples[sampleNumber].point );
1062 if( this->m_UseCachingOfBSplineWeights )
1064 sampleOk = m_WithinBSplineSupportRegionArray[sampleNumber];
1071 m_BSplineTransformWeightsArray[sampleNumber];
1073 m_BSplineTransformIndicesArray[sampleNumber];
1075 for(
unsigned int j = 0; j < FixedImageDimension; j++ )
1077 mappedPoint[j] = m_BSplinePreTransformPointsArray[sampleNumber][j];
1080 for (
unsigned int k = 0; k < m_NumBSplineWeights; k++ )
1082 for (
unsigned int j = 0; j < FixedImageDimension; j++ )
1084 mappedPoint[j] += weights[k] * m_Parameters[ indices[k]
1085 + m_BSplineParametersOffset[j] ];
1097 weightsHelper = &(this->m_ThreaderBSplineTransformWeights[threadID-1]);
1098 indicesHelper = &(this->m_ThreaderBSplineTransformIndices[threadID-1]);
1102 weightsHelper = &(this->m_BSplineTransformWeights);
1103 indicesHelper = &(this->m_BSplineTransformIndices);
1108 this->m_BSplineTransform->TransformPoint(
1109 this->m_FixedImageSamples[sampleNumber].point,
1110 mappedPoint, *weightsHelper, *indicesHelper, sampleOk);
1117 if ( m_MovingImageMask )
1121 sampleOk = sampleOk && m_MovingImageMask->IsInside( mappedPoint );
1125 if( m_InterpolatorIsBSpline )
1128 sampleOk = sampleOk && m_BSplineInterpolator->IsInsideBuffer( mappedPoint );
1131 this->m_BSplineInterpolator->EvaluateValueAndDerivative(mappedPoint,
1133 movingImageGradient,
1140 sampleOk = sampleOk && m_Interpolator->IsInsideBuffer( mappedPoint );
1143 this->ComputeImageDerivatives( mappedPoint, movingImageGradient, threadID );
1144 movingImageValue = this->m_Interpolator->Evaluate( mappedPoint );
1155 template <
class TFixedImage,
class TMovingImage >
1160 unsigned int threadID)
const
1163 if( m_InterpolatorIsBSpline )
1166 gradient = m_BSplineInterpolator->EvaluateDerivative( mappedPoint,
1171 if ( m_ComputeGradient )
1174 m_MovingImage->TransformPhysicalPointToContinuousIndex( mappedPoint,
1177 mappedIndex.CopyWithRound( tempIndex );
1178 gradient = m_GradientImage->GetPixel( mappedIndex );
1183 gradient = m_DerivativeCalculator->Evaluate( mappedPoint );
1189 template <
class TFixedImage,
class TMovingImage >
1194 this->SynchronizeTransforms();
1196 m_Threader->SetSingleMethod(GetValueMultiThreadedPreProcess,
1197 (
void *)(&m_ThreaderParameter));
1198 m_Threader->SingleMethodExecute();
1201 template <
class TFixedImage,
class TMovingImage >
1207 this->SynchronizeTransforms();
1209 m_Threader->SetSingleMethod(GetValueMultiThreaded,
1210 const_cast<void *>(static_cast<const void *>(&m_ThreaderParameter)));
1211 m_Threader->SingleMethodExecute();
1213 for(
unsigned int threadID = 0; threadID<m_NumberOfThreads-1; threadID++ )
1215 this->m_NumberOfPixelsCounted += m_ThreaderNumberOfMovingImageSamples[threadID];
1219 template <
class TFixedImage,
class TMovingImage >
1224 m_Threader->SetSingleMethod(GetValueMultiThreadedPostProcess,
1225 const_cast<void *>(static_cast<const void *>(&m_ThreaderParameter)));
1226 m_Threader->SingleMethodExecute();
1232 template <
class TFixedImage,
class TMovingImage >
1254 template <
class TFixedImage,
class TMovingImage >
1274 template <
class TFixedImage,
class TMovingImage >
1293 template <
class TFixedImage,
class TMovingImage >
1299 int chunkSize = m_NumberOfFixedImageSamples / m_NumberOfThreads;
1302 unsigned int fixedImageSample = threadID * chunkSize;
1304 if(threadID == m_NumberOfThreads - 1)
1306 chunkSize = m_NumberOfFixedImageSamples
1307 - ((m_NumberOfThreads-1)
1313 if(m_WithinThreadPreProcess)
1315 this->GetValueThreadPreProcess(threadID,
true);
1321 double movingImageValue;
1322 for(
int count=0; count < chunkSize; ++count, ++fixedImageSample )
1325 this->TransformPoint( fixedImageSample, mappedPoint, sampleOk, movingImageValue,
1331 if(GetValueThreadProcessSample(threadID, fixedImageSample,
1332 mappedPoint, movingImageValue))
1341 m_ThreaderNumberOfMovingImageSamples[threadID-1] = numSamples;
1345 m_NumberOfPixelsCounted = numSamples;
1348 if(m_WithinThreadPostProcess)
1350 this->GetValueThreadPostProcess(threadID,
true);
1354 template <
class TFixedImage,
class TMovingImage >
1359 this->SynchronizeTransforms();
1361 m_Threader->SetSingleMethod(GetValueAndDerivativeMultiThreadedPreProcess,
1362 (
void *)(&m_ThreaderParameter));
1363 m_Threader->SingleMethodExecute();
1366 template <
class TFixedImage,
class TMovingImage >
1371 this->SynchronizeTransforms();
1373 m_Threader->SetSingleMethod(GetValueAndDerivativeMultiThreaded,
1374 const_cast<void *>(static_cast<const void *>(&m_ThreaderParameter)));
1375 m_Threader->SingleMethodExecute();
1377 for(
unsigned int threadID = 0; threadID<m_NumberOfThreads-1; threadID++ )
1379 this->m_NumberOfPixelsCounted += m_ThreaderNumberOfMovingImageSamples[threadID];
1383 template <
class TFixedImage,
class TMovingImage >
1388 m_Threader->SetSingleMethod(GetValueAndDerivativeMultiThreadedPostProcess,
1389 (
void *)(&m_ThreaderParameter));
1390 m_Threader->SingleMethodExecute();
1396 template <
class TFixedImage,
class TMovingImage >
1417 template <
class TFixedImage,
class TMovingImage >
1438 template <
class TFixedImage,
class TMovingImage >
1456 template <
class TFixedImage,
class TMovingImage >
1462 int chunkSize = m_NumberOfFixedImageSamples / m_NumberOfThreads;
1465 unsigned int fixedImageSample = threadID * chunkSize;
1467 if(threadID == m_NumberOfThreads - 1)
1469 chunkSize = m_NumberOfFixedImageSamples
1470 - ((m_NumberOfThreads-1)
1476 if(m_WithinThreadPreProcess)
1478 this->GetValueAndDerivativeThreadPreProcess(threadID,
true);
1484 double movingImageValue;
1486 for(
int count=0; count < chunkSize; ++count, ++fixedImageSample )
1489 TransformPointWithDerivatives( fixedImageSample, mappedPoint, sampleOk,
1490 movingImageValue, movingImageGradientValue,
1496 if( this->GetValueAndDerivativeThreadProcessSample( threadID,
1500 movingImageGradientValue ))
1509 m_ThreaderNumberOfMovingImageSamples[threadID-1] = numSamples;
1513 m_NumberOfPixelsCounted = numSamples;
1516 if(m_WithinThreadPostProcess)
1518 this->GetValueAndDerivativeThreadPostProcess(threadID,
true);
1526 template <
class TFixedImage,
class TMovingImage>
1531 Superclass::PrintSelf( os, indent );
1533 os << indent <<
"NumberOfFixedImageSamples: ";
1534 os << m_NumberOfFixedImageSamples << std::endl;
1536 os << indent <<
"FixedImageSamplesIntensityThreshold: "
1540 os << indent <<
"UseFixedImageSamplesIntensityThreshold: ";
1541 os << m_UseFixedImageSamplesIntensityThreshold << std::endl;
1543 if( m_UseFixedImageIndexes )
1545 os << indent <<
"Use Fixed Image Indexes: True" << std::endl;
1546 os << indent <<
"Number of Fixed Image Indexes = "
1547 << m_FixedImageIndexes.size() << std::endl;
1551 os << indent <<
"Use Fixed Image Indexes: False" << std::endl;
1554 if( m_UseSequentialSampling )
1556 os << indent <<
"Use Sequential Sampling: True" << std::endl;
1560 os << indent <<
"Use Sequential Sampling: False" << std::endl;
1563 os << indent <<
"UseAllPixels: ";
1564 os << m_UseAllPixels << std::endl;
1566 os << indent <<
"Threader: " << m_Threader << std::endl;
1567 os << indent <<
"Number of Threads: " << m_NumberOfThreads << std::endl;
1568 os << indent <<
"ThreaderParameter: " << std::endl;
1569 os << indent <<
"ThreaderNumberOfMovingImageSamples: " << std::endl;
1570 if( m_ThreaderNumberOfMovingImageSamples )
1572 for(
unsigned int i=0; i<m_NumberOfThreads-1; i++)
1574 os <<
" Thread[" << i <<
"]= " << (
unsigned int)m_ThreaderNumberOfMovingImageSamples[i] << std::endl;
1578 os << indent <<
"ComputeGradient: "
1581 os << indent <<
"Moving Image: " << m_MovingImage.GetPointer() << std::endl;
1582 os << indent <<
"Fixed Image: " << m_FixedImage.GetPointer() << std::endl;
1583 os << indent <<
"Gradient Image: " << m_GradientImage.GetPointer()
1585 os << indent <<
"Transform: " << m_Transform.GetPointer() << std::endl;
1586 os << indent <<
"Interpolator: " << m_Interpolator.GetPointer() << std::endl;
1587 os << indent <<
"FixedImageRegion: " << m_FixedImageRegion << std::endl;
1588 os << indent <<
"Moving Image Mask: " << m_MovingImageMask.GetPointer()
1590 os << indent <<
"Fixed Image Mask: " << m_FixedImageMask.GetPointer()
1592 os << indent <<
"Number of Moving Image Samples: " << m_NumberOfPixelsCounted
1595 os << indent <<
"UseCachingOfBSplineWeights: ";
1596 os << this->m_UseCachingOfBSplineWeights << std::endl;
1603 template <
class TFixedImage,
class TMovingImage>
1608 for(
unsigned int threadID = 0; threadID<m_NumberOfThreads-1; threadID++ )
1613 this->m_ThreaderTransform[threadID]->SetFixedParameters( this->m_Transform->GetFixedParameters() );
1614 this->m_ThreaderTransform[threadID]->SetParameters( this->m_Transform->GetParameters() );