// Copyright (C) 2006 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #undef DLIB_MORPHOLOGICAL_OPERATIONs_ABSTRACT_ #ifdef DLIB_MORPHOLOGICAL_OPERATIONs_ABSTRACT_ #include "../pixel.h" #include "thresholding_abstract.h" namespace dlib { // ---------------------------------------------------------------------------------------- template < typename in_image_type, typename out_image_type, long M, long N > void binary_dilation ( const in_image_type& in_img, out_image_type& out_img, const unsigned char (&structuring_element)[M][N] ); /*! requires - in_image_type == is an implementation of array2d/array2d_kernel_abstract.h - out_image_type == is an implementation of array2d/array2d_kernel_abstract.h - pixel_traits<typename in_image_type::type>::grayscale == true - pixel_traits<typename in_image_type::type>::has_alpha == false - pixel_traits<typename out_image_type::type>::has_alpha == false - &in_img != &out_img - M % 2 == 1 (i.e. M must be odd) - N % 2 == 1 (i.e. N must be odd) - all pixels in in_img are set to either on_pixel or off_pixel (i.e. it must be a binary image) - all pixels in structuring_element are set to either on_pixel or off_pixel (i.e. it must be a binary image) ensures - Does a binary dilation of in_img using the given structuring element and stores the result in out_img. - #out_img.nc() == in_img.nc() - #out_img.nr() == in_img.nr() !*/ // ---------------------------------------------------------------------------------------- template < typename in_image_type, typename out_image_type, long M, long N > void binary_erosion ( const in_image_type& in_img, out_image_type& out_img, const unsigned char (&structuring_element)[M][N] ); /*! requires - in_image_type == is an implementation of array2d/array2d_kernel_abstract.h - out_image_type == is an implementation of array2d/array2d_kernel_abstract.h - pixel_traits<typename in_image_type::type>::grayscale == true - pixel_traits<typename in_image_type::type>::has_alpha == false - pixel_traits<typename out_image_type::type>::has_alpha == false - &in_img != &out_img - M % 2 == 1 (i.e. M must be odd) - N % 2 == 1 (i.e. N must be odd) - all pixels in in_img are set to either on_pixel or off_pixel (i.e. it must be a binary image) - all pixels in structuring_element are set to either on_pixel or off_pixel (i.e. it must be a binary image) ensures - Does a binary erosion of in_img using the given structuring element and stores the result in out_img. - #out_img.nc() == in_img.nc() - #out_img.nr() == in_img.nr() !*/ // ---------------------------------------------------------------------------------------- template < typename in_image_type, typename out_image_type, long M, long N > void binary_open ( const in_image_type& in_img, out_image_type& out_img, const unsigned char (&structuring_element)[M][N], const unsigned long iter = 1 ); /*! requires - in_image_type == is an implementation of array2d/array2d_kernel_abstract.h - out_image_type == is an implementation of array2d/array2d_kernel_abstract.h - pixel_traits<typename in_image_type::type>::grayscale == true - pixel_traits<typename in_image_type::type>::has_alpha == false - pixel_traits<typename out_image_type::type>::has_alpha == false - &in_img != &out_img - M % 2 == 1 (i.e. M must be odd) - N % 2 == 1 (i.e. N must be odd) - all pixels in in_img are set to either on_pixel or off_pixel (i.e. it must be a binary image) - all pixels in structuring_element are set to either on_pixel or off_pixel (i.e. it must be a binary image) ensures - Does a binary open of in_img using the given structuring element and stores the result in out_img. Specifically, iter iterations of binary erosion are applied and then iter iterations of binary dilation. - #out_img.nc() == in_img.nc() - #out_img.nr() == in_img.nr() !*/ // ---------------------------------------------------------------------------------------- template < typename in_image_type, typename out_image_type, long M, long N > void binary_close ( const in_image_type& in_img, out_image_type& out_img, const unsigned char (&structuring_element)[M][N], const unsigned long iter = 1 ); /*! requires - in_image_type == is an implementation of array2d/array2d_kernel_abstract.h - out_image_type == is an implementation of array2d/array2d_kernel_abstract.h - pixel_traits<typename in_image_type::type>::grayscale == true - pixel_traits<typename in_image_type::type>::has_alpha == false - pixel_traits<typename out_image_type::type>::has_alpha == false - &in_img != &out_img - M % 2 == 1 (i.e. M must be odd) - N % 2 == 1 (i.e. N must be odd) - all pixels in in_img are set to either on_pixel or off_pixel (i.e. it must be a binary image) - all pixels in structuring_element are set to either on_pixel or off_pixel (i.e. it must be a binary image) ensures - Does a binary close of in_img using the given structuring element and stores the result in out_img. Specifically, iter iterations of binary dilation are applied and then iter iterations of binary erosion. - #out_img.nc() == in_img.nc() - #out_img.nr() == in_img.nr() !*/ // ---------------------------------------------------------------------------------------- template < typename in_image_type1, typename in_image_type2, typename out_image_type > void binary_intersection ( const in_image_type1& in_img1, const in_image_type2& in_img2, out_image_type& out_img ); /*! requires - in_image_type1 == is an implementation of array2d/array2d_kernel_abstract.h - in_image_type2 == is an implementation of array2d/array2d_kernel_abstract.h - out_image_type == is an implementation of array2d/array2d_kernel_abstract.h - pixel_traits<typename in_image_type1::type>::grayscale == true - pixel_traits<typename in_image_type2::type>::grayscale == true - pixel_traits<typename in_image_type1::type>::has_alpha == false - pixel_traits<typename in_image_type2::type>::has_alpha == false - pixel_traits<typename out_image_type::type>::has_alpha == false - all pixels in in_img1 and in_img2 are set to either on_pixel or off_pixel (i.e. they must be binary images) - in_img1.nc() == in_img2.nc() - in_img1.nr() == in_img2.nr() ensures - #out_img == the binary intersection of in_img1 and in_img2. (i.e. All the pixels that are set to on_pixel in both in_img1 and in_img2 will be set to on_pixel in #out_img. All other pixels will be set to off_pixel) - #out_img.nc() == in_img.nc() - #out_img.nr() == in_img.nr() !*/ // ---------------------------------------------------------------------------------------- template < typename in_image_type1, typename in_image_type2, typename out_image_type > void binary_union ( const in_image_type1& in_img1, const in_image_type2& in_img2, out_image_type& out_img ); /*! requires - in_image_type1 == is an implementation of array2d/array2d_kernel_abstract.h - in_image_type2 == is an implementation of array2d/array2d_kernel_abstract.h - out_image_type == is an implementation of array2d/array2d_kernel_abstract.h - pixel_traits<typename in_image_type1::type>::grayscale == true - pixel_traits<typename in_image_type2::type>::grayscale == true - pixel_traits<typename in_image_type1::type>::has_alpha == false - pixel_traits<typename in_image_type2::type>::has_alpha == false - pixel_traits<typename out_image_type::type>::has_alpha == false - all pixels in in_img1 and in_img2 are set to either on_pixel or off_pixel (i.e. they must be binary images) - in_img1.nc() == in_img2.nc() - in_img1.nr() == in_img2.nr() ensures - #out_img == the binary union of in_img1 and in_img2. (i.e. All the pixels that are set to on_pixel in in_img1 and/or in_img2 will be set to on_pixel in #out_img. All other pixels will be set to off_pixel) - #out_img.nc() == in_img.nc() - #out_img.nr() == in_img.nr() !*/ // ---------------------------------------------------------------------------------------- template < typename in_image_type1, typename in_image_type2, typename out_image_type > void binary_difference ( const in_image_type1& in_img1, const in_image_type2& in_img2, out_image_type& out_img ); /*! requires - in_image_type1 == is an implementation of array2d/array2d_kernel_abstract.h - in_image_type2 == is an implementation of array2d/array2d_kernel_abstract.h - out_image_type == is an implementation of array2d/array2d_kernel_abstract.h - pixel_traits<typename in_image_type1::type>::grayscale == true - pixel_traits<typename in_image_type2::type>::grayscale == true - pixel_traits<typename in_image_type1::type>::has_alpha == false - pixel_traits<typename in_image_type2::type>::has_alpha == false - pixel_traits<typename out_image_type::type>::has_alpha == false - all pixels in in_img1 and in_img2 are set to either on_pixel or off_pixel (i.e. they must be binary images) - in_img1.nc() == in_img2.nc() - in_img1.nr() == in_img2.nr() ensures - #out_img == the binary difference of in_img1 and in_img2. (i.e. #out_img will be a copy of in_img1 except that any pixels in in_img2 that are set to on_pixel will be set to off_pixel) - #out_img.nc() == in_img.nc() - #out_img.nr() == in_img.nr() !*/ // ---------------------------------------------------------------------------------------- template < typename in_image_type, typename out_image_type > void binary_complement ( const in_image_type& in_img, out_image_type& out_img ); /*! requires - in_image_type == is an implementation of array2d/array2d_kernel_abstract.h - out_image_type == is an implementation of array2d/array2d_kernel_abstract.h - pixel_traits<typename in_image_type::type>::grayscale == true - pixel_traits<typename in_image_type::type>::has_alpha == false - pixel_traits<typename out_image_type::type>::has_alpha == false - all pixels in in_img are set to either on_pixel or off_pixel (i.e. it must be a binary image) ensures - #out_img == the binary complement of in_img. (i.e. For each pixel in in_img, if it is on_pixel then it will be set to off_pixel in #out_img and if it was off_pixel in in_img then it will be on_pixel in #out_img) - #out_img.nc() == in_img.nc() - #out_img.nr() == in_img.nr() !*/ // ---------------------------------------------------------------------------------------- } #endif // DLIB_MORPHOLOGICAL_OPERATIONs_ABSTRACT_