ImageDev

CurvatureDrivenDiffusion

Smooths 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 smooths 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

Function Syntax

This function returns outputImage.
// 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 = nullptr );
This function returns outputImage.
// Function prototype.
curvature_driven_diffusion(input_image: idt.ImageType,
                           input_mask_image: idt.ImageType,
                           number_of_iterations: int = 10,
                           sharpness_factor: float = 0.9,
                           anisotropy_factor: float = 0.6,
                           output_image: idt.ImageType = None) -> idt.ImageType
This function returns outputImage.
// 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

Parameter Name Description Type Supported Values Default Value
input
inputImage
The input image. Image Binary, Label, Grayscale or Multispectral nullptr
input
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
input
numberOfIterations
The number of iterations of the curvature-driven diffusion process (must be a positive integer). Int32 >=1 10
input
sharpnessFactor
The edge preserving factor. Float64 >=0 0.9
input
anisotropyFactor
The curvature-driven factor (value within ]0, 1[). Float64 [0, 0.99999] 0.6
output
outputImage
The output image. Its dimensions, type, and calibration are forced to the same values as the input. Image nullptr
Parameter Name Description Type Supported Values Default Value
input
input_image
The input image. image Binary, Label, Grayscale or Multispectral None
input
input_mask_image
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 None
input
number_of_iterations
The number of iterations of the curvature-driven diffusion process (must be a positive integer). int32 >=1 10
input
sharpness_factor
The edge preserving factor. float64 >=0 0.9
input
anisotropy_factor
The curvature-driven factor (value within ]0, 1[). float64 [0, 0.99999] 0.6
output
output_image
The output image. Its dimensions, type, and calibration are forced to the same values as the input. image None
Parameter Name Description Type Supported Values Default Value
input
inputImage
The input image. Image Binary, Label, Grayscale or Multispectral null
input
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 null
input
numberOfIterations
The number of iterations of the curvature-driven diffusion process (must be a positive integer). Int32 >=1 10
input
sharpnessFactor
The edge preserving factor. Float64 >=0 0.9
input
anisotropyFactor
The curvature-driven factor (value within ]0, 1[). Float64 [0, 0.99999] 0.6
output
outputImage
The output image. Its dimensions, type, and calibration are forced to the same values as the input. Image null

Object Examples

auto 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

auto 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() );