20 #ifndef __itkBayesianClassifierImageFilter_txx
21 #define __itkBayesianClassifierImageFilter_txx
32 template <
class TInputVectorImage,
class TLabelsType,
33 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
34 BayesianClassifierImageFilter<TInputVectorImage, TLabelsType,
35 TPosteriorsPrecisionType, TPriorsPrecisionType >
38 m_UserProvidedPriors =
false;
39 m_UserProvidedSmoothingFilter =
false;
40 this->SetNumberOfRequiredOutputs( 2 );
41 m_NumberOfSmoothingIterations = 0;
42 m_SmoothingFilter =
NULL;
51 template <
class TInputVectorImage,
class TLabelsType,
52 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
55 TPosteriorsPrecisionType, TPriorsPrecisionType >
56 ::PrintSelf(std::ostream& os,
Indent indent)
const
58 Superclass::PrintSelf(os,indent);
60 os << indent <<
"User provided priors = " << m_UserProvidedPriors << std::endl;
61 os << indent <<
"User provided smooting filter = " << m_UserProvidedSmoothingFilter << std::endl;
62 os << indent <<
"Smoothing filter pointer = " << m_SmoothingFilter.GetPointer() << std::endl;
63 os << indent <<
"Number of smoothing iterations = " << m_NumberOfSmoothingIterations << std::endl;
70 template <
class TInputVectorImage,
class TLabelsType,
71 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
74 TPosteriorsPrecisionType, TPriorsPrecisionType >
81 const unsigned int numberOfClasses = membershipImage->GetVectorLength();
83 if( numberOfClasses == 0 )
85 itkExceptionMacro(
"The number of components in the input Membership image is Zero !");
89 this->AllocateOutputs();
92 this->ComputeBayesRule();
94 if( m_UserProvidedSmoothingFilter )
96 this->NormalizeAndSmoothPosteriors();
99 this->ClassifyBasedOnPosteriors();
104 template <
class TInputVectorImage,
class TLabelsType,
105 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
107 TPosteriorsPrecisionType, TPriorsPrecisionType >
108 ::PosteriorsImageType *
110 TPosteriorsPrecisionType, TPriorsPrecisionType >
111 ::GetPosteriorImage()
118 template <
class TInputVectorImage,
class TLabelsType,
119 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
121 TPosteriorsPrecisionType, TPriorsPrecisionType >
124 TPosteriorsPrecisionType, TPriorsPrecisionType >
125 ::MakeOutput(
unsigned int idx)
129 return static_cast<DataObject*
>(PosteriorsImageType::New().GetPointer());
131 return Superclass::MakeOutput(idx);
134 template <
class TInputVectorImage,
class TLabelsType,
135 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
138 TPosteriorsPrecisionType, TPriorsPrecisionType >
139 ::GenerateOutputInformation(
void)
141 Superclass::GenerateOutputInformation();
143 if ( !this->GetPosteriorImage() )
150 this->GetPosteriorImage()->SetVectorLength( this->GetInput()->GetVectorLength() );
156 template <
class TInputVectorImage,
class TLabelsType,
157 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
160 TPosteriorsPrecisionType, TPriorsPrecisionType >
163 itkDebugMacro( <<
"Computing Bayes Rule" );
168 if( m_UserProvidedPriors )
173 if( priorsImage ==
NULL )
175 itkExceptionMacro(
"Second input type does not correspond to expected Priors Image Type");
181 if( posteriorsImage ==
NULL )
183 itkExceptionMacro(
"Second output type does not correspond to expected Posteriors Image Type");
194 const unsigned int numberOfClasses = membershipImage->GetVectorLength();
196 itkDebugMacro( <<
"Computing Bayes Rule nclasses in membershipImage: " << numberOfClasses );
198 while( !itrMembershipImage.
IsAtEnd() )
203 for(
unsigned int i=0; i<numberOfClasses; i++)
206 static_cast< TPosteriorsPrecisionType
>( memberships[i] * priors[i] );
208 itrPosteriorsImage.
Set( posteriors );
209 ++itrMembershipImage;
211 ++itrPosteriorsImage;
219 if( posteriorsImage ==
NULL )
221 itkExceptionMacro(
"Second output type does not correspond to expected Posteriors Image Type");
230 while( !itrMembershipImage.
IsAtEnd() )
232 itrPosteriorsImage.
Set( itrMembershipImage.
Get() );
233 ++itrMembershipImage;
234 ++itrPosteriorsImage;
241 template <
class TInputVectorImage,
class TLabelsType,
242 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
245 TPosteriorsPrecisionType, TPriorsPrecisionType >
248 this->m_SmoothingFilter = smoothingFilter;
249 this->m_UserProvidedSmoothingFilter =
true;
257 template <
class TInputVectorImage,
class TLabelsType,
258 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
261 TPosteriorsPrecisionType, TPriorsPrecisionType >
265 this->m_UserProvidedPriors =
true;
273 template <
class TInputVectorImage,
class TLabelsType,
274 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
277 TPosteriorsPrecisionType, TPriorsPrecisionType >
278 ::NormalizeAndSmoothPosteriors()
282 this->GetPosteriorImage(), this->GetPosteriorImage()->GetBufferedRegion() );
285 const unsigned int numberOfClasses = this->GetPosteriorImage()->GetVectorLength();
287 for(
unsigned int iter=0; iter< m_NumberOfSmoothingIterations; iter++)
290 while( !itrPosteriorImage.
IsAtEnd() )
292 p = itrPosteriorImage.
Get();
295 TPosteriorsPrecisionType probability=0;
296 for(
unsigned int i=0; i< numberOfClasses; i++ )
301 itrPosteriorImage.
Set( p );
306 for(
unsigned int componentToExtract=0; componentToExtract < numberOfClasses; componentToExtract++)
312 ExtractedComponentImageType::New();
313 extractedComponentImage->CopyInformation( this->GetPosteriorImage());
314 extractedComponentImage->SetBufferedRegion(
315 this->GetPosteriorImage()->GetBufferedRegion() );
316 extractedComponentImage->SetRequestedRegion(
317 this->GetPosteriorImage()->GetRequestedRegion() );
318 extractedComponentImage->Allocate();
322 IteratorType it( extractedComponentImage,
323 extractedComponentImage->GetBufferedRegion() );
326 while( !itrPosteriorImage.
IsAtEnd() )
328 it.Set(itrPosteriorImage.
Get()[componentToExtract]);
333 m_SmoothingFilter->SetInput( extractedComponentImage );
334 m_SmoothingFilter->Modified();
335 m_SmoothingFilter->Update();
339 IteratorType sit( m_SmoothingFilter->GetOutput(),
340 m_SmoothingFilter->GetOutput()->GetBufferedRegion() );
342 while( !itrPosteriorImage.
IsAtEnd() )
345 posteriorPixel[componentToExtract] = sit.Get();
346 itrPosteriorImage.
Set(posteriorPixel);
358 template <
class TInputVectorImage,
class TLabelsType,
359 class TPosteriorsPrecisionType,
class TPriorsPrecisionType >
362 TPosteriorsPrecisionType, TPriorsPrecisionType >
363 ::ClassifyBasedOnPosteriors()
372 if( posteriorsImage ==
NULL )
374 itkExceptionMacro(
"Second output type does not correspond to expected Posteriors Image Type");
385 while ( !itrLabelsImage.
IsAtEnd() )
387 itrLabelsImage.
Set( static_cast< TLabelsType >(
388 decisionRule->Evaluate( itrPosteriorsImage.
Get())) );
390 ++itrPosteriorsImage;