Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes

itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage > Class Template Reference

Applies a total variation denoising filter to an image. More...

#include <itkTotalVariationSingleIterationImageFilter.h>

List of all members.

Public Types

typedef TInputImage InputImageType
typedef TOutputImage OutputImageType
typedef itk::Image< float,
InputImageDimension > 
LocalVariationImageType
typedef
TotalVariationSingleIterationImageFilter 
Self
typedef ImageToImageFilter
< InputImageType,
OutputImageType
Superclass
typedef SmartPointer< SelfPointer
typedef SmartPointer< const SelfConstPointer
typedef InputImageType::PixelType InputPixelType
typedef OutputImageType::PixelType OutputPixelType
typedef InputImageType::RegionType InputImageRegionType
typedef OutputImageType::RegionType OutputImageRegionType
typedef InputImageType::SizeType InputSizeType

Public Member Functions

 itkStaticConstMacro (InputImageDimension, unsigned int, TInputImage::ImageDimension)
 itkStaticConstMacro (OutputImageDimension, unsigned int, TOutputImage::ImageDimension)
virtual const char * GetClassName () const
virtual void GenerateInputRequestedRegion () throw (InvalidRequestedRegionError)
virtual void SetLambda (double _arg)
virtual double GetLambda ()
void SetOriginalImage (InputImageType *in)
InputImageType::Pointer GetOriginialImage ()

Static Public Member Functions

static Pointer New ()

Protected Member Functions

 TotalVariationSingleIterationImageFilter ()
virtual ~TotalVariationSingleIterationImageFilter ()
void PrintSelf (std::ostream &os, Indent indent) const
void ThreadedGenerateData (const OutputImageRegionType &outputRegionForThread, int threadId)
void BeforeThreadedGenerateData ()

Protected Attributes

LocalVariationImageType::Pointer m_LocalVariation
InputImageType::Pointer m_OriginalImage
double m_Lambda

Detailed Description

template<class TInputImage, class TOutputImage>
class itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >

Applies a total variation denoising filter to an image.

Reference: Tony F. Chan et al., The digital TV filter and nonlinear denoising

See also:
Image
Neighborhood
NeighborhoodOperator
NeighborhoodIterator

Definition at line 39 of file itkTotalVariationSingleIterationImageFilter.h.


Member Typedef Documentation

template<class TInputImage , class TOutputImage >
typedef SmartPointer<const Self> itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::ConstPointer
template<class TInputImage , class TOutputImage >
typedef InputImageType::RegionType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::InputImageRegionType
template<class TInputImage , class TOutputImage >
typedef TInputImage itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::InputImageType

Convenient typedefs for simplifying declarations.

Definition at line 50 of file itkTotalVariationSingleIterationImageFilter.h.

template<class TInputImage , class TOutputImage >
typedef InputImageType::PixelType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::InputPixelType

Image typedef support.

Definition at line 65 of file itkTotalVariationSingleIterationImageFilter.h.

template<class TInputImage , class TOutputImage >
typedef InputImageType::SizeType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::InputSizeType
template<class TInputImage , class TOutputImage >
typedef itk::Image<float,InputImageDimension> itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::LocalVariationImageType
template<class TInputImage , class TOutputImage >
typedef OutputImageType::RegionType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::OutputImageRegionType
template<class TInputImage , class TOutputImage >
typedef TOutputImage itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::OutputImageType
template<class TInputImage , class TOutputImage >
typedef OutputImageType::PixelType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::OutputPixelType
template<class TInputImage , class TOutputImage >
typedef SmartPointer<Self> itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::Pointer
template<class TInputImage , class TOutputImage >
typedef TotalVariationSingleIterationImageFilter itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::Self

Standard class typedefs.

Definition at line 56 of file itkTotalVariationSingleIterationImageFilter.h.

template<class TInputImage , class TOutputImage >
typedef ImageToImageFilter< InputImageType, OutputImageType> itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::Superclass

Constructor & Destructor Documentation

template<class TInputImage , class TOutputImage >
itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::TotalVariationSingleIterationImageFilter (  ) [protected]
template<class TInputImage , class TOutputImage >
virtual itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::~TotalVariationSingleIterationImageFilter (  ) [inline, protected, virtual]

Definition at line 95 of file itkTotalVariationSingleIterationImageFilter.h.

{}

Member Function Documentation

template<class TInputImage , class TOutputImage >
void itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::BeforeThreadedGenerateData (  ) [protected]

first calculate local variation in the image

Definition at line 263 of file itkTotalVariationSingleIterationImageFilter.txx.

  {
    typedef typename itk::LocalVariationImageFilter
      <TInputImage,LocalVariationImageType> FilterType;
    typename FilterType::Pointer filter = FilterType::New();
    filter->SetInput(this->GetInput(0));
    filter->SetNumberOfThreads(this->GetNumberOfThreads());
    filter->Update();
    this->m_LocalVariation = filter->GetOutput();
  }
template<class TInputImage , class TOutputImage >
void itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::GenerateInputRequestedRegion (  ) throw (InvalidRequestedRegionError) [virtual]

A larger input requested region than the output requested region is required. Therefore, an implementation for GenerateInputRequestedRegion() is provided.

See also:
ImageToImageFilter::GenerateInputRequestedRegion()

generate requested region

Definition at line 56 of file itkTotalVariationSingleIterationImageFilter.txx.

  {
    // call the superclass' implementation of this method
    Superclass::GenerateInputRequestedRegion();

    // get pointers to the input and output
    typename Superclass::InputImagePointer inputPtr = 
      const_cast< TInputImage * >( this->GetInput() );
    typename Superclass::OutputImagePointer outputPtr = this->GetOutput();

    if ( !inputPtr || !outputPtr )
    {
      return;
    }

    // get a copy of the input requested region (should equal the output
    // requested region)
    typename TInputImage::RegionType inputRequestedRegion;
    inputRequestedRegion = inputPtr->GetRequestedRegion();

    // pad the input requested region by 1
    inputRequestedRegion.PadByRadius( 1 );

    // crop the input requested region at the input's largest possible region
    if ( inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()) )
    {
      inputPtr->SetRequestedRegion( inputRequestedRegion );
      return;
    }
    else
    {
      // Couldn't crop the region (requested region is outside the largest
      // possible region).  Throw an exception.

      // store what we tried to request (prior to trying to crop)
      inputPtr->SetRequestedRegion( inputRequestedRegion );

      // build an exception
      InvalidRequestedRegionError e(__FILE__, __LINE__);
      e.SetLocation(ITK_LOCATION);
      e.SetDescription("Requested region outside possible region.");
      e.SetDataObject(inputPtr);
      throw e;
    }
  }
template<class TInputImage , class TOutputImage >
virtual const char* itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::GetClassName (  ) const [virtual]

Run-time type information (and related methods).

template<class TInputImage , class TOutputImage >
virtual double itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::GetLambda (  ) [virtual]
template<class TInputImage , class TOutputImage >
InputImageType::Pointer itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::GetOriginialImage (  ) [inline]
template<class TInputImage , class TOutputImage >
itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::itkStaticConstMacro ( OutputImageDimension  ,
unsigned  int,
TOutputImage::ImageDimension   
)
template<class TInputImage , class TOutputImage >
itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::itkStaticConstMacro ( InputImageDimension  ,
unsigned  int,
TInputImage::ImageDimension   
)

Extract dimension from input and output image.

template<class TInputImage , class TOutputImage >
static Pointer itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::New (  ) [static]

Method for creation through the object factory.

template<class TInputImage , class TOutput >
void itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutput >::PrintSelf ( std::ostream &  os,
Indent  indent 
) const [protected]

Standard "PrintSelf" method

Definition at line 280 of file itkTotalVariationSingleIterationImageFilter.txx.

  {
    Superclass::PrintSelf( os, indent );
  }
template<class TInputImage , class TOutputImage >
virtual void itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::SetLambda ( double  _arg ) [virtual]
template<class TInputImage , class TOutputImage >
void itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::SetOriginalImage ( InputImageType in ) [inline]
template<class TInputImage , class TOutputImage >
void itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::ThreadedGenerateData ( const OutputImageRegionType outputRegionForThread,
int  threadId 
) [protected]

MedianImageFilter can be implemented as a multithreaded filter. Therefore, this implementation provides a ThreadedGenerateData() routine which is called for each processing thread. The output image data is allocated automatically by the superclass prior to calling ThreadedGenerateData(). ThreadedGenerateData can only write to the portion of the output image specified by the parameter "outputRegionForThread"

See also:
ImageToImageFilter::ThreadedGenerateData(), ImageToImageFilter::GenerateData()

generate output

Definition at line 109 of file itkTotalVariationSingleIterationImageFilter.txx.

  {

    typename OutputImageType::Pointer output = this->GetOutput();
    typename  InputImageType::ConstPointer input  = this->GetInput();

    // Find the data-set boundary "faces"
    itk::Size<InputImageDimension> size;
    for( int i=0; i<InputImageDimension; i++)
      size[i] = 1;

    NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<InputImageType> bC;
    typename NeighborhoodAlgorithm::
      ImageBoundaryFacesCalculator<InputImageType>::FaceListType
      faceList = bC(input, outputRegionForThread, size);

    NeighborhoodAlgorithm::
      ImageBoundaryFacesCalculator<LocalVariationImageType> lv_bC;
    typename NeighborhoodAlgorithm::
      ImageBoundaryFacesCalculator<LocalVariationImageType>::FaceListType
      lv_faceList = lv_bC(m_LocalVariation, outputRegionForThread, size);

    // support progress methods/callbacks
    ProgressReporter progress(
      this, threadId, outputRegionForThread.GetNumberOfPixels());

    ZeroFluxNeumannBoundaryCondition<InputImageType> nbc;
    ZeroFluxNeumannBoundaryCondition<LocalVariationImageType> lv_nbc;
    std::vector<double> ws;
    std::vector<double> hs;

    typename NeighborhoodAlgorithm::
      ImageBoundaryFacesCalculator<InputImageType>::FaceListType::iterator
      lv_fit=lv_faceList.begin();

    // Process each of the boundary faces.  These are N-d regions which border
    // the edge of the buffer.
    for ( typename NeighborhoodAlgorithm::
      ImageBoundaryFacesCalculator<InputImageType>::FaceListType::iterator
      fit=faceList.begin(); fit != faceList.end(); ++fit)
    {

      // iterators over output, input, original and local variation image
      ImageRegionIterator<OutputImageType> output_image_it = 
        ImageRegionIterator<OutputImageType>(output, *fit);
      ImageRegionConstIterator<InputImageType> input_image_it = 
        ImageRegionConstIterator<InputImageType>(input, *fit);
      ImageRegionConstIterator<InputImageType> orig_image_it = 
        ImageRegionConstIterator<InputImageType>(m_OriginalImage, *fit);
      ImageRegionConstIterator<LocalVariationImageType> loc_var_image_it = 
        ImageRegionConstIterator<LocalVariationImageType>(
        m_LocalVariation, *fit);

      // neighborhood in input image
      ConstShapedNeighborhoodIterator<InputImageType> 
        input_image_neighbors_it(size, input, *fit);
      typename ConstShapedNeighborhoodIterator<InputImageType>::
        OffsetType offset;
      input_image_neighbors_it.OverrideBoundaryCondition(&nbc);
      input_image_neighbors_it.ClearActiveList();
      for(int i=0; i<InputImageDimension; i++)
      {
        offset.Fill(0);
        offset[i] = -1;
        input_image_neighbors_it.ActivateOffset(offset);
        offset[i] = 1;
        input_image_neighbors_it.ActivateOffset(offset);
      }
      input_image_neighbors_it.GoToBegin();

      // neighborhood in local variation image
      ConstShapedNeighborhoodIterator<LocalVariationImageType> 
        loc_var_image_neighbors_it(size, m_LocalVariation, *lv_fit);
      loc_var_image_neighbors_it.OverrideBoundaryCondition(&lv_nbc);
      loc_var_image_neighbors_it.ClearActiveList();
      for(int i=0; i<InputImageDimension; i++)
      {
        offset.Fill(0);
        offset[i] = -1;
        loc_var_image_neighbors_it.ActivateOffset(offset);
        offset[i] = 1;
        loc_var_image_neighbors_it.ActivateOffset(offset);
      }
      loc_var_image_neighbors_it.GoToBegin();

      const unsigned int neighborhoodSize = InputImageDimension*2;
      ws.resize(neighborhoodSize);

      while ( ! output_image_it.IsAtEnd() )
      {

        //   1 / ||nabla_alpha(u)||_a
        double locvar_alpha_inv = 1.0/loc_var_image_it.Get();

        // compute w_alphabetas
        int count = 0;
        double wsum = 0;
        typename ConstShapedNeighborhoodIterator<LocalVariationImageType>::
          ConstIterator loc_var_neighbors_it;
        for (loc_var_neighbors_it = loc_var_image_neighbors_it.Begin(); 
          ! loc_var_neighbors_it.IsAtEnd(); 
          loc_var_neighbors_it++)
        { 
          // w_alphabeta(u) = 
          //   1 / ||nabla_alpha(u)||_a + 1 / ||nabla_beta(u)||_a
          ws[count] = 
            locvar_alpha_inv + (1.0/(double)loc_var_neighbors_it.Get());
          wsum += ws[count++];
        }

        // h_alphaalpha * u_alpha^zero
        typename OutputImageType::PixelType res = 
          static_cast<typename OutputImageType::PixelType>( 
          ((typename OutputImageType::PixelType)
          orig_image_it.Get()) * (m_Lambda / (m_Lambda+wsum)));

        // add the different h_alphabeta * u_beta
        count = 0;
        typename ConstShapedNeighborhoodIterator<InputImageType>::
          ConstIterator input_neighbors_it;
        for (input_neighbors_it = input_image_neighbors_it.Begin(); 
          ! input_neighbors_it.IsAtEnd(); 
          input_neighbors_it++)
        { 
          res += input_neighbors_it.Get() * (ws[count++] / (m_Lambda+wsum));
        }

        // set output result
        output_image_it.Set( res );

        // increment iterators
        ++output_image_it;
        ++input_image_it;
        ++orig_image_it;
        ++loc_var_image_it;
        ++input_image_neighbors_it;
        ++loc_var_image_neighbors_it;

        // report progress
        progress.CompletedPixel();

      }

      ++lv_fit;
    }
  }

Member Data Documentation

template<class TInputImage , class TOutputImage >
double itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::m_Lambda [protected]
template<class TInputImage , class TOutputImage >
LocalVariationImageType::Pointer itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::m_LocalVariation [protected]
template<class TInputImage , class TOutputImage >
InputImageType::Pointer itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::m_OriginalImage [protected]

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines