ImageDev

GradientOperator2d

Provides different algorithms to perform an edge detection based on the first derivative of a two-dimensional image.

Access to parameter description

For an introduction: GradientOperator2d computes a first order derivative in each image axis direction. To minimize the effect of noise, the algorithm can be combined with a smoothing filter for computing the gradient. A smoothing scale parameter determines the smoothing intensity. If its value is large, noise is reduced but edges are less sharp and only the most significant edges are revealed (this behavior is reversed for the Shen and Castan algorithm). It is important to select the right coefficient to lower the noise just enough without defocusing the edges. Finally the algorithm optionally computes the magnitude of the gradient vectors either by selecting its maximum component or its Euclidean norm.

The following algorithms are proposed to extract the edges of an image: Notices: References
[1] R.Deriche. "Using Canny's criteria to derive a recursively implemented optimal edge detector". International Journal of Computer Vision, vol.1, no 2, pp. 167-187, Jun. 1987.
[2] J.Shen, S.Castan. "An optimal linear operator for step edge detection". CVGIP : Graphical Models and Image Processing, vol.54, no 2, pp. 112-133, Mar. 1992.
[3] J.F.Canny. "A computational approach to edge detection." IEEE Transactions on Pattern Analysis and Machine Intelligence, vol.8, No 6, pp. 679-698, Nov. 1986.

See also

Function Syntax

This function returns a GradientOperator2dOutput structure containing the outputImageX, outputImageY, outputAmplitudeImage and outputOrientationImage output parameters.
// Output structure.
struct GradientOperator2dOutput
{
    std::shared_ptr< iolink::ImageView > outputImageX;
    std::shared_ptr< iolink::ImageView > outputImageY;
    std::shared_ptr< iolink::ImageView > outputAmplitudeImage;
    std::shared_ptr< iolink::ImageView > outputOrientationImage;
};

// Function prototype.
GradientOperator2dOutput
gradientOperator2d( std::shared_ptr< iolink::ImageView > inputImage,
                    GradientOperator2d::GradientOperator gradientOperator,
                    GradientOperator2d::GradientMode gradientMode,
                    double smoothingFactor,
                    std::shared_ptr< iolink::ImageView > outputImageX = NULL,
                    std::shared_ptr< iolink::ImageView > outputImageY = NULL,
                    std::shared_ptr< iolink::ImageView > outputAmplitudeImage = NULL,
                    std::shared_ptr< iolink::ImageView > outputOrientationImage = NULL );
This function returns a tuple containing the output_image_x, output_image_y, output_amplitude_image and output_orientation_image output parameters.
// Function prototype.
gradient_operator_2d( input_image,
                      gradient_operator = GradientOperator2d.GradientOperator.CANNY_DERICHE,
                      gradient_mode = GradientOperator2d.GradientMode.AMPLITUDE_MAXIMUM,
                      smoothing_factor = 60,
                      output_image_x = None,
                      output_image_y = None,
                      output_amplitude_image = None,
                      output_orientation_image = None )
This function returns a GradientOperator2dOutput structure containing the outputImageX, outputImageY, outputAmplitudeImage and outputOrientationImage output parameters.
/// Output structure of the GradientOperator2d function.
public struct GradientOperator2dOutput
{
    public IOLink.ImageView outputImageX;
    public IOLink.ImageView outputImageY;
    public IOLink.ImageView outputAmplitudeImage;
    public IOLink.ImageView outputOrientationImage;
};

// Function prototype.
public static GradientOperator2dOutput
GradientOperator2d( IOLink.ImageView inputImage,
                    GradientOperator2d.GradientOperator gradientOperator = ImageDev.GradientOperator2d.GradientOperator.CANNY_DERICHE,
                    GradientOperator2d.GradientMode gradientMode = ImageDev.GradientOperator2d.GradientMode.AMPLITUDE_MAXIMUM,
                    double smoothingFactor = 60,
                    IOLink.ImageView outputImageX = null,
                    IOLink.ImageView outputImageY = null,
                    IOLink.ImageView outputAmplitudeImage = null,
                    IOLink.ImageView outputOrientationImage = null );

Class Syntax

Parameters

Class Name GradientOperator2d

Parameter Name Description Type Supported Values Default Value
input
inputImage
The input image. Image Binary, Label, Grayscale or Multispectral nullptr
input
gradientOperator
The gradient operator to apply.
CANNY_DERICHE The gradient is computed using the Canny-Deriche algorithm. Supported gradient output modes : AMPLITUDE_MAX_OF_MAGS, AMPLITUDE_EUCLIDEAN, AMPLITUDE_AND_ORIENTATION and X_AND_Y_GRADIENTS.
SHEN_CASTAN The gradient is computed using the Shen and Castan algorithm. Supported gradient output modes : AMPLITUDE_MAX_OF_MAGS.
KERNEL3X3 The gradient is computed using the Sobel 3x3 kernel algorithm. Supported gradient output modes : AMPLITUDE_MAX_OF_MAGS, AMPLITUDE_EUCLIDEAN, AMPLITUDE_AND_ORIENTATION and X_AND_Y_GRADIENTS.
CANNY The gradient is computed using the Canny algorithm. Supported gradient output modes : AMPLITUDE_MAX_OF_MAGS and AMPLITUDE_EUCLIDEAN.
GAUSSIAN The gradient is computed using the Gaussian algorithm. Supported gradient output modes : AMPLITUDE_MAX_OF_MAGS, AMPLITUDE_EUCLIDEAN, AMPLITUDE_AND_ORIENTATION and X_AND_Y_GRADIENTS.
SOBEL The gradient is computed using the Sobel algorithm. Supported gradient output modes : AMPLITUDE_MAX_OF_MAGS, AMPLITUDE_EUCLIDEAN, AMPLITUDE_AND_ORIENTATION and X_AND_Y_GRADIENTS.
PREWITT The gradient is computed using the Prewitt algorithm. Supported gradient output modes : AMPLITUDE_MAX_OF_MAGS, AMPLITUDE_EUCLIDEAN, AMPLITUDE_AND_ORIENTATION and X_AND_Y_GRADIENTS.
Enumeration CANNY_DERICHE
input
gradientMode
The output image to compute.
AMPLITUDE_MAXIMUM This option computes the gradient maximal amplitude. Only the outputAmplitudeImage output is set using this mode.
AMPLITUDE_EUCLIDEAN This option computes the gradient Euclidean amplitude. Only the outputAmplitudeImage output is set using this mode.
AMPLITUDE_AND_ORIENTATION This option computes Euclidean amplitude and orientation in degrees (between -128 and +128 degrees). Both outputAmplitudeImage and outputOrientationImage outputs are set using this mode.
X_AND_Y_GRADIENTS This option computes gradient in X and Y directions. Both outputImageX and outputImageY outputs are set using this mode.
Enumeration AMPLITUDE_MAXIMUM
input
smoothingFactor
The smoothing factor defines the gradient sharpness. It is only used with Canny Deriche, Shen Castan, and Gaussian operators. It has a totally different meaning depending on the selected gradient operator. Its value must be between 0 and 100.
  • Canny-Deriche: it is inversely proportional to Deriche alpha smoothing factor, in pixels. Low values provide sharp gradient. $SmoothingFactor=\frac{(5.3-\alpha)}{5}\times 100$
  • Shen And Castan: it is proportional to Shen Castan p smoothing factor, in pixels. High values provide sharp gradient.
  • Gaussian: the Gaussian kernel standard deviation, in pixels. Low values provide sharp gradient.
  • Prewitt, Sobel, Canny: it is ignored.
  • Float64 ]0, 100] 60
    output
    outputImageX
    The X-gradient output image. Image nullptr
    output
    outputImageY
    The Y-gradient output image. Image nullptr
    output
    outputAmplitudeImage
    The gradient amplitude output image. Image nullptr
    output
    outputOrientationImage
    The gradient orientation output image. Image nullptr

    Object Examples

    std::shared_ptr< iolink::ImageView > polystyrene = ioformat::readImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene.tif" );
    
    GradientOperator2d gradientOperator2dAlgo;
    gradientOperator2dAlgo.setInputImage( polystyrene );
    gradientOperator2dAlgo.setGradientOperator( GradientOperator2d::GradientOperator::CANNY_DERICHE );
    gradientOperator2dAlgo.setGradientMode( GradientOperator2d::GradientMode::AMPLITUDE_MAXIMUM );
    gradientOperator2dAlgo.setSmoothingFactor( 60.0 );
    gradientOperator2dAlgo.execute();
    
    std::cout << "outputImageX:" << gradientOperator2dAlgo.outputImageX()->toString();
    std::cout << "outputImageY:" << gradientOperator2dAlgo.outputImageY()->toString();
    std::cout << "outputAmplitudeImage:" << gradientOperator2dAlgo.outputAmplitudeImage()->toString();
    std::cout << "outputOrientationImage:" << gradientOperator2dAlgo.outputOrientationImage()->toString();
    
    polystyrene = ioformat.read_image(imagedev_data.get_image_path("polystyrene.tif"))
    
    gradient_operator_2d_algo = imagedev.GradientOperator2d()
    gradient_operator_2d_algo.input_image = polystyrene
    gradient_operator_2d_algo.gradient_operator = imagedev.GradientOperator2d.CANNY_DERICHE
    gradient_operator_2d_algo.gradient_mode = imagedev.GradientOperator2d.AMPLITUDE_MAXIMUM
    gradient_operator_2d_algo.smoothing_factor = 60.0
    gradient_operator_2d_algo.execute()
    
    print( "output_image_x:", str( gradient_operator_2d_algo.output_image_x ) );
    print( "output_image_y:", str( gradient_operator_2d_algo.output_image_y ) );
    print( "output_amplitude_image:", str( gradient_operator_2d_algo.output_amplitude_image ) );
    print( "output_orientation_image:", str( gradient_operator_2d_algo.output_orientation_image ) );
    
    ImageView polystyrene = ViewIO.ReadImage( @"Data/images/polystyrene.tif" );
    
    GradientOperator2d gradientOperator2dAlgo = new GradientOperator2d
    {
        inputImage = polystyrene,
        gradientOperator = GradientOperator2d.GradientOperator.CANNY_DERICHE,
        gradientMode = GradientOperator2d.GradientMode.AMPLITUDE_MAXIMUM,
        smoothingFactor = 60.0
    };
    gradientOperator2dAlgo.Execute();
    
    Console.WriteLine( "outputImageX:" + gradientOperator2dAlgo.outputImageX.ToString() );
    Console.WriteLine( "outputImageY:" + gradientOperator2dAlgo.outputImageY.ToString() );
    Console.WriteLine( "outputAmplitudeImage:" + gradientOperator2dAlgo.outputAmplitudeImage.ToString() );
    Console.WriteLine( "outputOrientationImage:" + gradientOperator2dAlgo.outputOrientationImage.ToString() );
    

    Function Examples

    std::shared_ptr< iolink::ImageView > polystyrene = ioformat::readImage( std::string( IMAGEDEVDATA_IMAGES_FOLDER ) + "polystyrene.tif" );
    
    auto result = gradientOperator2d( polystyrene, GradientOperator2d::GradientOperator::CANNY_DERICHE, GradientOperator2d::GradientMode::AMPLITUDE_MAXIMUM, 60.0 );
    
    std::cout << "outputImageX:" << result.outputImageX->toString();
    std::cout << "outputImageY:" << result.outputImageY->toString();
    std::cout << "outputAmplitudeImage:" << result.outputAmplitudeImage->toString();
    std::cout << "outputOrientationImage:" << result.outputOrientationImage->toString();
    
    polystyrene = ioformat.read_image(imagedev_data.get_image_path("polystyrene.tif"))
    
    result_output_image_x, result_output_image_y, result_output_amplitude_image, result_output_orientation_image = imagedev.gradient_operator_2d( polystyrene, imagedev.GradientOperator2d.CANNY_DERICHE, imagedev.GradientOperator2d.AMPLITUDE_MAXIMUM, 60.0 )
    
    print( "output_image_x:", str( result_output_image_x ) );
    print( "output_image_y:", str( result_output_image_y ) );
    print( "output_amplitude_image:", str( result_output_amplitude_image ) );
    print( "output_orientation_image:", str( result_output_orientation_image ) );
    
    ImageView polystyrene = ViewIO.ReadImage( @"Data/images/polystyrene.tif" );
    
    Processing.GradientOperator2dOutput result = Processing.GradientOperator2d( polystyrene, GradientOperator2d.GradientOperator.CANNY_DERICHE, GradientOperator2d.GradientMode.AMPLITUDE_MAXIMUM, 60.0 );
    
    Console.WriteLine( "outputImageX:" + result.outputImageX.ToString() );
    Console.WriteLine( "outputImageY:" + result.outputImageY.ToString() );
    Console.WriteLine( "outputAmplitudeImage:" + result.outputAmplitudeImage.ToString() );
    Console.WriteLine( "outputOrientationImage:" + result.outputOrientationImage.ToString() );