1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: itkUnsharpMaskLevelSetImageFilter.h
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __itkUnsharpMaskLevelSetImageFilter_h
#define __itkUnsharpMaskLevelSetImageFilter_h
#include "itkLevelSetFunctionWithRefitTerm.h"
#include "itkSparseFieldFourthOrderLevelSetImageFilter.h"
namespace itk {
/**
* \class UnsharpMaskLevelSetImageFilter
*
* \brief This class implements a detail enhancing filter by making use of the
* 4th-order level set isotropic diffusion (smoothing) PDE.
*
* \par INPUT and OUTPUT
* This is a volume to volume filter; however, it is meant to process (smooth)
* surfaces. The input surface is an isosurface of the input volume. The
* isosurface value to be processed can be set by calling SetIsoSurfaceValue
* (default is 0). The output surface is the 0-isosurface of the output volume,
* regardless of the input isosurface value. To visualize the input/output
* surfaces to this filter a mesh extraction method such as marching cubes can
* be used.
*
* \par
* This filter is an example of how the 4th order level set PDE framework can
* be used for general purpose surface processing. It is motivated by unsharp
* masking from image processing which is a way of enhancing detail. This
* filter acts much like the IsotropicFourthOrderLevelSetImageFilter because it
* first smoothes the normal vectors via isotropic diffusion. However, as a
* post-processing step we extrapolate from the original normals in the
* direction opposite to the new processes normals. By refiting the surface to
* these extrapolated vectors we achieve detail enhancement. This process is
* not the same as running the isotropic diffusion process in reverse.
*
* \par IMPORTANT
* Because this filters enhances details on the surface, it will also amplify
* noise! This filter is provided only as an example of graphics oriented
* post-processing. Do not use it on noisy data.
*
* \par PARAMETERS
* As mentioned before, the IsoSurfaceValue parameter chooses which isosurface
* of the input to process. The MaxFilterIterations parameter determine the
* number of iterations for which this filter will run. Since, this filter
* enhances detail AND noise MaxFilterIterations above a couple of hundred are
* unreasonable. Finally NormalProcessUnsharpWeight controls the amount of
* extrapolation (or equivalently the amount of detail enhancement). This value
* should be in the range [0.1,1] for reasonable results.
*/
template <class TInputImage, class TOutputImage>
class ITK_EXPORT UnsharpMaskLevelSetImageFilter
: public SparseFieldFourthOrderLevelSetImageFilter <TInputImage, TOutputImage>
{
public:
/** Standard class typedefs */
typedef UnsharpMaskLevelSetImageFilter Self;
typedef SparseFieldFourthOrderLevelSetImageFilter <TInputImage,TOutputImage>
Superclass;
typedef SmartPointer<Self> Pointer;
typedef SmartPointer<const Self> ConstPointer;
/** Run-time type information (and related methods) */
itkTypeMacro(UnsharpMaskLevelSetImageFilter,
SparseFieldFourthOrderLevelSetImageFilter);
/** Standard new macro */
itkNewMacro( Self );
/** The sparse image type used in LevelSetFunctionWithRefitTerm */
typedef typename Superclass::SparseImageType SparseImageType;
/** The level set function class with a refit term that forces the curvature
of the moving front to match a prescribed curvature image. */
typedef LevelSetFunctionWithRefitTerm <TOutputImage,SparseImageType> FunctionType;
/** The radius type for the neighborhoods. */
typedef typename FunctionType::RadiusType RadiusType;
itkGetConstMacro(MaxFilterIteration,unsigned int);
itkSetMacro(MaxFilterIteration,unsigned int);
protected:
UnsharpMaskLevelSetImageFilter();
~UnsharpMaskLevelSetImageFilter() {};
virtual void PrintSelf(std::ostream& os, Indent indent) const;
/** The LevelSetFunctionWithRefitTerm object. */
typename FunctionType::Pointer m_Function;
/** The number of iterations for which this filter will run. */
unsigned int m_MaxFilterIteration;
/** This filter halts when the iteration count reaches the specified count. */
virtual bool Halt()
{
if (this->GetElapsedIterations() == m_MaxFilterIteration)
{
return true;
}
else
{
return false;
}
}
private:
UnsharpMaskLevelSetImageFilter(const Self&);
//purposely not implemented
void operator=(const Self&); //purposely not implemented
};
} // end namespace itk
#ifndef ITK_MANUAL_INSTANTIATION
#include "itkUnsharpMaskLevelSetImageFilter.txx"
#endif
#endif
|