Applies a total variation denoising filter to an image. More...
#include <itkTotalVariationSingleIterationImageFilter.h>
Public Types | |
typedef TInputImage | InputImageType |
typedef TOutputImage | OutputImageType |
typedef itk::Image< float, InputImageDimension > | LocalVariationImageType |
typedef TotalVariationSingleIterationImageFilter | Self |
typedef ImageToImageFilter < InputImageType, OutputImageType > | Superclass |
typedef SmartPointer< Self > | Pointer |
typedef SmartPointer< const Self > | ConstPointer |
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 |
Applies a total variation denoising filter to an image.
Reference: Tony F. Chan et al., The digital TV filter and nonlinear denoising
Definition at line 39 of file itkTotalVariationSingleIterationImageFilter.h.
typedef SmartPointer<const Self> itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::ConstPointer |
Definition at line 59 of file itkTotalVariationSingleIterationImageFilter.h.
typedef InputImageType::RegionType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::InputImageRegionType |
Definition at line 71 of file itkTotalVariationSingleIterationImageFilter.h.
typedef TInputImage itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::InputImageType |
Convenient typedefs for simplifying declarations.
Definition at line 50 of file itkTotalVariationSingleIterationImageFilter.h.
typedef InputImageType::PixelType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::InputPixelType |
Image typedef support.
Definition at line 65 of file itkTotalVariationSingleIterationImageFilter.h.
typedef InputImageType::SizeType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::InputSizeType |
Definition at line 74 of file itkTotalVariationSingleIterationImageFilter.h.
typedef itk::Image<float,InputImageDimension> itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::LocalVariationImageType |
Definition at line 53 of file itkTotalVariationSingleIterationImageFilter.h.
typedef OutputImageType::RegionType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::OutputImageRegionType |
Definition at line 72 of file itkTotalVariationSingleIterationImageFilter.h.
typedef TOutputImage itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::OutputImageType |
Definition at line 51 of file itkTotalVariationSingleIterationImageFilter.h.
typedef OutputImageType::PixelType itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::OutputPixelType |
Definition at line 69 of file itkTotalVariationSingleIterationImageFilter.h.
typedef SmartPointer<Self> itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::Pointer |
Definition at line 58 of file itkTotalVariationSingleIterationImageFilter.h.
typedef TotalVariationSingleIterationImageFilter itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::Self |
Standard class typedefs.
Definition at line 56 of file itkTotalVariationSingleIterationImageFilter.h.
typedef ImageToImageFilter< InputImageType, OutputImageType> itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::Superclass |
Definition at line 57 of file itkTotalVariationSingleIterationImageFilter.h.
itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::TotalVariationSingleIterationImageFilter | ( | ) | [protected] |
constructor
Definition at line 44 of file itkTotalVariationSingleIterationImageFilter.txx.
{ m_Lambda = 1.0; m_LocalVariation = LocalVariationImageType::New(); }
virtual itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::~TotalVariationSingleIterationImageFilter | ( | ) | [inline, protected, virtual] |
Definition at line 95 of file itkTotalVariationSingleIterationImageFilter.h.
{}
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(); }
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.
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; } }
virtual const char* itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::GetClassName | ( | ) | const [virtual] |
Run-time type information (and related methods).
virtual double itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::GetLambda | ( | ) | [virtual] |
InputImageType::Pointer itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::GetOriginialImage | ( | ) | [inline] |
Definition at line 90 of file itkTotalVariationSingleIterationImageFilter.h.
References itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::m_OriginalImage.
{ return this->m_OriginalImage; }
itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::itkStaticConstMacro | ( | OutputImageDimension | , |
unsigned | int, | ||
TOutputImage::ImageDimension | |||
) |
itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::itkStaticConstMacro | ( | InputImageDimension | , |
unsigned | int, | ||
TInputImage::ImageDimension | |||
) |
Extract dimension from input and output image.
static Pointer itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::New | ( | ) | [static] |
Method for creation through the object factory.
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 ); }
virtual void itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::SetLambda | ( | double | _arg ) | [virtual] |
void itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::SetOriginalImage | ( | InputImageType * | in ) | [inline] |
Definition at line 88 of file itkTotalVariationSingleIterationImageFilter.h.
References itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::m_OriginalImage.
{ this->m_OriginalImage = in; }
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"
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; } }
double itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::m_Lambda [protected] |
Definition at line 117 of file itkTotalVariationSingleIterationImageFilter.h.
LocalVariationImageType::Pointer itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::m_LocalVariation [protected] |
Definition at line 113 of file itkTotalVariationSingleIterationImageFilter.h.
InputImageType::Pointer itk::TotalVariationSingleIterationImageFilter< TInputImage, TOutputImage >::m_OriginalImage [protected] |