    // Copyright (C) 2008  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #undef DLIB_EDGE_DETECTOr_ABSTRACT_
    #ifdef DLIB_EDGE_DETECTOr_ABSTRACT_

    #include "../pixel.h"
    #include "../image_processing/generic_image.h"

    namespace dlib
    {

    // ----------------------------------------------------------------------------------------

        template <
            typename T
            >
        inline char edge_orientation (
            const T& x,
            const T& y
        );
        /*!
            ensures
                - returns the orientation of the line drawn from the origin to the point (x,y).
                  The orientation is represented pictorially using the four ascii
                  characters /,|,\, and -.
                - if (the line is horizontal) then
                    returns '-'
                - if (the line is vertical) then
                    returns '|'
                - if (the line is diagonal with a positive slope) then
                    returns '/'
                - if (the line is diagonal with a negative slope) then
                    returns '\\'
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename in_image_type,
            typename out_image_type
            >
        void sobel_edge_detector (
            const in_image_type& in_img,
            out_image_type& horz,
            out_image_type& vert
        );
        /*!
            requires
                - in_image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
                - out_image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
                - out_image_type must use signed grayscale pixels
                - is_same_object(in_img,horz) == false
                - is_same_object(in_img,vert) == false
                - is_same_object(horz,vert) == false
            ensures
                - Applies the sobel edge detector to the given input image and stores the resulting
                  edge detections in the horz and vert images
                - #horz.nr() == in_img.nr()
                - #horz.nc() == in_img.nc()
                - #vert.nr() == in_img.nr()
                - #vert.nc() == in_img.nc()
                - for all valid r and c:
                    - #horz[r][c] == the magnitude of the horizontal gradient at the point in_img[r][c]
                    - #vert[r][c] == the magnitude of the vertical gradient at the point in_img[r][c]
                    - edge_orientation(#vert[r][c], #horz[r][c]) == the edge direction at this point in
                      the image
        !*/

    // ----------------------------------------------------------------------------------------

        template <
            typename in_image_type,
            typename out_image_type
            >
        void suppress_non_maximum_edges (
            const in_image_type& horz,
            const in_image_type& vert,
            out_image_type& out_img
        );
        /*!
            requires
                - in_image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
                - out_image_type == an image object that implements the interface defined in
                  dlib/image_processing/generic_image.h
                - horz.nr() == vert.nr()
                - horz.nc() == vert.nc()
                - is_same_object(out_img, horz) == false
                - is_same_object(out_img, vert) == false
                - image_traits<in_image_type>::pixel_type == A signed scalar type (e.g. int, double, etc.)
            ensures
                - #out_img.nr() = horz.nr()
                - #out_img.nc() = horz.nc()
                - let edge_strength(r,c) == sqrt(pow(horz[r][c],2) + pow(vert[r][c],2))
                  (i.e. The Euclidean norm of the gradient)
                - for all valid r and c:
                    - if (edge_strength(r,c) is at a maximum with respect to its 2 neighboring
                      pixels along the line given by edge_orientation(vert[r][c],horz[r][c])) then
                        - performs assign_pixel(#out_img[r][c], edge_strength(r,c))
                    - else
                        - performs assign_pixel(#out_img[r][c], 0)
        !*/

    // ----------------------------------------------------------------------------------------

    }

    #endif // DLIB_EDGE_DETECTOr_ABSTRACT_