1 /*============================================================================
3 The Medical Imaging Interaction Toolkit (MITK)
5 Copyright (c) German Cancer Research Center (DKFZ)
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
11 ============================================================================*/
13 /*===================================================================
15 This file is based heavily on a corresponding ITK filter.
17 ===================================================================*/
18 #ifndef _itkTotalVariationDenoisingImageFilter_txx
19 #define _itkTotalVariationDenoisingImageFilter_txx
20 #include "itkTotalVariationDenoisingImageFilter.h"
22 #include "itkConstShapedNeighborhoodIterator.h"
23 #include "itkImageRegionConstIterator.h"
24 #include "itkImageRegionIterator.h"
25 #include "itkLocalVariationImageFilter.h"
26 #include "itkNeighborhoodAlgorithm.h"
27 #include "itkNeighborhoodInnerProduct.h"
28 #include "itkOffset.h"
29 #include "itkProgressReporter.h"
30 #include "itkZeroFluxNeumannBoundaryCondition.h"
37 template <class TInputImage, class TOutputImage>
38 TotalVariationDenoisingImageFilter<TInputImage, TOutputImage>::TotalVariationDenoisingImageFilter()
39 : m_Lambda(1.0), m_NumberIterations(0)
43 template <class TInputImage, class TOutputImage>
44 void TotalVariationDenoisingImageFilter<TInputImage, TOutputImage>::GenerateData()
46 // first we cast the input image to match output type
47 typename CastType::Pointer infilter = CastType::New();
48 infilter->SetInput(this->GetInput());
50 typename TOutputImage::Pointer image = infilter->GetOutput();
52 // a second copy of the input image is saved as reference
53 infilter = CastType::New();
54 infilter->SetInput(this->GetInput());
56 typename TOutputImage::Pointer origImage = infilter->GetOutput();
58 typename SingleIterationFilterType::Pointer filter;
59 for (int i = 0; i < m_NumberIterations; i++)
61 filter = SingleIterationFilterType::New();
62 filter->SetInput(image);
63 filter->SetOriginalImage(origImage);
64 filter->SetLambda(m_Lambda);
65 filter->SetNumberOfThreads(this->GetNumberOfThreads());
66 filter->UpdateLargestPossibleRegion();
67 image = filter->GetOutput();
68 std::cout << "Iteration " << i + 1 << "/" << m_NumberIterations << std::endl;
71 typename OutputImageType::Pointer output = this->GetOutput();
72 output->SetSpacing(image->GetSpacing());
73 typename OutputImageType::RegionType largestPossibleRegion;
74 largestPossibleRegion.SetSize(image->GetLargestPossibleRegion().GetSize());
75 largestPossibleRegion.SetIndex(image->GetLargestPossibleRegion().GetIndex());
76 output->SetLargestPossibleRegion(image->GetLargestPossibleRegion());
77 output->SetBufferedRegion(image->GetLargestPossibleRegion());
80 itk::ImageRegionIterator<OutputImageType> oit(output, output->GetLargestPossibleRegion());
83 itk::ImageRegionConstIterator<OutputImageType> iit(image, image->GetLargestPossibleRegion());
86 while (!oit.IsAtEnd())
95 * Standard "PrintSelf" method
97 template <class TInputImage, class TOutput>
98 void TotalVariationDenoisingImageFilter<TInputImage, TOutput>::PrintSelf(std::ostream &os, Indent indent) const
100 Superclass::PrintSelf(os, indent);
103 } // end namespace itk