1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: itkKernelImageFilter.txx
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __itkKernelImageFilter_txx
#define __itkKernelImageFilter_txx
#include "itkKernelImageFilter.h"
#include "itkProgressAccumulator.h"
#include "itkFlatStructuringElement.h"
namespace itk {
template <class TInputImage, class TOutputImage, class TKernel>
KernelImageFilter<TInputImage, TOutputImage, TKernel>
::KernelImageFilter()
{
this->SetRadius( 1UL );
}
template <class TInputImage, class TOutputImage, class TKernel>
void
KernelImageFilter<TInputImage, TOutputImage, TKernel>
::SetRadius( const RadiusType & radius )
{
// Try to use a FlatStructuringElement if possible, because it is
// much efficient with van Herk / Gil Werman filters
// check that the type is exactly FlatKernelType, to be sure to
// not replace m_Kernel data with the data of a FlatKernelType
// if KernelType is a subclass of FlatKernelType.
if( typeid(KernelType) == typeid(FlatKernelType) )
{
// SetKernel() must be called, because it can be overloaded in a subclass
// - MovingHistogramImageFilterBase for example.
FlatKernelType flatKernel = FlatKernelType::Box( radius );
KernelType * kernel = reinterpret_cast< KernelType* >( & flatKernel );
this->SetKernel( *kernel );
}
else
{
// Superclass::SetRadius() is called in SetKenel() - no need to call it here
// Superclass::SetRadius( radius );
KernelType kernel;
kernel.SetRadius( radius );
for( typename KernelType::Iterator kit=kernel.Begin(); kit != kernel.End(); kit++ )
{
*kit = 1;
}
this->SetKernel( kernel );
}
}
template <class TInputImage, class TOutputImage, class TKernel>
void
KernelImageFilter<TInputImage, TOutputImage, TKernel>
::SetKernel( const KernelType & kernel )
{
if( m_Kernel != kernel )
{
m_Kernel = kernel;
this->Modified();
}
// set the radius of the super class to be the same than the kernel one
Superclass::SetRadius( kernel.GetRadius() );
}
template <class TInputImage, class TOutputImage, class TKernel>
void
KernelImageFilter<TInputImage, TOutputImage, TKernel>
::PrintSelf(std::ostream &os, Indent indent) const
{
Superclass::PrintSelf(os, indent);
os << indent << "Kernel: " << m_Kernel << std::endl;
}
}
#endif
|