17 #ifndef __itkSimilarityIndexImageFilter_txx
18 #define __itkSimilarityIndexImageFilter_txx
23 #include "itkNumericTraits.h"
29 template<
class TInputImage1,
class TInputImage2>
35 this->SetNumberOfRequiredInputs( 2 );
37 m_SimilarityIndex = NumericTraits<RealType>::Zero;
41 template<
class TInputImage1,
class TInputImage2>
46 this->SetNthInput(1, const_cast<TInputImage2 *>( image ) );
50 template<
class TInputImage1,
class TInputImage2>
56 return static_cast< const TInputImage2 *
>
60 template<
class TInputImage1,
class TInputImage2>
65 Superclass::GenerateInputRequestedRegion();
70 if ( this->GetInput1() )
74 image1->SetRequestedRegionToLargestPossibleRegion();
76 if ( this->GetInput2() )
80 image2->SetRequestedRegion(
81 this->GetInput1()->GetRequestedRegion() );
88 template<
class TInputImage1,
class TInputImage2>
93 Superclass::EnlargeOutputRequestedRegion(data);
98 template<
class TInputImage1,
class TInputImage2>
105 const_cast< TInputImage1 *
>( this->GetInput1() );
106 this->GraftOutput( image );
110 template<
class TInputImage1,
class TInputImage2>
115 int numberOfThreads = this->GetNumberOfThreads();
118 m_CountOfImage1.SetSize(numberOfThreads);
119 m_CountOfImage2.SetSize(numberOfThreads);
120 m_CountOfIntersection.SetSize(numberOfThreads);
123 m_CountOfImage1.Fill(NumericTraits<unsigned long>::Zero);
124 m_CountOfImage2.Fill(NumericTraits<unsigned long>::Zero);
125 m_CountOfIntersection.Fill(NumericTraits<unsigned long>::Zero);
129 template<
class TInputImage1,
class TInputImage2>
135 unsigned long countImage1, countImage2, countIntersect;
137 int numberOfThreads = this->GetNumberOfThreads();
144 for( i = 0; i < numberOfThreads; i++)
146 countImage1 += m_CountOfImage1[i];
147 countImage2 += m_CountOfImage2[i];
148 countIntersect += m_CountOfIntersection[i];
152 if ( !countImage1 && !countImage2 )
154 m_SimilarityIndex = NumericTraits<RealType>::Zero;
158 m_SimilarityIndex = 2.0 *
static_cast<RealType>( countIntersect ) /
159 ( static_cast<RealType>( countImage1 ) +
static_cast<RealType>( countImage2 ) );
163 template<
class TInputImage1,
class TInputImage2>
174 ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels());
180 bool nonzero =
false;
181 if( it1.
Get() != NumericTraits<InputImage1PixelType>::Zero )
183 m_CountOfImage1[threadId]++;
186 if( it2.
Get() != NumericTraits<InputImage2PixelType>::Zero )
188 m_CountOfImage2[threadId]++;
191 m_CountOfIntersection[threadId]++;
197 progress.CompletedPixel();
202 template<
class TInputImage1,
class TInputImage2>
207 Superclass::PrintSelf(os,indent);
209 os << indent <<
"SimilarityIndex: " << m_SimilarityIndex << std::endl;