CurvatureDrivenDiffusion
Smoothes a two-dimensional image using an advanced local edge analysis technique.
Access to parameter description
For an introduction to image filters: see Images Filtering.
This algorithm smoothes an image with respect to its edges.
The algorithm is ruled by three main parameters: number of iterations, sharpness, and anisotropy.
Figure 1. Curvature-Driven diffusion on a noisy image with default parameters (10
iterations, sharpness = 0.9 and anisotropy = 0.6)
Figure 2. Influence of sharpness parameter on curvature-driven diffusion process: (left)
Sharpness = 0.1, (right) Sharpness = 2.0
Figure 3. Influence of anisotropy parameter on curvature-driven
diffusion process: (left) Anisotropy = 0.3, (right) Anisotropy = 0.9
Reference:
J.Weickert. "Anisotropic Diffusion in Image Processing". B.G. Teubber Verlag, Stuttgart, 1998.
See also
Access to parameter description
For an introduction to image filters: see Images Filtering.
This algorithm smoothes an image with respect to its edges.
The algorithm is ruled by three main parameters: number of iterations, sharpness, and anisotropy.
|
|
- The number of iterations must be specified and suitable to reach convergence. Practically, a default value of 10 iterations achieves good results in most of the cases.
- The sharpness parameter controls the amplitude of smoothing along the edge direction. A small sharpness value generates a strong global smoothing.
|
|
- The anisotropy parameter controls the local curvature-driven diffusion along the gradient direction (direction orthogonal to the edge). A low value for anisotropy parameter results in a stronger local smoothing of edges.
|
|
Reference:
J.Weickert. "Anisotropic Diffusion in Image Processing". B.G. Teubber Verlag, Stuttgart, 1998.
See also
Function Syntax
This function returns the outputImage output parameter.
// Function prototype. std::shared_ptr< iolink::ImageView > curvatureDrivenDiffusion( std::shared_ptr< iolink::ImageView > inputImage, std::shared_ptr< iolink::ImageView > inputMaskImage, int32_t numberOfIterations, double sharpnessFactor, double anisotropyFactor, std::shared_ptr< iolink::ImageView > outputImage = NULL );
This function returns the outputImage output parameter.
// Function prototype. curvature_driven_diffusion( input_image, input_mask_image, number_of_iterations = 10, sharpness_factor = 0.9, anisotropy_factor = 0.6, output_image = None )
This function returns the outputImage output parameter.
// Function prototype. public static IOLink.ImageView CurvatureDrivenDiffusion( IOLink.ImageView inputImage, IOLink.ImageView inputMaskImage, Int32 numberOfIterations = 10, double sharpnessFactor = 0.9, double anisotropyFactor = 0.6, IOLink.ImageView outputImage = null );
Class Syntax
Parameters
Class Name | CurvatureDrivenDiffusion |
---|
Parameter Name | Description | Type | Supported Values | Default Value | |
---|---|---|---|---|---|
inputImage |
The input image. | Image | Binary, Label, Grayscale or Multispectral | nullptr | |
inputMaskImage |
The optional binary mask defining area to process into input image (null to process the whole image). It must have same dimensions as the input image and cannot be null. | Image | Binary | nullptr | |
numberOfIterations |
The number of iterations of the curvature-driven diffusion process (must be a positive integer). | Int32 | >=1 | 10 | |
The edge preserving factor. | Float64 | >=0 | 0.9 | ||
anisotropyFactor |
The curvature-driven factor (value within ]0, 1[). | Float64 | [0, 0.99999] | 0.6 | |
outputImage |
The output image. Its dimensions, type, and calibration are forced to the same values as the input. | Image | nullptr |
Object Examples
std::shared_ptr< iolink::ImageView > polystyrene = ioformat::readImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene.tif" ); auto polystyrene_sep = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene_sep.vip" ); CurvatureDrivenDiffusion curvatureDrivenDiffusionAlgo; curvatureDrivenDiffusionAlgo.setInputImage( polystyrene ); curvatureDrivenDiffusionAlgo.setInputMaskImage( polystyrene_sep ); curvatureDrivenDiffusionAlgo.setNumberOfIterations( 3 ); curvatureDrivenDiffusionAlgo.setSharpnessFactor( 0.9 ); curvatureDrivenDiffusionAlgo.setAnisotropyFactor( 0.6 ); curvatureDrivenDiffusionAlgo.execute(); std::cout << "outputImage:" << curvatureDrivenDiffusionAlgo.outputImage()->toString();
polystyrene = ioformat.read_image(imagedev_data.get_image_path("polystyrene.tif")) polystyrene_sep = imagedev.read_vip_image(imagedev_data.get_image_path("polystyrene_sep.vip")) curvature_driven_diffusion_algo = imagedev.CurvatureDrivenDiffusion() curvature_driven_diffusion_algo.input_image = polystyrene curvature_driven_diffusion_algo.input_mask_image = polystyrene_sep curvature_driven_diffusion_algo.number_of_iterations = 3 curvature_driven_diffusion_algo.sharpness_factor = 0.9 curvature_driven_diffusion_algo.anisotropy_factor = 0.6 curvature_driven_diffusion_algo.execute() print( "output_image:", str( curvature_driven_diffusion_algo.output_image ) )
ImageView polystyrene = ViewIO.ReadImage( @"Data/images/polystyrene.tif" ); ImageView polystyrene_sep = Data.ReadVipImage( @"Data/images/polystyrene_sep.vip" ); CurvatureDrivenDiffusion curvatureDrivenDiffusionAlgo = new CurvatureDrivenDiffusion { inputImage = polystyrene, inputMaskImage = polystyrene_sep, numberOfIterations = 3, sharpnessFactor = 0.9, anisotropyFactor = 0.6 }; curvatureDrivenDiffusionAlgo.Execute(); Console.WriteLine( "outputImage:" + curvatureDrivenDiffusionAlgo.outputImage.ToString() );
Function Examples
std::shared_ptr< iolink::ImageView > polystyrene = ioformat::readImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene.tif" ); auto polystyrene_sep = readVipImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene_sep.vip" ); auto result = curvatureDrivenDiffusion( polystyrene, polystyrene_sep, 3, 0.9, 0.6 ); std::cout << "outputImage:" << result->toString();
polystyrene = ioformat.read_image(imagedev_data.get_image_path("polystyrene.tif")) polystyrene_sep = imagedev.read_vip_image(imagedev_data.get_image_path("polystyrene_sep.vip")) result = imagedev.curvature_driven_diffusion( polystyrene, polystyrene_sep, 3, 0.9, 0.6 ) print( "output_image:", str( result ) )
ImageView polystyrene = ViewIO.ReadImage( @"Data/images/polystyrene.tif" ); ImageView polystyrene_sep = Data.ReadVipImage( @"Data/images/polystyrene_sep.vip" ); IOLink.ImageView result = Processing.CurvatureDrivenDiffusion( polystyrene, polystyrene_sep, 3, 0.9, 0.6 ); Console.WriteLine( "outputImage:" + result.ToString() );