Smooth Image Using Min Max Curvature Flow#

Synopsis#

Smooth an image using min/max curvature flow.

Results#

input image

Input image.#

../../../../_images/bafkreihx3a2ijqjeacljtmqkwgmiahwknotoa2x2mthx7ws5tx2ljbzzwa

Output In VTK Window#

Code#

C++#

#include "itkImage.h"
#include "itkCastImageFilter.h"
#include "itkMinMaxCurvatureFlowImageFilter.h"
#include "itkSubtractImageFilter.h"
#include "itkImageFileReader.h"

#ifdef ENABLE_QUICKVIEW
#  include "QuickView.h"
#endif

int
main(int argc, char * argv[])
{
  if (argc < 2)
  {
    std::cerr << "Usage: " << argv[0];
    std::cerr << " inputImage [iterations]" << std::endl;
    return EXIT_FAILURE;
  }

  std::string inputFileName = argv[1];

  int iterations = 5;
  if (argc > 2)
  {
    std::stringstream ss(argv[2]);
    ss >> iterations;
  }

  using PixelType = float;
  constexpr unsigned int Dimension = 2;

  using ImageType = itk::Image<PixelType, Dimension>;
  using MinMaxCurvatureFlowImageFilterType = itk::MinMaxCurvatureFlowImageFilter<ImageType, ImageType>;
  using SubtractType = itk::SubtractImageFilter<ImageType>;

  const auto input = itk::ReadImage<ImageType>(inputFileName);

  MinMaxCurvatureFlowImageFilterType::Pointer minMaxCurvatureFlowImageFilter =
    MinMaxCurvatureFlowImageFilterType::New();
  minMaxCurvatureFlowImageFilter->SetInput(input);
  minMaxCurvatureFlowImageFilter->SetNumberOfIterations(iterations);
  minMaxCurvatureFlowImageFilter->SetTimeStep(0.125);

  auto diff = SubtractType::New();
  diff->SetInput1(input);
  diff->SetInput2(minMaxCurvatureFlowImageFilter->GetOutput());

#ifdef ENABLE_QUICKVIEW
  QuickView viewer;
  viewer.AddImage(input.GetPointer(), true, itksys::SystemTools::GetFilenameName(inputFileName));

  std::stringstream desc;
  desc << "MinMaxCurvatureFlow, iterations = " << iterations;
  viewer.AddImage(minMaxCurvatureFlowImageFilter->GetOutput(), true, desc.str());

  std::stringstream desc2;
  desc2 << "Original - Median";
  viewer.AddImage(diff->GetOutput(), true, desc2.str());

  viewer.Visualize();
#endif

  return EXIT_SUCCESS;
}

Classes demonstrated#

template<typename TInputImage, typename TOutputImage>
class MinMaxCurvatureFlowImageFilter : public itk::CurvatureFlowImageFilter<TInputImage, TOutputImage>

Denoise an image using min/max curvature flow.

MinMaxCurvatureFlowImageFilter implements a curvature driven image denoising algorithm [108]. Iso-brightness contours in the grayscale input image are viewed as a level set. The level set is then evolved using a curvature-based speed function:

I_t = F_{\mbox{minmax}} |\nabla I|

where F_{\mbox{minmax}} = \max(\kappa,0) if \mbox{Avg}_{\mbox{stencil}}(x) is less than or equal to T_{threshold} and \min(\kappa,0), otherwise. \kappa is the mean curvature of the iso-brightness contour at point x.

In min/max curvature flow, movement is turned on or off depending on the scale of the noise one wants to remove. Switching depends on the average image value of a region of radius R around each point. The choice of R, the stencil radius, governs the scale of the noise to be removed.

The threshold value T_{threshold} is the average intensity obtained in the direction perpendicular to the gradient at point x at the extrema of the local neighborhood.

This filter make use of the multi-threaded finite difference solver hierarchy. Updates are computed using a MinMaxCurvatureFlowFunction object. A zero flux Neumann boundary condition is used when computing derivatives near the data boundary.

See also

MinMaxCurvatureFlowFunction

See also

CurvatureFlowImageFilter

See also

BinaryMinMaxCurvatureFlowImageFilter

ITK Sphinx Examples:

Warning

This filter assumes that the input and output types have the same dimensions. This filter also requires that the output image pixels are of a real type. This filter works for any dimensional images, however for dimensions greater than 3D, an expensive brute-force search is used to compute the local threshold.

Subclassed by itk::BinaryMinMaxCurvatureFlowImageFilter< TInputImage, TOutputImage >

See itk::MinMaxCurvatureFlowImageFilter for additional documentation.