Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef _itkTotalVariationDenoisingImageFilter_txx
00017 #define _itkTotalVariationDenoisingImageFilter_txx
00018 #include "itkTotalVariationDenoisingImageFilter.h"
00019
00020 #include "itkConstShapedNeighborhoodIterator.h"
00021 #include "itkNeighborhoodInnerProduct.h"
00022 #include "itkImageRegionIterator.h"
00023 #include "itkImageRegionConstIterator.h"
00024 #include "itkNeighborhoodAlgorithm.h"
00025 #include "itkZeroFluxNeumannBoundaryCondition.h"
00026 #include "itkOffset.h"
00027 #include "itkProgressReporter.h"
00028 #include "itkLocalVariationImageFilter.h"
00029
00030 #include <vector>
00031 #include <algorithm>
00032
00033 namespace itk
00034 {
00035
00036 template <class TInputImage, class TOutputImage>
00037 TotalVariationDenoisingImageFilter<TInputImage, TOutputImage>
00038 ::TotalVariationDenoisingImageFilter()
00039 {
00040 m_Lambda = 1.0;
00041 }
00042
00043
00044 template< class TInputImage, class TOutputImage>
00045 void
00046 TotalVariationDenoisingImageFilter< TInputImage, TOutputImage>
00047 ::GenerateData()
00048 {
00049
00050 typename CastType::Pointer infilter = CastType::New();
00051 infilter->SetInput(this->GetInput());
00052 infilter->Update();
00053 typename TOutputImage::Pointer image = infilter->GetOutput();
00054
00055
00056 infilter = CastType::New();
00057 infilter->SetInput(this->GetInput());
00058 infilter->Update();
00059 typename TOutputImage::Pointer origImage = infilter->GetOutput();
00060
00061 typename SingleIterationFilterType::Pointer filter;
00062 for(int i=0; i<m_NumberIterations; i++)
00063 {
00064 filter = SingleIterationFilterType::New();
00065 filter->SetInput( image );
00066 filter->SetOriginalImage( origImage );
00067 filter->SetLambda(m_Lambda);
00068 filter->SetNumberOfThreads(this->GetNumberOfThreads());
00069 filter->UpdateLargestPossibleRegion();
00070 image = filter->GetOutput();
00071 std::cout << "Iteration " << i+1 << "/" <<
00072 m_NumberIterations << std::endl;
00073 }
00074
00075 typename OutputImageType::Pointer output = this->GetOutput();
00076 output->SetSpacing(image->GetSpacing());
00077 typename OutputImageType::RegionType largestPossibleRegion;
00078 largestPossibleRegion.SetSize(
00079 image->GetLargestPossibleRegion().GetSize() );
00080 largestPossibleRegion.SetIndex(
00081 image->GetLargestPossibleRegion().GetIndex() );
00082 output->SetLargestPossibleRegion(
00083 image->GetLargestPossibleRegion() );
00084 output->SetBufferedRegion(
00085 image->GetLargestPossibleRegion() );
00086 output->Allocate();
00087
00088 itk::ImageRegionIterator<OutputImageType> oit(
00089 output, output->GetLargestPossibleRegion());
00090 oit.GoToBegin();
00091
00092 itk::ImageRegionConstIterator<OutputImageType> iit(
00093 image, image->GetLargestPossibleRegion());
00094 iit.GoToBegin();
00095
00096 while(!oit.IsAtEnd())
00097 {
00098 oit.Set(iit.Get());
00099 ++iit;
00100 ++oit;
00101 }
00102 }
00103
00104
00108 template <class TInputImage, class TOutput>
00109 void
00110 TotalVariationDenoisingImageFilter<TInputImage, TOutput>
00111 ::PrintSelf(
00112 std::ostream& os,
00113 Indent indent) const
00114 {
00115 Superclass::PrintSelf( os, indent );
00116 }
00117
00118 }
00119
00120 #endif