17 #ifndef __itkGaussianBlurImageFunction_txx
18 #define __itkGaussianBlurImageFunction_txx
27 template <
class TInputImage,
class TOutput>
33 for(
unsigned int i=0;i<itkGetStaticConstMacro(ImageDimension);i++)
36 m_MaximumError[i] = 0.001f;
37 m_MaximumKernelWidth = 32;
40 m_UseImageSpacing =
true;
42 m_GaussianFunction = GaussianFunctionType::New();
43 m_GaussianFunction->SetMean(mean);
44 m_GaussianFunction->SetNormalized(
false);
45 m_OperatorImageFunction = OperatorImageFunctionType::New();
46 m_InternalImage = InternalImageType::New();
47 this->RecomputeGaussianKernel();
48 m_Caster = CastImageFilterType::New();
52 template <
class TInputImage,
class TOutput>
57 Superclass::SetInputImage(ptr);
58 m_Caster->SetInput(ptr);
60 m_OperatorImageFunction->SetInputImage(m_Caster->GetOutput());
65 template <
class TInputImage,
class TOutput>
70 this->Superclass::PrintSelf(os,indent);
72 for(
unsigned int i=0;i<itkGetStaticConstMacro(ImageDimension);i++)
74 os << indent <<
"Sigma["<< i <<
"] : " << m_Sigma[i] << std::endl;
75 os << indent <<
"MaximumError["<< i <<
"] : " << m_MaximumError[i] << std::endl;
76 os << indent <<
"Extent["<< i <<
"] : " << m_Extent[i] << std::endl;
78 os << indent <<
"MaximumKernelWidth: " << m_MaximumKernelWidth << std::endl;
79 os << indent <<
"UseImageSpacing: " << m_UseImageSpacing << std::endl;
81 os << indent <<
"Internal Image : " << m_InternalImage << std::endl;
82 os << indent <<
"Image Caster : " << m_Caster << std::endl;
87 template <
class TInputImage,
class TOutput>
93 for (i=0; i<itkGetStaticConstMacro(ImageDimension); i++)
95 if ( sigma[i] != m_Sigma[i] )
100 if ( i < itkGetStaticConstMacro(ImageDimension) )
102 for (i=0; i<itkGetStaticConstMacro(ImageDimension); i++)
104 m_Sigma[i] = sigma[i];
106 this->RecomputeGaussianKernel();
112 template <
class TInputImage,
class TOutput>
118 for (i=0; i<itkGetStaticConstMacro(ImageDimension); i++)
120 if ( sigma != m_Sigma[i] )
125 if ( i < itkGetStaticConstMacro(ImageDimension) )
127 for (i=0; i<itkGetStaticConstMacro(ImageDimension); i++)
131 this->RecomputeGaussianKernel();
136 template <
class TInputImage,
class TOutput>
142 for (i=0; i<itkGetStaticConstMacro(ImageDimension); i++)
144 if ( extent[i] != m_Extent[i] )
149 if ( i < itkGetStaticConstMacro(ImageDimension) )
151 for (i=0; i<itkGetStaticConstMacro(ImageDimension); i++)
153 m_Extent[i] = extent[i];
155 this->RecomputeGaussianKernel();
161 template <
class TInputImage,
class TOutput>
167 for (i=0; i<itkGetStaticConstMacro(ImageDimension); i++)
169 if ( extent != m_Extent[i] )
174 if ( i < itkGetStaticConstMacro(ImageDimension) )
176 for (i=0; i<itkGetStaticConstMacro(ImageDimension); i++)
178 m_Extent[i] = extent;
180 this->RecomputeGaussianKernel();
187 template <
class TInputImage,
class TOutput>
195 for(
unsigned int direction=0;direction<itkGetStaticConstMacro(ImageDimension);direction++)
203 if( (m_UseImageSpacing ==
true) && (this->GetInputImage()) )
205 if (this->GetInputImage()->GetSpacing()[direction] == 0.0)
207 itkExceptionMacro(<<
"Pixel spacing cannot be zero");
211 gaussianOperator.
SetVariance(m_Sigma[direction]*m_Sigma[direction] / this->GetInputImage()->GetSpacing()[direction]);
216 gaussianOperator.
SetVariance(m_Sigma[direction]*m_Sigma[direction]);
220 m_OperatorArray[direction] = gaussianOperator;
221 size[direction] = gaussianOperator.
GetSize()[direction];
225 m_InternalImage = InternalImageType::New();
227 region.SetSize(size);
228 m_InternalImage->SetRegions(region);
229 m_InternalImage->Allocate();
230 m_InternalImage->FillBuffer(0);
234 template <
class TInputImage,
class TOutput>
239 return this->EvaluateAtIndex( index, m_OperatorArray );
243 template <
class TInputImage,
class TOutput>
249 m_OperatorImageFunction->SetInputImage(m_Caster->GetOutput());
250 m_OperatorImageFunction->SetOperator(operatorArray[0]);
253 if(itkGetStaticConstMacro(ImageDimension) == 1)
255 return m_OperatorImageFunction->EvaluateAtIndex(index);
260 for(
unsigned int i=0;i<itkGetStaticConstMacro(ImageDimension);i++)
262 centerIndex[i] = (
unsigned long)((
float)m_InternalImage->GetBufferedRegion().GetSize()[i]/2.0);
275 for(
unsigned int i = 0;i<itkGetStaticConstMacro(ImageDimension);i++)
279 ind[i] -= centerIndex[i];
285 regionN.SetSize(size);
287 for(
unsigned int i = 0;i<itkGetStaticConstMacro(ImageDimension);i++)
297 regionS.Crop( m_Caster->GetOutput()->GetBufferedRegion() );
303 it.GoToBeginOfLine();
305 while( !it.IsAtEnd() )
307 while( !it.IsAtEndOfLine() )
309 itN.Set(m_OperatorImageFunction->EvaluateAtIndex(it.GetIndex()));
318 for(
unsigned int direction=1;direction<itkGetStaticConstMacro(ImageDimension);direction++)
323 for(
unsigned int i = 0;i<itkGetStaticConstMacro(ImageDimension);i++)
330 region.SetSize(size);
334 m_OperatorImageFunction->SetInputImage(m_InternalImage);
335 m_OperatorImageFunction->SetOperator(operatorArray[direction]);
339 unsigned int dir = direction +1;
340 if(dir == itkGetStaticConstMacro(ImageDimension))
342 dir = itkGetStaticConstMacro(ImageDimension)-1;
351 itr.
Set(m_OperatorImageFunction->EvaluateAtIndex(itr.
GetIndex()));
358 return m_InternalImage->GetPixel(centerIndex);
365 template <
class TInputImage,
class TOutput>
370 for(
unsigned int direction=0;direction<itkGetStaticConstMacro(ImageDimension);direction++)
376 size[direction] = (
unsigned long)(m_Sigma[direction]*m_Extent[direction]);
383 s[0]=m_Sigma[direction];
384 m_GaussianFunction->SetSigma(s);
388 while(it != gaussianNeighborhood.
End() )
390 pt[0]= gaussianNeighborhood.
GetOffset(i)[direction]-offset[direction];
391 if( (m_UseImageSpacing ==
true) && (this->GetInputImage()) )
393 if (this->GetInputImage()->GetSpacing()[direction] == 0.0)
395 itkExceptionMacro(<<
"Pixel spacing cannot be zero");
399 pt[0] *= this->GetInputImage()->GetSpacing()[direction];
403 (*it)= m_GaussianFunction->Evaluate(pt);
410 it = gaussianNeighborhood.
Begin();
411 while(it != gaussianNeighborhood.
End() )
416 m_ContinuousOperatorArray[direction] = gaussianNeighborhood;
421 template <
class TInputImage,
class TOutput>
428 this->m_InternalImage->TransformPhysicalPointToContinuousIndex( point, cindex );
430 return this->EvaluateAtContinuousIndex( cindex );
434 template <
class TInputImage,
class TOutput>
441 index.CopyWithRound( cindex );
443 double offset[itkGetStaticConstMacro(ImageDimension)];
444 for(
unsigned int i=0; i<itkGetStaticConstMacro(ImageDimension);i++)
446 offset[i] = cindex[i] - index[i];
449 this->RecomputeContinuousGaussianKernel( offset );
451 return this->EvaluateAtIndex( index, m_ContinuousOperatorArray );