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] |
1.7.2