17 #ifndef __itkBinomialBlurImageFilter_txx
18 #define __itkBinomialBlurImageFilter_txx
20 #include "vnl/vnl_vector_fixed.h"
32 template<
class TInputImage,
class TOutputImage >
36 itkDebugMacro(<<
"BinomialBlurImageFilter::BinomialBlurImageFilter() called");
42 template<
class TInputImage,
class TOutputImage >
47 itkDebugMacro(<<
"BinomialBlurImageFilter::GenerateInputRequestedRegion() called");
49 Superclass::GenerateInputRequestedRegion();
52 const_cast< TInputImage *
>( this->GetInput(0));
55 if( !inputPtr || !outputPtr )
60 typename TOutputImage::RegionType outputRegion;
61 typename TInputImage::RegionType inputRegion;
62 typename TInputImage::RegionType::SizeType inputSize;
63 typename TInputImage::RegionType::IndexType inputIndex;
65 outputRegion = outputPtr->GetRequestedRegion();
69 inputRegion = outputRegion;
71 inputSize = inputRegion.GetSize();
72 inputIndex = inputRegion.GetIndex();
74 typename TInputImage::RegionType::IndexType inputLargestPossibleRegionIndex
75 = inputPtr->GetLargestPossibleRegion().GetIndex();
76 typename TInputImage::RegionType::SizeType inputLargestPossibleRegionSize
77 = inputPtr->GetLargestPossibleRegion().GetSize();
79 for (
unsigned int i=0; i < inputPtr->GetImageDimension(); ++i)
81 inputIndex[i] -= m_Repetitions;
82 if (inputIndex[i] < inputLargestPossibleRegionIndex[i])
84 inputIndex[i] = inputLargestPossibleRegionIndex[i];
87 inputSize[i] += m_Repetitions;
88 if (inputSize[i] > inputLargestPossibleRegionSize[i])
90 inputSize[i] = inputLargestPossibleRegionSize[i];
94 inputRegion.SetIndex( inputIndex );
95 inputRegion.SetSize( inputSize );
97 inputPtr->SetRequestedRegion( inputRegion );
101 template<
class TInputImage,
class TOutputImage >
106 itkDebugMacro(<<
"BinomialBlurImageFilter::GenerateData() called");
113 outputPtr->SetBufferedRegion( outputPtr->GetRequestedRegion() );
114 outputPtr->Allocate();
120 typename TTempImage::Pointer tempPtr = TTempImage::New();
122 typename TTempImage::RegionType tempRegion;
123 tempRegion = inputPtr->GetRequestedRegion();
125 tempPtr->SetLargestPossibleRegion( tempRegion );
126 tempPtr->SetBufferedRegion( tempRegion );
127 tempPtr->SetRequestedRegion( tempRegion );
131 typename TInputImage::SizeType size=inputPtr->GetRequestedRegion().GetSize();
132 typename TInputImage::IndexType startIndex=inputPtr->GetRequestedRegion().GetIndex();
141 ProgressReporter progress(
this, 0, (outputPtr->GetRequestedRegion().GetNumberOfPixels()) * m_Repetitions * 2 * NDimensions);
144 TempIterator tempIt = TempIterator(tempPtr,
145 tempPtr->GetRequestedRegion());
146 InputIterator inputIt = InputIterator(inputPtr, inputPtr->GetRequestedRegion());
148 for ( inputIt.GoToBegin(), tempIt.GoToBegin(); !tempIt.IsAtEnd();++tempIt, ++inputIt)
150 tempIt.Set( static_cast<double>(inputIt.Get()) );
155 typename TTempImage::IndexType index;
156 typename TTempImage::IndexType indexShift;
162 double pixelA, pixelB;
165 for (
unsigned int rep = 0; rep < m_Repetitions; rep++)
169 itkDebugMacro(<<
"Repetition # " << rep);
172 for (
unsigned int dim = 0; dim < NDimensions; dim ++)
174 TempIterator tempItDir = TempIterator(tempPtr,
175 tempPtr->GetRequestedRegion());
176 tempItDir.GoToBegin();
177 while( !tempItDir.IsAtEnd() )
180 index = tempItDir.GetIndex();
183 ( startIndex[dim] + static_cast<long>(size[dim]) - 1))
186 for (
unsigned int i = 0; i < NDimensions; i++)
190 indexShift.m_Index[i] = index.m_Index[i] + 1;
194 indexShift.m_Index[i] = index.m_Index[i];
199 pixelA = tempPtr->GetPixel(index);
200 pixelB = tempPtr->GetPixel(indexShift);
203 pixelA = pixelA / 2.0;
205 tempPtr->SetPixel(index, pixelA);
213 itkDebugMacro(<<
"End processing forward dimension " << dim);
216 TempReverseIterator tempReverseIt
217 = TempReverseIterator(tempPtr, tempPtr->GetRequestedRegion());
219 tempReverseIt.GoToBegin();
221 while ( !tempReverseIt.IsAtEnd() )
224 index = tempReverseIt.GetIndex();
226 if (index[dim] > startIndex[dim])
229 for (
unsigned int i = 0; i < NDimensions; i++)
233 indexShift.m_Index[i] = index.m_Index[i] - 1;
237 indexShift.m_Index[i] = index.m_Index[i];
242 pixelA = tempPtr->GetPixel(index);
243 pixelB = tempPtr->GetPixel(indexShift);
248 tempPtr->SetPixel(index, pixelA);
256 itkDebugMacro(<<
"End processing reverse dimension " << dim);
265 OutputIterator outIt = OutputIterator(outputPtr,
266 outputPtr->GetRequestedRegion());
267 TempIterator tempIt2 = TempIterator(tempPtr,
268 outputPtr->GetRequestedRegion());
270 for ( outIt.GoToBegin(), tempIt2.GoToBegin(); !outIt.IsAtEnd();
273 outIt.
Set( static_cast<PixelType>(tempIt2.Get()) );
276 itkDebugMacro(<<
"Binomial blur filter executed " << num_reps <<
" times");
279 template<
class TInputImage,
class TOutputImage >
284 Superclass::PrintSelf(os,indent);
286 os << indent <<
"Number of repetitions: " << m_Repetitions << std::endl;