diff --git a/example/sobel_scharr.cpp b/example/sobel_scharr.cpp index 10e15c2230..2227d3021c 100644 --- a/example/sobel_scharr.cpp +++ b/example/sobel_scharr.cpp @@ -26,8 +26,12 @@ int main(int argc, char* argv[]) auto dy = gil::view(dy_image); if (filter_type == "sobel") { - gil::detail::convolve_2d(input, gil::generate_dx_sobel(1), dx); - gil::detail::convolve_2d(input, gil::generate_dy_sobel(1), dy); + // gil::generate_sobel_kernel({x_order, y_order}, size) + // x_order : Order of derivative in horizontal direction. + // y_order : Order of derivative in vertical direction. + // size : Optional parameter which specifies desired size of resultant kernel. + gil::detail::convolve_2d(input, gil::generate_sobel_kernel({1, 0}), dx); + gil::detail::convolve_2d(input, gil::generate_sobel_kernel({0, 1}), dy); } else if (filter_type == "scharr") { diff --git a/include/boost/gil/detail/math.hpp b/include/boost/gil/detail/math.hpp index 934f11ac82..5ba03e0904 100644 --- a/include/boost/gil/detail/math.hpp +++ b/include/boost/gil/detail/math.hpp @@ -1,5 +1,6 @@ // // Copyright 2019 Olzhas Zhumabek +// Copyright 2021 Prathamesh Tagore // // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at @@ -8,17 +9,43 @@ #ifndef BOOST_GIL_IMAGE_PROCESSING_DETAIL_MATH_HPP #define BOOST_GIL_IMAGE_PROCESSING_DETAIL_MATH_HPP -#include +#include #include +#include +#include +#include namespace boost { namespace gil { namespace detail { + +enum class kernel_type +{ + sobel_dx, + sobel_dy, + smoothing +}; + +enum class flatten_orientation +{ + left_to_right, + top_to_bottom +}; static constexpr double pi = 3.14159265358979323846; static constexpr std::array dx_sobel = {{-1, 0, 1, -2, 0, 2, -1, 0, 1}}; +static constexpr std::array dx_sobel_2_5 = { + 1, 0, -2, 0, 1, 4, 0, -8, 0, 4, 6, 0, -12, 0, 6, 4, 0, -8, 0, 4, 1, 0, -2, 0, 1 +}; +// In variable name "dx_sobel_2_5", "2" indicates that the order of Sobel derivative in x-direction +// is 2 and "5" indicates that the dimension of kernel created from this array will be 5x5. +// Analogous terminology is used for variable "dy_sobel_2_5". static constexpr std::array dx_scharr = {{-1, 0, 1, -1, 0, 1, -1, 0, 1}}; static constexpr std::array dy_sobel = {{1, 2, 1, 0, 0, 0, -1, -2, -1}}; +static constexpr std::array dy_sobel_2_5 = { + 1, 4, 6, 4, 1, 0, 0, 0, 0, 0, -2, -8, -12, -8, -2, 0, 0, 0, 0, 0, 1, 4, 6, 4, 1 +}; static constexpr std::array dy_scharr = {{1, 1, 1, 0, 0, 0, -1, -1, -1}}; +static constexpr std::array smoothing_kernel_vector = {1, 2, 1, 2, 4, 2, 1, 2, 1}; template inline detail::kernel_2d get_identity_kernel() @@ -28,6 +55,310 @@ inline detail::kernel_2d get_identity_kernel() return kernel; } +/// \defgroup Kernel_generation +/// \brief Set of helper functions used for generating kernels. + +/// \brief Fills a gray32f_view_t view with a kernel specified by argument "type". +/// \ingroup Kernel_generation +/// \param view - Gil image view of type gray32f_view_t which will be filled with a kernel specified +/// by variable "type". +/// \param type - Enum variable specifying the kernel which is to be filled inside "view". +inline void fill_kernel(gil::gray32f_view_t view, kernel_type type) +{ + if (type == kernel_type::sobel_dx) + { + for (std::ptrdiff_t row = 0; row < 3; ++row) + { + for (std::ptrdiff_t col = 0; col < 3; ++col) + { + view(col, row)[0] = dx_sobel[3 * row + col]; + } + } + } + else if (type == kernel_type::sobel_dy) + { + for (std::ptrdiff_t row = 0; row < 3; ++row) + { + for (std::ptrdiff_t col = 0; col < 3; ++col) + { + view(col, row)[0] = dy_sobel[3 * row + col]; + } + } + } + else if (type == kernel_type::smoothing) + { + for (std::ptrdiff_t row = 0; row < 3; ++row) + { + for (std::ptrdiff_t col = 0; col < 3; ++col) + { + view(col, row)[0] = smoothing_kernel_vector[3 * row + col]; + } + } + } +} + +/// \brief Converts a gray32f_view_t into a one dimensional kernel in a specific manner as specified +/// by variable "orient". +/// \ingroup Kernel_generation +/// \param view - Gil image view of type gray32f_view_t which will be converted into a one +/// dimensional kernel vector for creating a kernel from it. +/// \param orient - Variable specifying the manner of traversal(top to bootom or left to right) used +/// for traversing "view" for filling the resultant vector. +inline void gray32f_view_to_1d_kernel_vector(gil::gray32f_view_t view, + std::vector& view_vector, flatten_orientation orient = flatten_orientation::left_to_right) +{ + if (orient == flatten_orientation::left_to_right) + { + for (std::ptrdiff_t i = 0; i < static_cast(view.width()); ++i) + { + for (std::ptrdiff_t j = 0; j < static_cast(view.height()); ++j) + { + view_vector.push_back(view(i, j)[0]); + } + } + } + else if (orient == flatten_orientation::top_to_bottom) + { + for (std::ptrdiff_t i = 0; i < static_cast(view.height()); ++i) + { + for (std::ptrdiff_t j = 0; j < static_cast(view.width()); ++j) + { + view_vector.push_back(view(j, i)[0]); + } + } + } +} + +/// \brief Performs convolution between a gray32f_view_t view and a kernel created from another +/// gray32f_view_t view using the function "gray32f_view_to_1d_kernel_vector()". +/// \ingroup Kernel_generation +/// \param view1 - Gil image view of type gray32f_view_t which will be used as first argument for +/// convolution operation. +/// \param view2 - Gil image view of type gray32f_view_t which will be used for creating a two +/// dimensional kernel. This kernel will then be used as second argument in +/// convolution operation. +/// \param dst_view - Gil image view of type gray32f_view_t which will be used for storing the +/// result obtained after applying the convolution operation. +inline void view_convolve(gil::gray32f_view_t view1, gil::gray32f_view_t view2, + gil::gray32f_view_t dst_view) +{ + std::vector kernel_vector; + gray32f_view_to_1d_kernel_vector(view2, kernel_vector); + detail::kernel_2d kernel(kernel_vector.begin(), kernel_vector.size(), + view2.height() / 2, view2.width() / 2); + detail::convolve_2d(view1, kernel, dst_view); +} + +// Convention used for naming some variables :- +// 1. kernel_$_# : +// Here, '$' represents the direction of derivative kernel(x or y) stored inside that variable. +// '#' represents the order of derivative in the direction specified by '$'. +// 2. $_repetition : +// This variable specifies no. of times the kernel in direction '$' should be convolved +// with itself for obtaining the resultant kernel of desired order in that direction. +// Note : This process on its own will often not lead us to the required kernel. +// 3. $_decrease : +// This variable will store the amount of decrease in single step convolution iterations +// obtained due to the use of '$_repetition'. +// 4. resultant_kernel_$ : +// This variable will store the required kernel of desired order in direction specified by +// variable '$'. +// 5. $_size : +// This variable will store the size of resultant kernel of desired order in direction specified +// by '$'. + +/// \brief Function used for obtaining Sobel kernels. +/// \ingroup Kernel_generation +/// \param order - Contains desired order of derivative for Sobel kernel in x and y direction +/// respectively. +/// \param size_desired - Optional argument which specifies the desired size of resultant Sobel +/// kernel. +inline void get_sobel_kernel(std::array const order, + std::vector& resultant_kernel_flatten, int const size_desired = -1) +{ + unsigned int const x_size = order[0] ? 2 * order[0] + 1 : 0; + unsigned int const y_size = order[1] ? 2 * order[1] + 1 : 0; + unsigned int size; // Will store size of resultant kernel. + if (order[0] && order[1] && size_desired == -1) + { + size = x_size + y_size - 1; + } + else if ((order[0] == 0 || order[1] == 0) && size_desired == -1) + { + size = x_size ? x_size : y_size; + } + else if (size_desired != -1) + { + size = size_desired; + } + + if (size > 19) + { + throw std::length_error("Kernels with size greater than 19x19 are not yet supported\n"); + } + gil::gray32f_image_t kernel_x_1(3, 3), kernel_y_1(3, 3), resultant_kernel(size, size); + gil::gray32f_image_t resultant_kernel_y(y_size, y_size); + + if (order[0]) + { + double const x_repetition = static_cast(std::log2(order[0] - 1)); + double const x_decrease = std::pow(2, x_repetition); + unsigned int convolve_count = static_cast(x_decrease); + unsigned int prev_size = 3; + + fill_kernel(view(kernel_x_1), kernel_type::sobel_dx); + copy_pixels(view(kernel_x_1), subimage_view(view(resultant_kernel), + size / 2 - 1, size / 2 - 1, 3, 3)); + for (unsigned int i = 0; i < x_repetition; ++i) + { + unsigned int intermediate_img_size = prev_size + + static_cast(std::pow(2, i + 1)); + gil::gray32f_image_t intermediate_img(intermediate_img_size, intermediate_img_size); + view_convolve(subimage_view(view(resultant_kernel), + size / 2 - intermediate_img_size / 2, size / 2 - intermediate_img_size / 2, + intermediate_img_size, intermediate_img_size), subimage_view( + view(resultant_kernel), size / 2 - prev_size / 2, size / 2 - prev_size / 2, + prev_size, prev_size), view(intermediate_img)); + copy_pixels(view(intermediate_img), subimage_view(view(resultant_kernel), + size / 2 - intermediate_img_size / 2, size / 2 - intermediate_img_size / 2, + intermediate_img_size, intermediate_img_size)); + prev_size = intermediate_img_size; + } + for (unsigned int i = 0; i < order[0] - x_decrease; ++i) + { + ++convolve_count; + unsigned int intermediate_img_size = 2 * convolve_count + 1; + gil::gray32f_image_t intermediate_img(intermediate_img_size, intermediate_img_size); + view_convolve(subimage_view(view(resultant_kernel), + size / 2 - convolve_count, size / 2 - convolve_count, + intermediate_img_size, intermediate_img_size), + view(kernel_x_1), view(intermediate_img)); + copy_pixels(view(intermediate_img), subimage_view(view(resultant_kernel), + size / 2 - convolve_count, size / 2 - convolve_count, + intermediate_img_size, intermediate_img_size)); + } + } + if (order[1]) + { + double const y_repetition = static_cast(std::log2(order[1] - 1)); + double const y_decrease = std::pow(2, y_repetition); + unsigned int convolve_count = static_cast(y_decrease); + unsigned int prev_size = 3; + + fill_kernel(view(kernel_y_1), kernel_type::sobel_dy); + copy_pixels(view(kernel_y_1), subimage_view(view(resultant_kernel_y), + y_size / 2 - 1, y_size / 2 - 1, 3, 3)); + for (unsigned int i = 0; i < y_repetition; ++i) + { + unsigned int intermediate_img_size = prev_size + + static_cast(std::pow(2, i + 1)); + gil::gray32f_image_t intermediate_img(intermediate_img_size, intermediate_img_size); + view_convolve(subimage_view(view(resultant_kernel_y), + y_size / 2 - intermediate_img_size / 2, y_size / 2 - intermediate_img_size / 2, + intermediate_img_size, intermediate_img_size), subimage_view( + view(resultant_kernel_y), y_size / 2 - prev_size / 2, y_size / 2 - prev_size / 2, + prev_size, prev_size), view(intermediate_img)); + copy_pixels(view(intermediate_img), subimage_view(view(resultant_kernel_y), + y_size / 2 - intermediate_img_size / 2, y_size / 2 - intermediate_img_size / 2, + intermediate_img_size, intermediate_img_size)); + prev_size = intermediate_img_size; + } + for (unsigned int i = 0; i < order[1] - y_decrease; ++i) + { + ++convolve_count; + unsigned int intermediate_img_size = 2 * convolve_count + 1; + gil::gray32f_image_t intermediate_img(intermediate_img_size, intermediate_img_size); + view_convolve(subimage_view(view(resultant_kernel_y), + y_size / 2 - convolve_count, y_size / 2 - convolve_count, + intermediate_img_size, intermediate_img_size), + view(kernel_y_1), view(intermediate_img)); + copy_pixels(view(intermediate_img), subimage_view(view(resultant_kernel_y), + y_size / 2 - convolve_count, y_size / 2 - convolve_count, + intermediate_img_size, intermediate_img_size)); + } + } + + if (order[0] && order[1]) + { + unsigned int intermediate_img_size = x_size + y_size - 1; + unsigned int xy_combine_origin = size / 2 - x_size / 2 - y_size / 2; + gray32f_image_t intermediate_img(intermediate_img_size, intermediate_img_size); + + view_convolve(subimage_view(view(resultant_kernel), xy_combine_origin, xy_combine_origin, + intermediate_img_size, intermediate_img_size), view(resultant_kernel_y), + view(intermediate_img)); + copy_pixels(view(intermediate_img), subimage_view(view(resultant_kernel), + xy_combine_origin, xy_combine_origin, intermediate_img_size, intermediate_img_size)); + } + else if (order[1]) + { + unsigned int kernel_y_origin = size / 2 - y_size / 2; + copy_pixels(view(resultant_kernel_y), subimage_view(view(resultant_kernel), + kernel_y_origin, kernel_y_origin, y_size, y_size)); + } + + unsigned int smooth_count = (size - (x_size + y_size - 1)) / 2; + + if (size_desired != -1 && smooth_count) + { + unsigned int smoothing_kernel_size = 3 + 2 * (smooth_count - 1), prev_size = 3; + gray32f_image_t smoothing_kernel(3, 3); + gray32f_image_t resultant_smoothing_kernel(smoothing_kernel_size, smoothing_kernel_size); + double const smooth_repetition = static_cast(std::log2(smooth_count - 1)); + double const smooth_decrease = std::pow(2, smooth_repetition); + unsigned int convolve_count = static_cast(smooth_decrease); + + fill_kernel(view(smoothing_kernel), kernel_type::smoothing); + copy_pixels(view(smoothing_kernel), subimage_view(view(resultant_smoothing_kernel), + smoothing_kernel_size / 2 - 1, smoothing_kernel_size / 2 - 1, 3, 3)); + for (unsigned int i = 0; i < smooth_repetition; ++i) + { + unsigned int intermediate_img_size = prev_size + + static_cast(std::pow(2, i + 1)); + gray32f_image_t intermediate_img(intermediate_img_size, intermediate_img_size); + view_convolve(subimage_view(view(resultant_smoothing_kernel), + smoothing_kernel_size / 2 - intermediate_img_size / 2, + smoothing_kernel_size / 2 - intermediate_img_size / 2, + intermediate_img_size, intermediate_img_size), + subimage_view(view(resultant_smoothing_kernel), + smoothing_kernel_size / 2 - prev_size / 2, + smoothing_kernel_size / 2 - prev_size / 2, + prev_size, prev_size), view(intermediate_img)); + copy_pixels(view(intermediate_img), subimage_view(view(resultant_smoothing_kernel), + smoothing_kernel_size / 2 - intermediate_img_size / 2, + smoothing_kernel_size / 2 - intermediate_img_size / 2, + intermediate_img_size, intermediate_img_size)); + prev_size = intermediate_img_size; + } + for (unsigned int i = 0; i < smooth_count - smooth_decrease; ++i) + { + ++convolve_count; + unsigned int intermediate_img_size = 2 * convolve_count + 1; + gil::gray32f_image_t intermediate_img(intermediate_img_size, intermediate_img_size); + view_convolve(subimage_view(view(resultant_smoothing_kernel), + smoothing_kernel_size / 2 - convolve_count, + smoothing_kernel_size / 2 - convolve_count, intermediate_img_size, + intermediate_img_size), view(smoothing_kernel), view(intermediate_img)); + copy_pixels(view(intermediate_img), subimage_view(view(resultant_smoothing_kernel), + smoothing_kernel_size / 2 - convolve_count, + smoothing_kernel_size / 2 - convolve_count, + intermediate_img_size, intermediate_img_size)); + } + gray32f_image_t intermediate_img(size, size); + view_convolve(subimage_view(view(resultant_kernel), 0, 0, + size, size), view(resultant_smoothing_kernel), + view(intermediate_img)); + copy_pixels(view(intermediate_img), view(resultant_kernel)); + } + + if (order[1] & 1) + { + view_multiplies_scalar(view(resultant_kernel), -1, view(resultant_kernel)); + } + + gray32f_view_to_1d_kernel_vector(view(resultant_kernel), resultant_kernel_flatten, + flatten_orientation::top_to_bottom); +} }}} // namespace boost::gil::detail #endif diff --git a/include/boost/gil/extension/numeric/convolve.hpp b/include/boost/gil/extension/numeric/convolve.hpp index a401b0028e..0c87202fc1 100644 --- a/include/boost/gil/extension/numeric/convolve.hpp +++ b/include/boost/gil/extension/numeric/convolve.hpp @@ -373,7 +373,7 @@ void convolve_2d_impl(SrcView const& src_view, DstView const& dst_view, Kernel c col_boundary >= 0 && col_boundary < src_view.width()) { aux_total += - src_view(col_boundary, row_boundary) * + src_view(col_boundary, row_boundary)[0] * kernel.at(flip_ker_row, flip_ker_col); } } diff --git a/include/boost/gil/image_processing/numeric.hpp b/include/boost/gil/image_processing/numeric.hpp index b601b17dd0..ba55a99a3c 100644 --- a/include/boost/gil/image_processing/numeric.hpp +++ b/include/boost/gil/image_processing/numeric.hpp @@ -1,5 +1,6 @@ // // Copyright 2019 Olzhas Zhumabek +// Copyright 2021 Prathamesh Tagore // // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at @@ -16,6 +17,7 @@ // fixes ambigious call to std::abs, https://stackoverflow.com/a/30084734/4593721 #include #include +#include namespace boost { namespace gil { @@ -151,75 +153,89 @@ inline detail::kernel_2d generate_gaussian_kernel(std::size_t side return detail::kernel_2d(values.begin(), values.size(), middle, middle); } -/// \brief Generates Sobel operator in horizontal direction -/// \ingroup ImageProcessingMath -/// -/// Generates a kernel which will represent Sobel operator in -/// horizontal direction of specified degree (no need to convolve multiple times -/// to obtain the desired degree). +// Refer this link(https://stackoverflow.com/a/10032882/14958679) for obtaining an overview of the +// concept applied for generating higher order Sobel kernels. + +/// \brief Function used for generating Sobel kernels of desired size having user specified +/// horizontal and vertical order of derivative. /// https://www.researchgate.net/publication/239398674_An_Isotropic_3_3_Image_Gradient_Operator +/// \ingroup ImageProcessingMath template > -inline detail::kernel_2d generate_dx_sobel(unsigned int degree = 1) +inline detail::kernel_2d generate_sobel_kernel( + std::arrayorder, int size = -1) { - switch (degree) + if (order[0] == 0 && order[1] == 0 && size == -1) { - case 0: + return detail::get_identity_kernel(); + } + else if (order[1] == 0 && order[0] < 3 && size == -1) + { + if (order[0] == 1) { - return detail::get_identity_kernel(); + detail::kernel_2d result(3, 1, 1); + std::copy(detail::dx_sobel.begin(), detail::dx_sobel.end(), result.begin()); + return result; } - case 1: + else // order[0] == 2 + { + detail::kernel_2d result(5, 2, 2); + std::copy(detail::dx_sobel_2_5.begin(), detail::dx_sobel_2_5.end(), result.begin()); + return result; + } + } + else if (order[0] == 0 && order[1] < 3 && size == -1) + { + if (order[1] == 1) { detail::kernel_2d result(3, 1, 1); - std::copy(detail::dx_sobel.begin(), detail::dx_sobel.end(), result.begin()); + std::copy(detail::dy_sobel.begin(), detail::dy_sobel.end(), result.begin()); + return result; + } + else // order[1] == 2 + { + detail::kernel_2d result(5, 2, 2); + std::copy(detail::dy_sobel_2_5.begin(), detail::dy_sobel_2_5.end(), result.begin()); return result; } - default: - throw std::logic_error("not supported yet"); } - - //to not upset compiler - throw std::runtime_error("unreachable statement"); -} - -/// \brief Generate Scharr operator in horizontal direction -/// \ingroup ImageProcessingMath -/// -/// Generates a kernel which will represent Scharr operator in -/// horizontal direction of specified degree (no need to convolve multiple times -/// to obtain the desired degree). -/// https://www.researchgate.net/profile/Hanno_Scharr/publication/220955743_Optimal_Filters_for_Extended_Optical_Flow/links/004635151972eda98f000000/Optimal-Filters-for-Extended-Optical-Flow.pdf -template > -inline detail::kernel_2d generate_dx_scharr(unsigned int degree = 1) -{ - switch (degree) + else { - case 0: + if (size == -1) { - return detail::get_identity_kernel(); + unsigned int size_equivalent = order[0] + order[1]; + detail::kernel_2d result(2 * size_equivalent + 1, + size_equivalent, size_equivalent); + std::vector kernel_vector; + detail::get_sobel_kernel({order[0], order[1]}, kernel_vector); + std::copy(kernel_vector.begin(), kernel_vector.end(), result.begin()); + return result; } - case 1: + else { - detail::kernel_2d result(3, 1, 1); - std::copy(detail::dx_scharr.begin(), detail::dx_scharr.end(), result.begin()); + int minimum_size = 2 * (order[0] + order[1]) + 1; + if (size < minimum_size || (size & 1) == 0) + { + throw std::invalid_argument("Size must be odd and greater than or equal to " + "1 + 2 * (order_in_x_direction + order_in_y_direction)\n"); + } + detail::kernel_2d result(size, size / 2, size / 2); + std::vector kernel_vector; + detail::get_sobel_kernel({order[0], order[1]}, kernel_vector, size); + std::copy(kernel_vector.begin(), kernel_vector.end(), result.begin()); return result; } - default: - throw std::logic_error("not supported yet"); } - - //to not upset compiler - throw std::runtime_error("unreachable statement"); } -/// \brief Generates Sobel operator in vertical direction +/// \brief Generate Scharr operator in horizontal direction /// \ingroup ImageProcessingMath /// -/// Generates a kernel which will represent Sobel operator in -/// vertical direction of specified degree (no need to convolve multiple times +/// Generates a kernel which will represent Scharr operator in +/// horizontal direction of specified degree (no need to convolve multiple times /// to obtain the desired degree). -/// https://www.researchgate.net/publication/239398674_An_Isotropic_3_3_Image_Gradient_Operator +/// https://www.researchgate.net/profile/Hanno_Scharr/publication/220955743_Optimal_Filters_for_Extended_Optical_Flow/links/004635151972eda98f000000/Optimal-Filters-for-Extended-Optical-Flow.pdf template > -inline detail::kernel_2d generate_dy_sobel(unsigned int degree = 1) +inline detail::kernel_2d generate_dx_scharr(unsigned int degree = 1) { switch (degree) { @@ -230,7 +246,7 @@ inline detail::kernel_2d generate_dy_sobel(unsigned int degree = 1 case 1: { detail::kernel_2d result(3, 1, 1); - std::copy(detail::dy_sobel.begin(), detail::dy_sobel.end(), result.begin()); + std::copy(detail::dx_scharr.begin(), detail::dx_scharr.end(), result.begin()); return result; } default: @@ -288,8 +304,8 @@ inline void compute_hessian_entries( OutputView dxdy, OutputView ddyy) { - auto sobel_x = generate_dx_sobel(); - auto sobel_y = generate_dy_sobel(); + auto sobel_x = generate_sobel_kernel({1, 0}); + auto sobel_y = generate_sobel_kernel({0, 1}); detail::convolve_2d(dx, sobel_x, ddxx); detail::convolve_2d(dx, sobel_y, dxdy); detail::convolve_2d(dy, sobel_y, ddyy); diff --git a/test/core/image_processing/sobel_scharr.cpp b/test/core/image_processing/sobel_scharr.cpp index 6ebc90cad6..f21279f27a 100644 --- a/test/core/image_processing/sobel_scharr.cpp +++ b/test/core/image_processing/sobel_scharr.cpp @@ -1,5 +1,6 @@ // // Copyright 2019 Olzhas Zhumabek +// Copyright 2021 Prathamesh Tagore // // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at @@ -16,28 +17,773 @@ namespace gil = boost::gil; +// Convention used for naming vectors containing kernels : +// 1. d$_sobel_#_% : +// Kernel vector in direction specified by '$' containing '#'th order Sobel derivative having +// its dimensions as '%' x '%'. +// 2. dx_dy_sobel_#1_#2_% : +// Kernel vector obtained from '#1'th order and '#2'th order Sobel derivatives in x and y +// directions respectively having its dimensions as '%' x '%'. +std::vector dx_sobel_6_15 { + 1.0000e+00, 2.0000e+00, -5.0000e+00, -1.2000e+01, 9.0000e+00, 3.0000e+01, + -5.0000e+00, -4.0000e+01, -5.0000e+00, 3.0000e+01, 9.0000e+00, -1.2000e+01, + -5.0000e+00, 2.0000e+00, 1.0000e+00, + 1.4000e+01, 2.8000e+01, -7.0000e+01, -1.6800e+02, 1.2600e+02, 4.2000e+02, + -7.0000e+01, -5.6000e+02, -7.0000e+01, 4.2000e+02, 1.2600e+02, -1.6800e+02, + -7.0000e+01, 2.8000e+01, 1.4000e+01, + 9.1000e+01, 1.8200e+02, -4.5500e+02, -1.0920e+03, 8.1900e+02, 2.7300e+03, + -4.5500e+02, -3.6400e+03, -4.5500e+02, 2.7300e+03, 8.1900e+02, -1.0920e+03, + -4.5500e+02, 1.8200e+02, 9.1000e+01, + 3.6400e+02, 7.2800e+02, -1.8200e+03, -4.3680e+03, 3.2760e+03, 1.0920e+04, + -1.8200e+03, -1.4560e+04, -1.8200e+03, 1.0920e+04, 3.2760e+03, -4.3680e+03, + -1.8200e+03, 7.2800e+02, 3.6400e+02, + 1.0010e+03, 2.0020e+03, -5.0050e+03, -1.2012e+04, 9.0090e+03, 3.0030e+04, + -5.0050e+03, -4.0040e+04, -5.0050e+03, 3.0030e+04, 9.0090e+03, -1.2012e+04, + -5.0050e+03, 2.0020e+03, 1.0010e+03, + 2.0020e+03, 4.0040e+03, -1.0010e+04, -2.4024e+04, 1.8018e+04, 6.0060e+04, + -1.0010e+04, -8.0080e+04, -1.0010e+04, 6.0060e+04, 1.8018e+04, -2.4024e+04, + -1.0010e+04, 4.0040e+03, 2.0020e+03, + 3.0030e+03, 6.0060e+03, -1.5015e+04, -3.6036e+04, 2.7027e+04, 9.0090e+04, + -1.5015e+04, -1.2012e+05, -1.5015e+04, 9.0090e+04, 2.7027e+04, -3.6036e+04, + -1.5015e+04, 6.0060e+03, 3.0030e+03, + 3.4320e+03, 6.8640e+03, -1.7160e+04, -4.1184e+04, 3.0888e+04, 1.0296e+05, + -1.7160e+04, -1.3728e+05, -1.7160e+04, 1.0296e+05, 3.0888e+04, -4.1184e+04, + -1.7160e+04, 6.8640e+03, 3.4320e+03, + 3.0030e+03, 6.0060e+03, -1.5015e+04, -3.6036e+04, 2.7027e+04, 9.0090e+04, + -1.5015e+04, -1.2012e+05, -1.5015e+04, 9.0090e+04, 2.7027e+04, -3.6036e+04, + -1.5015e+04, 6.0060e+03, 3.0030e+03, + 2.0020e+03, 4.0040e+03, -1.0010e+04, -2.4024e+04, 1.8018e+04, 6.0060e+04, + -1.0010e+04, -8.0080e+04, -1.0010e+04, 6.0060e+04, 1.8018e+04, -2.4024e+04, + -1.0010e+04, 4.0040e+03, 2.0020e+03, + 1.0010e+03, 2.0020e+03, -5.0050e+03, -1.2012e+04, 9.0090e+03, 3.0030e+04, + -5.0050e+03, -4.0040e+04, -5.0050e+03, 3.0030e+04, 9.0090e+03, -1.2012e+04, + -5.0050e+03, 2.0020e+03, 1.0010e+03, + 3.6400e+02, 7.2800e+02, -1.8200e+03, -4.3680e+03, 3.2760e+03, 1.0920e+04, + -1.8200e+03, -1.4560e+04, -1.8200e+03, 1.0920e+04, 3.2760e+03, -4.3680e+03, + -1.8200e+03, 7.2800e+02, 3.6400e+02, + 9.1000e+01, 1.8200e+02, -4.5500e+02, -1.0920e+03, 8.1900e+02, 2.7300e+03, + -4.5500e+02, -3.6400e+03, -4.5500e+02, 2.7300e+03, 8.1900e+02, -1.0920e+03, + -4.5500e+02, 1.8200e+02, 9.1000e+01, + 1.4000e+01, 2.8000e+01, -7.0000e+01, -1.6800e+02, 1.2600e+02, 4.2000e+02, + -7.0000e+01, -5.6000e+02, -7.0000e+01, 4.2000e+02, 1.2600e+02, -1.6800e+02, + -7.0000e+01, 2.8000e+01, 1.4000e+01, + 1.0000e+00, 2.0000e+00, -5.0000e+00, -1.2000e+01, 9.0000e+00, 3.0000e+01, + -5.0000e+00, -4.0000e+01, -5.0000e+00, 3.0000e+01, 9.0000e+00, -1.2000e+01, + -5.0000e+00, 2.0000e+00, 1.0000e+00 +}; + +std::vector dx_sobel_7_15 { + -1.00000e+00, 0.00000e+00, 7.00000e+00, 0.00000e+00, -2.10000e+01, + 0.00000e+00, 3.50000e+01, 0.00000e+00, -3.50000e+01, 0.00000e+00, + 2.10000e+01, 0.00000e+00, -7.00000e+00, 0.00000e+00, 1.00000e+00, + -1.40000e+01, 0.00000e+00, 9.80000e+01, 0.00000e+00, -2.94000e+02, + 0.00000e+00, 4.90000e+02, 0.00000e+00, -4.90000e+02, 0.00000e+00, + 2.94000e+02, 0.00000e+00, -9.80000e+01, 0.00000e+00, 1.40000e+01, + -9.10000e+01, 0.00000e+00, 6.37000e+02, 0.00000e+00, -1.91100e+03, + 0.00000e+00, 3.18500e+03, 0.00000e+00, -3.18500e+03, 0.00000e+00, + 1.91100e+03, 0.00000e+00, -6.37000e+02, 0.00000e+00, 9.10000e+01, + -3.64000e+02, 0.00000e+00, 2.54800e+03, 0.00000e+00, -7.64400e+03, + 0.00000e+00, 1.27400e+04, 0.00000e+00, -1.27400e+04, 0.00000e+00, + 7.64400e+03, 0.00000e+00, -2.54800e+03, 0.00000e+00, 3.64000e+02, + -1.00100e+03, 0.00000e+00, 7.00700e+03, 0.00000e+00, -2.10210e+04, + 0.00000e+00, 3.50350e+04, 0.00000e+00, -3.50350e+04, 0.00000e+00, + 2.10210e+04, 0.00000e+00, -7.00700e+03, 0.00000e+00, 1.00100e+03, + -2.00200e+03, 0.00000e+00, 1.40140e+04, 0.00000e+00, -4.20420e+04, + 0.00000e+00, 7.00700e+04, 0.00000e+00, -7.00700e+04, 0.00000e+00, + 4.20420e+04, 0.00000e+00, -1.40140e+04, 0.00000e+00, 2.00200e+03, + -3.00300e+03, 0.00000e+00, 2.10210e+04, 0.00000e+00, -6.30630e+04, + 0.00000e+00, 1.05105e+05, 0.00000e+00, -1.05105e+05, 0.00000e+00, + 6.30630e+04, 0.00000e+00, -2.10210e+04, 0.00000e+00, 3.00300e+03, + -3.43200e+03, 0.00000e+00, 2.40240e+04, 0.00000e+00, -7.20720e+04, + 0.00000e+00, 1.20120e+05, 0.00000e+00, -1.20120e+05, 0.00000e+00, + 7.20720e+04, 0.00000e+00, -2.40240e+04, 0.00000e+00, 3.43200e+03, + -3.00300e+03, 0.00000e+00, 2.10210e+04, 0.00000e+00, -6.30630e+04, + 0.00000e+00, 1.05105e+05, 0.00000e+00, -1.05105e+05, 0.00000e+00, + 6.30630e+04, 0.00000e+00, -2.10210e+04, 0.00000e+00, 3.00300e+03, + -2.00200e+03, 0.00000e+00, 1.40140e+04, 0.00000e+00, -4.20420e+04, + 0.00000e+00, 7.00700e+04, 0.00000e+00, -7.00700e+04, 0.00000e+00, + 4.20420e+04, 0.00000e+00, -1.40140e+04, 0.00000e+00, 2.00200e+03, + -1.00100e+03, 0.00000e+00, 7.00700e+03, 0.00000e+00, -2.10210e+04, + 0.00000e+00, 3.50350e+04, 0.00000e+00, -3.50350e+04, 0.00000e+00, + 2.10210e+04, 0.00000e+00, -7.00700e+03, 0.00000e+00, 1.00100e+03, + -3.64000e+02, 0.00000e+00, 2.54800e+03, 0.00000e+00, -7.64400e+03, + 0.00000e+00, 1.27400e+04, 0.00000e+00, -1.27400e+04, 0.00000e+00, + 7.64400e+03, 0.00000e+00, -2.54800e+03, 0.00000e+00, 3.64000e+02, + -9.10000e+01, 0.00000e+00, 6.37000e+02, 0.00000e+00, -1.91100e+03, + 0.00000e+00, 3.18500e+03, 0.00000e+00, -3.18500e+03, 0.00000e+00, + 1.91100e+03, 0.00000e+00, -6.37000e+02, 0.00000e+00, 9.10000e+01, + -1.40000e+01, 0.00000e+00, 9.80000e+01, 0.00000e+00, -2.94000e+02, + 0.00000e+00, 4.90000e+02, 0.00000e+00, -4.90000e+02, 0.00000e+00, + 2.94000e+02, 0.00000e+00, -9.80000e+01, 0.00000e+00, 1.40000e+01, + -1.00000e+00, 0.00000e+00, 7.00000e+00, 0.00000e+00, -2.10000e+01, + 0.00000e+00, 3.50000e+01, 0.00000e+00, -3.50000e+01, 0.00000e+00, + 2.10000e+01, 0.00000e+00, -7.00000e+00, 0.00000e+00, 1.00000e+00 +}; + +std::vector dx_sobel_9_19 { + -1.000000e+00, 0.000000e+00, 9.000000e+00, 0.000000e+00, -3.600000e+01, + 0.000000e+00, 8.400000e+01, 0.000000e+00, -1.260000e+02, 0.000000e+00, + 1.260000e+02, 0.000000e+00, -8.400000e+01, 0.000000e+00, 3.600000e+01, + 0.000000e+00, -9.000000e+00, 0.000000e+00, 1.000000e+00, + -1.800000e+01, 0.000000e+00, 1.620000e+02, 0.000000e+00, -6.480000e+02, + 0.000000e+00, 1.512000e+03, 0.000000e+00, -2.268000e+03, 0.000000e+00, + 2.268000e+03, 0.000000e+00, -1.512000e+03, 0.000000e+00, 6.480000e+02, + 0.000000e+00, -1.620000e+02, 0.000000e+00, 1.800000e+01, + -1.530000e+02, 0.000000e+00, 1.377000e+03, 0.000000e+00, -5.508000e+03, + 0.000000e+00, 1.285200e+04, 0.000000e+00, -1.927800e+04, 0.000000e+00, + 1.927800e+04, 0.000000e+00, -1.285200e+04, 0.000000e+00, 5.508000e+03, + 0.000000e+00, -1.377000e+03, 0.000000e+00, 1.530000e+02, + -8.160000e+02, 0.000000e+00, 7.344000e+03, 0.000000e+00, -2.937600e+04, + 0.000000e+00, 6.854400e+04, 0.000000e+00, -1.028160e+05, 0.000000e+00, + 1.028160e+05, 0.000000e+00, -6.854400e+04, 0.000000e+00, 2.937600e+04, + 0.000000e+00, -7.344000e+03, 0.000000e+00, 8.160000e+02, + -3.060000e+03, 0.000000e+00, 2.754000e+04, 0.000000e+00, -1.101600e+05, + 0.000000e+00, 2.570400e+05, 0.000000e+00, -3.855600e+05, 0.000000e+00, + 3.855600e+05, 0.000000e+00, -2.570400e+05, 0.000000e+00, 1.101600e+05, + 0.000000e+00, -2.754000e+04, 0.000000e+00, 3.060000e+03, + -8.568000e+03, 0.000000e+00, 7.711200e+04, 0.000000e+00, -3.084480e+05, + 0.000000e+00, 7.197120e+05, 0.000000e+00, -1.079568e+06, 0.000000e+00, + 1.079568e+06, 0.000000e+00, -7.197120e+05, 0.000000e+00, 3.084480e+05, + 0.000000e+00, -7.711200e+04, 0.000000e+00, 8.568000e+03, + -1.856400e+04, 0.000000e+00, 1.670760e+05, 0.000000e+00, -6.683040e+05, + 0.000000e+00, 1.559376e+06, 0.000000e+00, -2.339064e+06, 0.000000e+00, + 2.339064e+06, 0.000000e+00, -1.559376e+06, 0.000000e+00, 6.683040e+05, + 0.000000e+00, -1.670760e+05, 0.000000e+00, 1.856400e+04, + -3.182400e+04, 0.000000e+00, 2.864160e+05, 0.000000e+00, -1.145664e+06, + 0.000000e+00, 2.673216e+06, 0.000000e+00, -4.009824e+06, 0.000000e+00, + 4.009824e+06, 0.000000e+00, -2.673216e+06, 0.000000e+00, 1.145664e+06, + 0.000000e+00, -2.864160e+05, 0.000000e+00, 3.182400e+04, + -4.375800e+04, 0.000000e+00, 3.938220e+05, 0.000000e+00, -1.575288e+06, + 0.000000e+00, 3.675672e+06, 0.000000e+00, -5.513508e+06, 0.000000e+00, + 5.513508e+06, 0.000000e+00, -3.675672e+06, 0.000000e+00, 1.575288e+06, + 0.000000e+00, -3.938220e+05, 0.000000e+00, 4.375800e+04, + -4.862000e+04, 0.000000e+00, 4.375800e+05, 0.000000e+00, -1.750320e+06, + 0.000000e+00, 4.084080e+06, 0.000000e+00, -6.126120e+06, 0.000000e+00, + 6.126120e+06, 0.000000e+00, -4.084080e+06, 0.000000e+00, 1.750320e+06, + 0.000000e+00, -4.375800e+05, 0.000000e+00, 4.862000e+04, + -4.375800e+04, 0.000000e+00, 3.938220e+05, 0.000000e+00, -1.575288e+06, + 0.000000e+00, 3.675672e+06, 0.000000e+00, -5.513508e+06, 0.000000e+00, + 5.513508e+06, 0.000000e+00, -3.675672e+06, 0.000000e+00, 1.575288e+06, + 0.000000e+00, -3.938220e+05, 0.000000e+00, 4.375800e+04, + -3.182400e+04, 0.000000e+00, 2.864160e+05, 0.000000e+00, -1.145664e+06, + 0.000000e+00, 2.673216e+06, 0.000000e+00, -4.009824e+06, 0.000000e+00, + 4.009824e+06, 0.000000e+00, -2.673216e+06, 0.000000e+00, 1.145664e+06, + 0.000000e+00, -2.864160e+05, 0.000000e+00, 3.182400e+04, + -1.856400e+04, 0.000000e+00, 1.670760e+05, 0.000000e+00, -6.683040e+05, + 0.000000e+00, 1.559376e+06, 0.000000e+00, -2.339064e+06, 0.000000e+00, + 2.339064e+06, 0.000000e+00, -1.559376e+06, 0.000000e+00, 6.683040e+05, + 0.000000e+00, -1.670760e+05, 0.000000e+00, 1.856400e+04, + -8.568000e+03, 0.000000e+00, 7.711200e+04, 0.000000e+00, -3.084480e+05, + 0.000000e+00, 7.197120e+05, 0.000000e+00, -1.079568e+06, 0.000000e+00, + 1.079568e+06, 0.000000e+00, -7.197120e+05, 0.000000e+00, 3.084480e+05, + 0.000000e+00, -7.711200e+04, 0.000000e+00, 8.568000e+03, + -3.060000e+03, 0.000000e+00, 2.754000e+04, 0.000000e+00, -1.101600e+05, + 0.000000e+00, 2.570400e+05, 0.000000e+00, -3.855600e+05, 0.000000e+00, + 3.855600e+05, 0.000000e+00, -2.570400e+05, 0.000000e+00, 1.101600e+05, + 0.000000e+00, -2.754000e+04, 0.000000e+00, 3.060000e+03, + -8.160000e+02, 0.000000e+00, 7.344000e+03, 0.000000e+00, -2.937600e+04, + 0.000000e+00, 6.854400e+04, 0.000000e+00, -1.028160e+05, 0.000000e+00, + 1.028160e+05, 0.000000e+00, -6.854400e+04, 0.000000e+00, 2.937600e+04, + 0.000000e+00, -7.344000e+03, 0.000000e+00, 8.160000e+02, + -1.530000e+02, 0.000000e+00, 1.377000e+03, 0.000000e+00, -5.508000e+03, + 0.000000e+00, 1.285200e+04, 0.000000e+00, -1.927800e+04, 0.000000e+00, + 1.927800e+04, 0.000000e+00, -1.285200e+04, 0.000000e+00, 5.508000e+03, + 0.000000e+00, -1.377000e+03, 0.000000e+00, 1.530000e+02, + -1.800000e+01, 0.000000e+00, 1.620000e+02, 0.000000e+00, -6.480000e+02, + 0.000000e+00, 1.512000e+03, 0.000000e+00, -2.268000e+03, 0.000000e+00, + 2.268000e+03, 0.000000e+00, -1.512000e+03, 0.000000e+00, 6.480000e+02, + 0.000000e+00, -1.620000e+02, 0.000000e+00, 1.800000e+01, + -1.000000e+00, 0.000000e+00, 9.000000e+00, 0.000000e+00, -3.600000e+01, + 0.000000e+00, 8.400000e+01, 0.000000e+00, -1.260000e+02, 0.000000e+00, + 1.260000e+02, 0.000000e+00, -8.400000e+01, 0.000000e+00, 3.600000e+01, + 0.000000e+00, -9.000000e+00, 0.000000e+00, 1.000000e+00 +}; + +std::vector dy_sobel_2_15 { + 1.00000e+00, 1.40000e+01, 9.10000e+01, 3.64000e+02, 1.00100e+03, + 2.00200e+03, 3.00300e+03, 3.43200e+03, 3.00300e+03, 2.00200e+03, + 1.00100e+03, 3.64000e+02, 9.10000e+01, 1.40000e+01, 1.00000e+00, + 1.00000e+01, 1.40000e+02, 9.10000e+02, 3.64000e+03, 1.00100e+04, + 2.00200e+04, 3.00300e+04, 3.43200e+04, 3.00300e+04, 2.00200e+04, + 1.00100e+04, 3.64000e+03, 9.10000e+02, 1.40000e+02, 1.00000e+01, + 4.30000e+01, 6.02000e+02, 3.91300e+03, 1.56520e+04, 4.30430e+04, + 8.60860e+04, 1.29129e+05, 1.47576e+05, 1.29129e+05, 8.60860e+04, + 4.30430e+04, 1.56520e+04, 3.91300e+03, 6.02000e+02, 4.30000e+01, + 1.00000e+02, 1.40000e+03, 9.10000e+03, 3.64000e+04, 1.00100e+05, + 2.00200e+05, 3.00300e+05, 3.43200e+05, 3.00300e+05, 2.00200e+05, + 1.00100e+05, 3.64000e+04, 9.10000e+03, 1.40000e+03, 1.00000e+02, + 1.21000e+02, 1.69400e+03, 1.10110e+04, 4.40440e+04, 1.21121e+05, + 2.42242e+05, 3.63363e+05, 4.15272e+05, 3.63363e+05, 2.42242e+05, + 1.21121e+05, 4.40440e+04, 1.10110e+04, 1.69400e+03, 1.21000e+02, + 2.20000e+01, 3.08000e+02, 2.00200e+03, 8.00800e+03, 2.20220e+04, + 4.40440e+04, 6.60660e+04, 7.55040e+04, 6.60660e+04, 4.40440e+04, + 2.20220e+04, 8.00800e+03, 2.00200e+03, 3.08000e+02, 2.20000e+01, + -1.65000e+02, -2.31000e+03, -1.50150e+04, -6.00600e+04, -1.65165e+05, + -3.30330e+05, -4.95495e+05, -5.66280e+05, -4.95495e+05, -3.30330e+05, + -1.65165e+05, -6.00600e+04, -1.50150e+04, -2.31000e+03, -1.65000e+02, + -2.64000e+02, -3.69600e+03, -2.40240e+04, -9.60960e+04, -2.64264e+05, + -5.28528e+05, -7.92792e+05, -9.06048e+05, -7.92792e+05, -5.28528e+05, + -2.64264e+05, -9.60960e+04, -2.40240e+04, -3.69600e+03, -2.64000e+02, + -1.65000e+02, -2.31000e+03, -1.50150e+04, -6.00600e+04, -1.65165e+05, + -3.30330e+05, -4.95495e+05, -5.66280e+05, -4.95495e+05, -3.30330e+05, + -1.65165e+05, -6.00600e+04, -1.50150e+04, -2.31000e+03, -1.65000e+02, + 2.20000e+01, 3.08000e+02, 2.00200e+03, 8.00800e+03, 2.20220e+04, + 4.40440e+04, 6.60660e+04, 7.55040e+04, 6.60660e+04, 4.40440e+04, + 2.20220e+04, 8.00800e+03, 2.00200e+03, 3.08000e+02, 2.20000e+01, + 1.21000e+02, 1.69400e+03, 1.10110e+04, 4.40440e+04, 1.21121e+05, + 2.42242e+05, 3.63363e+05, 4.15272e+05, 3.63363e+05, 2.42242e+05, + 1.21121e+05, 4.40440e+04, 1.10110e+04, 1.69400e+03, 1.21000e+02, + 1.00000e+02, 1.40000e+03, 9.10000e+03, 3.64000e+04, 1.00100e+05, + 2.00200e+05, 3.00300e+05, 3.43200e+05, 3.00300e+05, 2.00200e+05, + 1.00100e+05, 3.64000e+04, 9.10000e+03, 1.40000e+03, 1.00000e+02, + 4.30000e+01, 6.02000e+02, 3.91300e+03, 1.56520e+04, 4.30430e+04, + 8.60860e+04, 1.29129e+05, 1.47576e+05, 1.29129e+05, 8.60860e+04, + 4.30430e+04, 1.56520e+04, 3.91300e+03, 6.02000e+02, 4.30000e+01, + 1.00000e+01, 1.40000e+02, 9.10000e+02, 3.64000e+03, 1.00100e+04, + 2.00200e+04, 3.00300e+04, 3.43200e+04, 3.00300e+04, 2.00200e+04, + 1.00100e+04, 3.64000e+03, 9.10000e+02, 1.40000e+02, 1.00000e+01, + 1.00000e+00, 1.40000e+01, 9.10000e+01, 3.64000e+02, 1.00100e+03, + 2.00200e+03, 3.00300e+03, 3.43200e+03, 3.00300e+03, 2.00200e+03, + 1.00100e+03, 3.64000e+02, 9.10000e+01, 1.40000e+01, 1.00000e+00, +}; + +std::vector dy_sobel_3_15 { + -1.00000e+00, -1.40000e+01, -9.10000e+01, -3.64000e+02, -1.00100e+03, + -2.00200e+03, -3.00300e+03, -3.43200e+03, -3.00300e+03, -2.00200e+03, + -1.00100e+03, -3.64000e+02, -9.10000e+01, -1.40000e+01, -1.00000e+00, + -8.00000e+00, -1.12000e+02, -7.28000e+02, -2.91200e+03, -8.00800e+03, + -1.60160e+04, -2.40240e+04, -2.74560e+04, -2.40240e+04, -1.60160e+04, + -8.00800e+03, -2.91200e+03, -7.28000e+02, -1.12000e+02, -8.00000e+00, + -2.50000e+01, -3.50000e+02, -2.27500e+03, -9.10000e+03, -2.50250e+04, + -5.00500e+04, -7.50750e+04, -8.58000e+04, -7.50750e+04, -5.00500e+04, + -2.50250e+04, -9.10000e+03, -2.27500e+03, -3.50000e+02, -2.50000e+01, + -3.20000e+01, -4.48000e+02, -2.91200e+03, -1.16480e+04, -3.20320e+04, + -6.40640e+04, -9.60960e+04, -1.09824e+05, -9.60960e+04, -6.40640e+04, + -3.20320e+04, -1.16480e+04, -2.91200e+03, -4.48000e+02, -3.20000e+01, + 1.10000e+01, 1.54000e+02, 1.00100e+03, 4.00400e+03, 1.10110e+04, + 2.20220e+04, 3.30330e+04, 3.77520e+04, 3.30330e+04, 2.20220e+04, + 1.10110e+04, 4.00400e+03, 1.00100e+03, 1.54000e+02, 1.10000e+01, + 8.80000e+01, 1.23200e+03, 8.00800e+03, 3.20320e+04, 8.80880e+04, + 1.76176e+05, 2.64264e+05, 3.02016e+05, 2.64264e+05, 1.76176e+05, + 8.80880e+04, 3.20320e+04, 8.00800e+03, 1.23200e+03, 8.80000e+01, + 9.90000e+01, 1.38600e+03, 9.00900e+03, 3.60360e+04, 9.90990e+04, + 1.98198e+05, 2.97297e+05, 3.39768e+05, 2.97297e+05, 1.98198e+05, + 9.90990e+04, 3.60360e+04, 9.00900e+03, 1.38600e+03, 9.90000e+01, + 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, + 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, + 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, + -9.90000e+01, -1.38600e+03, -9.00900e+03, -3.60360e+04, -9.90990e+04, + -1.98198e+05, -2.97297e+05, -3.39768e+05, -2.97297e+05, -1.98198e+05, + -9.90990e+04, -3.60360e+04, -9.00900e+03, -1.38600e+03, -9.90000e+01, + -8.80000e+01, -1.23200e+03, -8.00800e+03, -3.20320e+04, -8.80880e+04, + -1.76176e+05, -2.64264e+05, -3.02016e+05, -2.64264e+05, -1.76176e+05, + -8.80880e+04, -3.20320e+04, -8.00800e+03, -1.23200e+03, -8.80000e+01, + -1.10000e+01, -1.54000e+02, -1.00100e+03, -4.00400e+03, -1.10110e+04, + -2.20220e+04, -3.30330e+04, -3.77520e+04, -3.30330e+04, -2.20220e+04, + -1.10110e+04, -4.00400e+03, -1.00100e+03, -1.54000e+02, -1.10000e+01, + 3.20000e+01, 4.48000e+02, 2.91200e+03, 1.16480e+04, 3.20320e+04, + 6.40640e+04, 9.60960e+04, 1.09824e+05, 9.60960e+04, 6.40640e+04, + 3.20320e+04, 1.16480e+04, 2.91200e+03, 4.48000e+02, 3.20000e+01, + 2.50000e+01, 3.50000e+02, 2.27500e+03, 9.10000e+03, 2.50250e+04, + 5.00500e+04, 7.50750e+04, 8.58000e+04, 7.50750e+04, 5.00500e+04, + 2.50250e+04, 9.10000e+03, 2.27500e+03, 3.50000e+02, 2.50000e+01, + 8.00000e+00, 1.12000e+02, 7.28000e+02, 2.91200e+03, 8.00800e+03, + 1.60160e+04, 2.40240e+04, 2.74560e+04, 2.40240e+04, 1.60160e+04, + 8.00800e+03, 2.91200e+03, 7.28000e+02, 1.12000e+02, 8.00000e+00, + 1.00000e+00, 1.40000e+01, 9.10000e+01, 3.64000e+02, 1.00100e+03, + 2.00200e+03, 3.00300e+03, 3.43200e+03, 3.00300e+03, 2.00200e+03, + 1.00100e+03, 3.64000e+02, 9.10000e+01, 1.40000e+01, 1.00000e+00 +}; + +std::vector dy_sobel_4_15 { + 1.00000e+00, 1.40000e+01, 9.10000e+01, 3.64000e+02, 1.00100e+03, + 2.00200e+03, 3.00300e+03, 3.43200e+03, 3.00300e+03, 2.00200e+03, + 1.00100e+03, 3.64000e+02, 9.10000e+01, 1.40000e+01, 1.00000e+00, + 6.00000e+00, 8.40000e+01, 5.46000e+02, 2.18400e+03, 6.00600e+03, + 1.20120e+04, 1.80180e+04, 2.05920e+04, 1.80180e+04, 1.20120e+04, + 6.00600e+03, 2.18400e+03, 5.46000e+02, 8.40000e+01, 6.00000e+00, + 1.10000e+01, 1.54000e+02, 1.00100e+03, 4.00400e+03, 1.10110e+04, + 2.20220e+04, 3.30330e+04, 3.77520e+04, 3.30330e+04, 2.20220e+04, + 1.10110e+04, 4.00400e+03, 1.00100e+03, 1.54000e+02, 1.10000e+01, + -4.00000e+00, -5.60000e+01, -3.64000e+02, -1.45600e+03, -4.00400e+03, + -8.00800e+03, -1.20120e+04, -1.37280e+04, -1.20120e+04, -8.00800e+03, + -4.00400e+03, -1.45600e+03, -3.64000e+02, -5.60000e+01, -4.00000e+00, + -3.90000e+01, -5.46000e+02, -3.54900e+03, -1.41960e+04, -3.90390e+04, + -7.80780e+04, -1.17117e+05, -1.33848e+05, -1.17117e+05, -7.80780e+04, + -3.90390e+04, -1.41960e+04, -3.54900e+03, -5.46000e+02, -3.90000e+01, + -3.80000e+01, -5.32000e+02, -3.45800e+03, -1.38320e+04, -3.80380e+04, + -7.60760e+04, -1.14114e+05, -1.30416e+05, -1.14114e+05, -7.60760e+04, + -3.80380e+04, -1.38320e+04, -3.45800e+03, -5.32000e+02, -3.80000e+01, + 2.70000e+01, 3.78000e+02, 2.45700e+03, 9.82800e+03, 2.70270e+04, + 5.40540e+04, 8.10810e+04, 9.26640e+04, 8.10810e+04, 5.40540e+04, + 2.70270e+04, 9.82800e+03, 2.45700e+03, 3.78000e+02, 2.70000e+01, + 7.20000e+01, 1.00800e+03, 6.55200e+03, 2.62080e+04, 7.20720e+04, + 1.44144e+05, 2.16216e+05, 2.47104e+05, 2.16216e+05, 1.44144e+05, + 7.20720e+04, 2.62080e+04, 6.55200e+03, 1.00800e+03, 7.20000e+01, + 2.70000e+01, 3.78000e+02, 2.45700e+03, 9.82800e+03, 2.70270e+04, + 5.40540e+04, 8.10810e+04, 9.26640e+04, 8.10810e+04, 5.40540e+04, + 2.70270e+04, 9.82800e+03, 2.45700e+03, 3.78000e+02, 2.70000e+01, + -3.80000e+01, -5.32000e+02, -3.45800e+03, -1.38320e+04, -3.80380e+04, + -7.60760e+04, -1.14114e+05, -1.30416e+05, -1.14114e+05, -7.60760e+04, + -3.80380e+04, -1.38320e+04, -3.45800e+03, -5.32000e+02, -3.80000e+01, + -3.90000e+01, -5.46000e+02, -3.54900e+03, -1.41960e+04, -3.90390e+04, + -7.80780e+04, -1.17117e+05, -1.33848e+05, -1.17117e+05, -7.80780e+04, + -3.90390e+04, -1.41960e+04, -3.54900e+03, -5.46000e+02, -3.90000e+01, + -4.00000e+00, -5.60000e+01, -3.64000e+02, -1.45600e+03, -4.00400e+03, + -8.00800e+03, -1.20120e+04, -1.37280e+04, -1.20120e+04, -8.00800e+03, + -4.00400e+03, -1.45600e+03, -3.64000e+02, -5.60000e+01, -4.00000e+00, + 1.10000e+01, 1.54000e+02, 1.00100e+03, 4.00400e+03, 1.10110e+04, + 2.20220e+04, 3.30330e+04, 3.77520e+04, 3.30330e+04, 2.20220e+04, + 1.10110e+04, 4.00400e+03, 1.00100e+03, 1.54000e+02, 1.10000e+01, + 6.00000e+00, 8.40000e+01, 5.46000e+02, 2.18400e+03, 6.00600e+03, + 1.20120e+04, 1.80180e+04, 2.05920e+04, 1.80180e+04, 1.20120e+04, + 6.00600e+03, 2.18400e+03, 5.46000e+02, 8.40000e+01, 6.00000e+00, + 1.00000e+00, 1.40000e+01, 9.10000e+01, 3.64000e+02, 1.00100e+03, + 2.00200e+03, 3.00300e+03, 3.43200e+03, 3.00300e+03, 2.00200e+03, + 1.00100e+03, 3.64000e+02, 9.10000e+01, 1.40000e+01, 1.00000e+00 +}; + +std::vector dy_sobel_5_15 { + -1.00000e+00, -1.40000e+01, -9.10000e+01, -3.64000e+02, -1.00100e+03, + -2.00200e+03, -3.00300e+03, -3.43200e+03, -3.00300e+03, -2.00200e+03, + -1.00100e+03, -3.64000e+02, -9.10000e+01, -1.40000e+01, -1.00000e+00, + -4.00000e+00, -5.60000e+01, -3.64000e+02, -1.45600e+03, -4.00400e+03, + -8.00800e+03, -1.20120e+04, -1.37280e+04, -1.20120e+04, -8.00800e+03, + -4.00400e+03, -1.45600e+03, -3.64000e+02, -5.60000e+01, -4.00000e+00, + -1.00000e+00, -1.40000e+01, -9.10000e+01, -3.64000e+02, -1.00100e+03, + -2.00200e+03, -3.00300e+03, -3.43200e+03, -3.00300e+03, -2.00200e+03, + -1.00100e+03, -3.64000e+02, -9.10000e+01, -1.40000e+01, -1.00000e+00, + 1.60000e+01, 2.24000e+02, 1.45600e+03, 5.82400e+03, 1.60160e+04, + 3.20320e+04, 4.80480e+04, 5.49120e+04, 4.80480e+04, 3.20320e+04, + 1.60160e+04, 5.82400e+03, 1.45600e+03, 2.24000e+02, 1.60000e+01, + 1.90000e+01, 2.66000e+02, 1.72900e+03, 6.91600e+03, 1.90190e+04, + 3.80380e+04, 5.70570e+04, 6.52080e+04, 5.70570e+04, 3.80380e+04, + 1.90190e+04, 6.91600e+03, 1.72900e+03, 2.66000e+02, 1.90000e+01, + -2.00000e+01, -2.80000e+02, -1.82000e+03, -7.28000e+03, -2.00200e+04, + -4.00400e+04, -6.00600e+04, -6.86400e+04, -6.00600e+04, -4.00400e+04, + -2.00200e+04, -7.28000e+03, -1.82000e+03, -2.80000e+02, -2.00000e+01, + -4.50000e+01, -6.30000e+02, -4.09500e+03, -1.63800e+04, -4.50450e+04, + -9.00900e+04, -1.35135e+05, -1.54440e+05, -1.35135e+05, -9.00900e+04, + -4.50450e+04, -1.63800e+04, -4.09500e+03, -6.30000e+02, -4.50000e+01, + 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, + 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, + 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, + 4.50000e+01, 6.30000e+02, 4.09500e+03, 1.63800e+04, 4.50450e+04, + 9.00900e+04, 1.35135e+05, 1.54440e+05, 1.35135e+05, 9.00900e+04, + 4.50450e+04, 1.63800e+04, 4.09500e+03, 6.30000e+02, 4.50000e+01, + 2.00000e+01, 2.80000e+02, 1.82000e+03, 7.28000e+03, 2.00200e+04, + 4.00400e+04, 6.00600e+04, 6.86400e+04, 6.00600e+04, 4.00400e+04, + 2.00200e+04, 7.28000e+03, 1.82000e+03, 2.80000e+02, 2.00000e+01, + -1.90000e+01, -2.66000e+02, -1.72900e+03, -6.91600e+03, -1.90190e+04, + -3.80380e+04, -5.70570e+04, -6.52080e+04, -5.70570e+04, -3.80380e+04, + -1.90190e+04, -6.91600e+03, -1.72900e+03, -2.66000e+02, -1.90000e+01, + -1.60000e+01, -2.24000e+02, -1.45600e+03, -5.82400e+03, -1.60160e+04, + -3.20320e+04, -4.80480e+04, -5.49120e+04, -4.80480e+04, -3.20320e+04, + -1.60160e+04, -5.82400e+03, -1.45600e+03, -2.24000e+02, -1.60000e+01, + 1.00000e+00, 1.40000e+01, 9.10000e+01, 3.64000e+02, 1.00100e+03, + 2.00200e+03, 3.00300e+03, 3.43200e+03, 3.00300e+03, 2.00200e+03, + 1.00100e+03, 3.64000e+02, 9.10000e+01, 1.40000e+01, 1.00000e+00, + 4.00000e+00, 5.60000e+01, 3.64000e+02, 1.45600e+03, 4.00400e+03, + 8.00800e+03, 1.20120e+04, 1.37280e+04, 1.20120e+04, 8.00800e+03, + 4.00400e+03, 1.45600e+03, 3.64000e+02, 5.60000e+01, 4.00000e+00, + 1.00000e+00, 1.40000e+01, 9.10000e+01, 3.64000e+02, 1.00100e+03, + 2.00200e+03, 3.00300e+03, 3.43200e+03, 3.00300e+03, 2.00200e+03, + 1.00100e+03, 3.64000e+02, 9.10000e+01, 1.40000e+01, 1.00000e+00 +}; + +std::vector dx_dy_sobel_3_3_19 { + 1.00000e+00, 1.20000e+01, 6.30000e+01, 1.84000e+02, 3.00000e+02, + 1.68000e+02, -3.64000e+02, -9.36000e+02, -8.58000e+02, -0.00000e+00, + 8.58000e+02, 9.36000e+02, 3.64000e+02, -1.68000e+02, -3.00000e+02, + -1.84000e+02, -6.30000e+01, -1.20000e+01, -1.00000e+00, + 1.20000e+01, 1.44000e+02, 7.56000e+02, 2.20800e+03, 3.60000e+03, + 2.01600e+03, -4.36800e+03, -1.12320e+04, -1.02960e+04, -0.00000e+00, + 1.02960e+04, 1.12320e+04, 4.36800e+03, -2.01600e+03, -3.60000e+03, + -2.20800e+03, -7.56000e+02, -1.44000e+02, -1.20000e+01, + 6.30000e+01, 7.56000e+02, 3.96900e+03, 1.15920e+04, 1.89000e+04, + 1.05840e+04, -2.29320e+04, -5.89680e+04, -5.40540e+04, -0.00000e+00, + 5.40540e+04, 5.89680e+04, 2.29320e+04, -1.05840e+04, -1.89000e+04, + -1.15920e+04, -3.96900e+03, -7.56000e+02, -6.30000e+01, + 1.84000e+02, 2.20800e+03, 1.15920e+04, 3.38560e+04, 5.52000e+04, + 3.09120e+04, -6.69760e+04, -1.72224e+05, -1.57872e+05, -0.00000e+00, + 1.57872e+05, 1.72224e+05, 6.69760e+04, -3.09120e+04, -5.52000e+04, + -3.38560e+04, -1.15920e+04, -2.20800e+03, -1.84000e+02, + 3.00000e+02, 3.60000e+03, 1.89000e+04, 5.52000e+04, 9.00000e+04, + 5.04000e+04, -1.09200e+05, -2.80800e+05, -2.57400e+05, -0.00000e+00, + 2.57400e+05, 2.80800e+05, 1.09200e+05, -5.04000e+04, -9.00000e+04, + -5.52000e+04, -1.89000e+04, -3.60000e+03, -3.00000e+02, + 1.68000e+02, 2.01600e+03, 1.05840e+04, 3.09120e+04, 5.04000e+04, + 2.82240e+04, -6.11520e+04, -1.57248e+05, -1.44144e+05, -0.00000e+00, + 1.44144e+05, 1.57248e+05, 6.11520e+04, -2.82240e+04, -5.04000e+04, + -3.09120e+04, -1.05840e+04, -2.01600e+03, -1.68000e+02, + -3.64000e+02, -4.36800e+03, -2.29320e+04, -6.69760e+04, -1.09200e+05, + -6.11520e+04, 1.32496e+05, 3.40704e+05, 3.12312e+05, 0.00000e+00, + -3.12312e+05, -3.40704e+05, -1.32496e+05, 6.11520e+04, 1.09200e+05, + 6.69760e+04, 2.29320e+04, 4.36800e+03, 3.64000e+02, + -9.36000e+02, -1.12320e+04, -5.89680e+04, -1.72224e+05, -2.80800e+05, + -1.57248e+05, 3.40704e+05, 8.76096e+05, 8.03088e+05, 0.00000e+00, + -8.03088e+05, -8.76096e+05, -3.40704e+05, 1.57248e+05, 2.80800e+05, + 1.72224e+05, 5.89680e+04, 1.12320e+04, 9.36000e+02, + -8.58000e+02, -1.02960e+04, -5.40540e+04, -1.57872e+05, -2.57400e+05, + -1.44144e+05, 3.12312e+05, 8.03088e+05, 7.36164e+05, 0.00000e+00, + -7.36164e+05, -8.03088e+05, -3.12312e+05, 1.44144e+05, 2.57400e+05, + 1.57872e+05, 5.40540e+04, 1.02960e+04, 8.58000e+02, + -0.00000e+00, -0.00000e+00, -0.00000e+00, -0.00000e+00, -0.00000e+00, + -0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, + -0.00000e+00, -0.00000e+00, -0.00000e+00, 0.00000e+00, 0.00000e+00, + 0.00000e+00, 0.00000e+00, 0.00000e+00, 0.00000e+00, + 8.58000e+02, 1.02960e+04, 5.40540e+04, 1.57872e+05, 2.57400e+05, + 1.44144e+05, -3.12312e+05, -8.03088e+05, -7.36164e+05, -0.00000e+00, + 7.36164e+05, 8.03088e+05, 3.12312e+05, -1.44144e+05, -2.57400e+05, + -1.57872e+05, -5.40540e+04, -1.02960e+04, -8.58000e+02, + 9.36000e+02, 1.12320e+04, 5.89680e+04, 1.72224e+05, 2.80800e+05, + 1.57248e+05, -3.40704e+05, -8.76096e+05, -8.03088e+05, -0.00000e+00, + 8.03088e+05, 8.76096e+05, 3.40704e+05, -1.57248e+05, -2.80800e+05, + -1.72224e+05, -5.89680e+04, -1.12320e+04, -9.36000e+02, + 3.64000e+02, 4.36800e+03, 2.29320e+04, 6.69760e+04, 1.09200e+05, + 6.11520e+04, -1.32496e+05, -3.40704e+05, -3.12312e+05, -0.00000e+00, + 3.12312e+05, 3.40704e+05, 1.32496e+05, -6.11520e+04, -1.09200e+05, + -6.69760e+04, -2.29320e+04, -4.36800e+03, -3.64000e+02, + -1.68000e+02, -2.01600e+03, -1.05840e+04, -3.09120e+04, -5.04000e+04, + -2.82240e+04, 6.11520e+04, 1.57248e+05, 1.44144e+05, 0.00000e+00, + -1.44144e+05, -1.57248e+05, -6.11520e+04, 2.82240e+04, 5.04000e+04, + 3.09120e+04, 1.05840e+04, 2.01600e+03, 1.68000e+02, + -3.00000e+02, -3.60000e+03, -1.89000e+04, -5.52000e+04, -9.00000e+04, + -5.04000e+04, 1.09200e+05, 2.80800e+05, 2.57400e+05, 0.00000e+00, + -2.57400e+05, -2.80800e+05, -1.09200e+05, 5.04000e+04, 9.00000e+04, + 5.52000e+04, 1.89000e+04, 3.60000e+03, 3.00000e+02, + -1.84000e+02, -2.20800e+03, -1.15920e+04, -3.38560e+04, -5.52000e+04, + -3.09120e+04, 6.69760e+04, 1.72224e+05, 1.57872e+05, 0.00000e+00, + -1.57872e+05, -1.72224e+05, -6.69760e+04, 3.09120e+04, 5.52000e+04, + 3.38560e+04, 1.15920e+04, 2.20800e+03, 1.84000e+02, + -6.30000e+01, -7.56000e+02, -3.96900e+03, -1.15920e+04, -1.89000e+04, + -1.05840e+04, 2.29320e+04, 5.89680e+04, 5.40540e+04, 0.00000e+00, + -5.40540e+04, -5.89680e+04, -2.29320e+04, 1.05840e+04, 1.89000e+04, + 1.15920e+04, 3.96900e+03, 7.56000e+02, 6.30000e+01, + -1.20000e+01, -1.44000e+02, -7.56000e+02, -2.20800e+03, -3.60000e+03, + -2.01600e+03, 4.36800e+03, 1.12320e+04, 1.02960e+04, 0.00000e+00, + -1.02960e+04, -1.12320e+04, -4.36800e+03, 2.01600e+03, 3.60000e+03, + 2.20800e+03, 7.56000e+02, 1.44000e+02, 1.20000e+01, + -1.00000e+00, -1.20000e+01, -6.30000e+01, -1.84000e+02, -3.00000e+02, + -1.68000e+02, 3.64000e+02, 9.36000e+02, 8.58000e+02, 0.00000e+00, + -8.58000e+02, -9.36000e+02, -3.64000e+02, 1.68000e+02, 3.00000e+02, + 1.84000e+02, 6.30000e+01, 1.20000e+01, 1.00000e+00 +}; + +std::vector dx_dy_sobel_4_4_19 { + 1.00000e+00, 1.00000e+01, 4.10000e+01, 8.00000e+01, 3.60000e+01, + -1.68000e+02, -3.64000e+02, -2.08000e+02, 2.86000e+02, 5.72000e+02, + 2.86000e+02, -2.08000e+02, -3.64000e+02, -1.68000e+02, 3.60000e+01, + 8.00000e+01, 4.10000e+01, 1.00000e+01, 1.00000e+00, + 1.00000e+01, 1.00000e+02, 4.10000e+02, 8.00000e+02, 3.60000e+02, + -1.68000e+03, -3.64000e+03, -2.08000e+03, 2.86000e+03, 5.72000e+03, + 2.86000e+03, -2.08000e+03, -3.64000e+03, -1.68000e+03, 3.60000e+02, + 8.00000e+02, 4.10000e+02, 1.00000e+02, 1.00000e+01, + 4.10000e+01, 4.10000e+02, 1.68100e+03, 3.28000e+03, 1.47600e+03, + -6.88800e+03, -1.49240e+04, -8.52800e+03, 1.17260e+04, 2.34520e+04, + 1.17260e+04, -8.52800e+03, -1.49240e+04, -6.88800e+03, 1.47600e+03, + 3.28000e+03, 1.68100e+03, 4.10000e+02, 4.10000e+01, + 8.00000e+01, 8.00000e+02, 3.28000e+03, 6.40000e+03, 2.88000e+03, + -1.34400e+04, -2.91200e+04, -1.66400e+04, 2.28800e+04, 4.57600e+04, + 2.28800e+04, -1.66400e+04, -2.91200e+04, -1.34400e+04, 2.88000e+03, + 6.40000e+03, 3.28000e+03, 8.00000e+02, 8.00000e+01, + 3.60000e+01, 3.60000e+02, 1.47600e+03, 2.88000e+03, 1.29600e+03, + -6.04800e+03, -1.31040e+04, -7.48800e+03, 1.02960e+04, 2.05920e+04, + 1.02960e+04, -7.48800e+03, -1.31040e+04, -6.04800e+03, 1.29600e+03, + 2.88000e+03, 1.47600e+03, 3.60000e+02, 3.60000e+01, + -1.68000e+02, -1.68000e+03, -6.88800e+03, -1.34400e+04, -6.04800e+03, + 2.82240e+04, 6.11520e+04, 3.49440e+04, -4.80480e+04, -9.60960e+04, + -4.80480e+04, 3.49440e+04, 6.11520e+04, 2.82240e+04, -6.04800e+03, + -1.34400e+04, -6.88800e+03, -1.68000e+03, -1.68000e+02, + -3.64000e+02, -3.64000e+03, -1.49240e+04, -2.91200e+04, -1.31040e+04, + 6.11520e+04, 1.32496e+05, 7.57120e+04, -1.04104e+05, -2.08208e+05, + -1.04104e+05, 7.57120e+04, 1.32496e+05, 6.11520e+04, -1.31040e+04, + -2.91200e+04, -1.49240e+04, -3.64000e+03, -3.64000e+02, + -2.08000e+02, -2.08000e+03, -8.52800e+03, -1.66400e+04, -7.48800e+03, + 3.49440e+04, 7.57120e+04, 4.32640e+04, -5.94880e+04, -1.18976e+05, + -5.94880e+04, 4.32640e+04, 7.57120e+04, 3.49440e+04, -7.48800e+03, + -1.66400e+04, -8.52800e+03, -2.08000e+03, -2.08000e+02, + 2.86000e+02, 2.86000e+03, 1.17260e+04, 2.28800e+04, 1.02960e+04, + -4.80480e+04, -1.04104e+05, -5.94880e+04, 8.17960e+04, 1.63592e+05, + 8.17960e+04, -5.94880e+04, -1.04104e+05, -4.80480e+04, 1.02960e+04, + 2.28800e+04, 1.17260e+04, 2.86000e+03, 2.86000e+02, + 5.72000e+02, 5.72000e+03, 2.34520e+04, 4.57600e+04, 2.05920e+04, + -9.60960e+04, -2.08208e+05, -1.18976e+05, 1.63592e+05, 3.27184e+05, + 1.63592e+05, -1.18976e+05, -2.08208e+05, -9.60960e+04, 2.05920e+04, + 4.57600e+04, 2.34520e+04, 5.72000e+03, 5.72000e+02, + 2.86000e+02, 2.86000e+03, 1.17260e+04, 2.28800e+04, 1.02960e+04, + -4.80480e+04, -1.04104e+05, -5.94880e+04, 8.17960e+04, 1.63592e+05, + 8.17960e+04, -5.94880e+04, -1.04104e+05, -4.80480e+04, 1.02960e+04, + 2.28800e+04, 1.17260e+04, 2.86000e+03, 2.86000e+02, + -2.08000e+02, -2.08000e+03, -8.52800e+03, -1.66400e+04, -7.48800e+03, + 3.49440e+04, 7.57120e+04, 4.32640e+04, -5.94880e+04, -1.18976e+05, + -5.94880e+04, 4.32640e+04, 7.57120e+04, 3.49440e+04, -7.48800e+03, + -1.66400e+04, -8.52800e+03, -2.08000e+03, -2.08000e+02, + -3.64000e+02, -3.64000e+03, -1.49240e+04, -2.91200e+04, -1.31040e+04, + 6.11520e+04, 1.32496e+05, 7.57120e+04, -1.04104e+05, -2.08208e+05, + -1.04104e+05, 7.57120e+04, 1.32496e+05, 6.11520e+04, -1.31040e+04, + -2.91200e+04, -1.49240e+04, -3.64000e+03, -3.64000e+02, + -1.68000e+02, -1.68000e+03, -6.88800e+03, -1.34400e+04, -6.04800e+03, + 2.82240e+04, 6.11520e+04, 3.49440e+04, -4.80480e+04, -9.60960e+04, + -4.80480e+04, 3.49440e+04, 6.11520e+04, 2.82240e+04, -6.04800e+03, + -1.34400e+04, -6.88800e+03, -1.68000e+03, -1.68000e+02, + 3.60000e+01, 3.60000e+02, 1.47600e+03, 2.88000e+03, 1.29600e+03, + -6.04800e+03, -1.31040e+04, -7.48800e+03, 1.02960e+04, 2.05920e+04, + 1.02960e+04, -7.48800e+03, -1.31040e+04, -6.04800e+03, 1.29600e+03, + 2.88000e+03, 1.47600e+03, 3.60000e+02, 3.60000e+01, + 8.00000e+01, 8.00000e+02, 3.28000e+03, 6.40000e+03, 2.88000e+03, + -1.34400e+04, -2.91200e+04, -1.66400e+04, 2.28800e+04, 4.57600e+04, + 2.28800e+04, -1.66400e+04, -2.91200e+04, -1.34400e+04, 2.88000e+03, + 6.40000e+03, 3.28000e+03, 8.00000e+02, 8.00000e+01, + 4.10000e+01, 4.10000e+02, 1.68100e+03, 3.28000e+03, 1.47600e+03, + -6.88800e+03, -1.49240e+04, -8.52800e+03, 1.17260e+04, 2.34520e+04, + 1.17260e+04, -8.52800e+03, -1.49240e+04, -6.88800e+03, 1.47600e+03, + 3.28000e+03, 1.68100e+03, 4.10000e+02, 4.10000e+01, + 1.00000e+01, 1.00000e+02, 4.10000e+02, 8.00000e+02, 3.60000e+02, + -1.68000e+03, -3.64000e+03, -2.08000e+03, 2.86000e+03, 5.72000e+03, + 2.86000e+03, -2.08000e+03, -3.64000e+03, -1.68000e+03, 3.60000e+02, + 8.00000e+02, 4.10000e+02, 1.00000e+02, 1.00000e+01, + 1.00000e+00, 1.00000e+01, 4.10000e+01, 8.00000e+01, 3.60000e+01, + -1.68000e+02, -3.64000e+02, -2.08000e+02, 2.86000e+02, 5.72000e+02, + 2.86000e+02, -2.08000e+02, -3.64000e+02, -1.68000e+02, 3.60000e+01, + 8.00000e+01, 4.10000e+01, 1.00000e+01, 1.00000e+00 +}; + +std::vector dx_dy_sobel_1_7_19 { + 1.000000e+00, 1.600000e+01, 1.190000e+02, 5.440000e+02, 1.700000e+03, + 3.808000e+03, 6.188000e+03, 7.072000e+03, 4.862000e+03, -0.000000e+00, + -4.862000e+03, -7.072000e+03, -6.188000e+03, -3.808000e+03, -1.700000e+03, + -5.440000e+02, -1.190000e+02, -1.600000e+01, -1.000000e+00, + 4.000000e+00, 6.400000e+01, 4.760000e+02, 2.176000e+03, 6.800000e+03, + 1.523200e+04, 2.475200e+04, 2.828800e+04, 1.944800e+04, -0.000000e+00, + -1.944800e+04, -2.828800e+04, -2.475200e+04, -1.523200e+04, -6.800000e+03, + -2.176000e+03, -4.760000e+02, -6.400000e+01, -4.000000e+00, + -1.000000e+00, -1.600000e+01, -1.190000e+02, -5.440000e+02, -1.700000e+03, + -3.808000e+03, -6.188000e+03, -7.072000e+03, -4.862000e+03, 0.000000e+00, + 4.862000e+03, 7.072000e+03, 6.188000e+03, 3.808000e+03, 1.700000e+03, + 5.440000e+02, 1.190000e+02, 1.600000e+01, 1.000000e+00, + -2.400000e+01, -3.840000e+02, -2.856000e+03, -1.305600e+04, -4.080000e+04, + -9.139200e+04, -1.485120e+05, -1.697280e+05, -1.166880e+05, 0.000000e+00, + 1.166880e+05, 1.697280e+05, 1.485120e+05, 9.139200e+04, 4.080000e+04, + 1.305600e+04, 2.856000e+03, 3.840000e+02, 2.400000e+01, + -2.000000e+01, -3.200000e+02, -2.380000e+03, -1.088000e+04, -3.400000e+04, + -7.616000e+04, -1.237600e+05, -1.414400e+05, -9.724000e+04, 0.000000e+00, + 9.724000e+04, 1.414400e+05, 1.237600e+05, 7.616000e+04, 3.400000e+04, + 1.088000e+04, 2.380000e+03, 3.200000e+02, 2.000000e+01, + 5.600000e+01, 8.960000e+02, 6.664000e+03, 3.046400e+04, 9.520000e+04, + 2.132480e+05, 3.465280e+05, 3.960320e+05, 2.722720e+05, -0.000000e+00, + -2.722720e+05, -3.960320e+05, -3.465280e+05, -2.132480e+05, -9.520000e+04, + -3.046400e+04, -6.664000e+03, -8.960000e+02, -5.600000e+01, + 8.400000e+01, 1.344000e+03, 9.996000e+03, 4.569600e+04, 1.428000e+05, + 3.198720e+05, 5.197920e+05, 5.940480e+05, 4.084080e+05, -0.000000e+00, + -4.084080e+05, -5.940480e+05, -5.197920e+05, -3.198720e+05, -1.428000e+05, + -4.569600e+04, -9.996000e+03, -1.344000e+03, -8.400000e+01, + -5.600000e+01, -8.960000e+02, -6.664000e+03, -3.046400e+04, -9.520000e+04, + -2.132480e+05, -3.465280e+05, -3.960320e+05, -2.722720e+05, 0.000000e+00, + 2.722720e+05, 3.960320e+05, 3.465280e+05, 2.132480e+05, 9.520000e+04, + 3.046400e+04, 6.664000e+03, 8.960000e+02, 5.600000e+01, + -1.540000e+02, -2.464000e+03, -1.832600e+04, -8.377600e+04, -2.618000e+05, + -5.864320e+05, -9.529520e+05, -1.089088e+06, -7.487480e+05, 0.000000e+00, + 7.487480e+05, 1.089088e+06, 9.529520e+05, 5.864320e+05, 2.618000e+05, + 8.377600e+04, 1.832600e+04, 2.464000e+03, 1.540000e+02, + -0.000000e+00, -0.000000e+00, -0.000000e+00, -0.000000e+00, -0.000000e+00, + -0.000000e+00, -0.000000e+00, -0.000000e+00, -0.000000e+00, 0.000000e+00, + 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, + 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, + 1.540000e+02, 2.464000e+03, 1.832600e+04, 8.377600e+04, 2.618000e+05, + 5.864320e+05, 9.529520e+05, 1.089088e+06, 7.487480e+05, -0.000000e+00, + -7.487480e+05, -1.089088e+06, -9.529520e+05, -5.864320e+05, -2.618000e+05, + -8.377600e+04, -1.832600e+04, -2.464000e+03, -1.540000e+02, + 5.600000e+01, 8.960000e+02, 6.664000e+03, 3.046400e+04, 9.520000e+04, + 2.132480e+05, 3.465280e+05, 3.960320e+05, 2.722720e+05, -0.000000e+00, + -2.722720e+05, -3.960320e+05, -3.465280e+05, -2.132480e+05, -9.520000e+04, + -3.046400e+04, -6.664000e+03, -8.960000e+02, -5.600000e+01, + -8.400000e+01, -1.344000e+03, -9.996000e+03, -4.569600e+04, -1.428000e+05, + -3.198720e+05, -5.197920e+05, -5.940480e+05, -4.084080e+05, 0.000000e+00, + 4.084080e+05, 5.940480e+05, 5.197920e+05, 3.198720e+05, 1.428000e+05, + 4.569600e+04, 9.996000e+03, 1.344000e+03, 8.400000e+01, + -5.600000e+01, -8.960000e+02, -6.664000e+03, -3.046400e+04, -9.520000e+04, + -2.132480e+05, -3.465280e+05, -3.960320e+05, -2.722720e+05, 0.000000e+00, + 2.722720e+05, 3.960320e+05, 3.465280e+05, 2.132480e+05, 9.520000e+04, + 3.046400e+04, 6.664000e+03, 8.960000e+02, 5.600000e+01, + 2.000000e+01, 3.200000e+02, 2.380000e+03, 1.088000e+04, 3.400000e+04, + 7.616000e+04, 1.237600e+05, 1.414400e+05, 9.724000e+04, -0.000000e+00, + -9.724000e+04, -1.414400e+05, -1.237600e+05, -7.616000e+04, -3.400000e+04, + -1.088000e+04, -2.380000e+03, -3.200000e+02, -2.000000e+01, + 2.400000e+01, 3.840000e+02, 2.856000e+03, 1.305600e+04, 4.080000e+04, + 9.139200e+04, 1.485120e+05, 1.697280e+05, 1.166880e+05, -0.000000e+00, + -1.166880e+05, -1.697280e+05, -1.485120e+05, -9.139200e+04, -4.080000e+04, + -1.305600e+04, -2.856000e+03, -3.840000e+02, -2.400000e+01, + 1.000000e+00, 1.600000e+01, 1.190000e+02, 5.440000e+02, 1.700000e+03, + 3.808000e+03, 6.188000e+03, 7.072000e+03, 4.862000e+03, -0.000000e+00, + -4.862000e+03, -7.072000e+03, -6.188000e+03, -3.808000e+03, -1.700000e+03, + -5.440000e+02, -1.190000e+02, -1.600000e+01, -1.000000e+00, + -4.000000e+00, -6.400000e+01, -4.760000e+02, -2.176000e+03, -6.800000e+03, + -1.523200e+04, -2.475200e+04, -2.828800e+04, -1.944800e+04, 0.000000e+00, + 1.944800e+04, 2.828800e+04, 2.475200e+04, 1.523200e+04, 6.800000e+03, + 2.176000e+03, 4.760000e+02, 6.400000e+01, 4.000000e+00, + -1.000000e+00, -1.600000e+01, -1.190000e+02, -5.440000e+02, -1.700000e+03, + -3.808000e+03, -6.188000e+03, -7.072000e+03, -4.862000e+03, 0.000000e+00, + 4.862000e+03, 7.072000e+03, 6.188000e+03, 3.808000e+03, 1.700000e+03, + 5.440000e+02, 1.190000e+02, 1.600000e+01, 1.000000e+00 +}; + +std::vector dx_dy_sobel_5_1_19 { + 1.000000e+00, 8.000000e+00, 2.300000e+01, 1.600000e+01, -6.000000e+01, + -1.440000e+02, -5.200000e+01, 2.080000e+02, 2.860000e+02, -0.000000e+00, + -2.860000e+02, -2.080000e+02, 5.200000e+01, 1.440000e+02, 6.000000e+01, + -1.600000e+01, -2.300000e+01, -8.000000e+00, -1.000000e+00, + 1.600000e+01, 1.280000e+02, 3.680000e+02, 2.560000e+02, -9.600000e+02, + -2.304000e+03, -8.320000e+02, 3.328000e+03, 4.576000e+03, -0.000000e+00, + -4.576000e+03, -3.328000e+03, 8.320000e+02, 2.304000e+03, 9.600000e+02, + -2.560000e+02, -3.680000e+02, -1.280000e+02, -1.600000e+01, + 1.190000e+02, 9.520000e+02, 2.737000e+03, 1.904000e+03, -7.140000e+03, + -1.713600e+04, -6.188000e+03, 2.475200e+04, 3.403400e+04, -0.000000e+00, + -3.403400e+04, -2.475200e+04, 6.188000e+03, 1.713600e+04, 7.140000e+03, + -1.904000e+03, -2.737000e+03, -9.520000e+02, -1.190000e+02, + 5.440000e+02, 4.352000e+03, 1.251200e+04, 8.704000e+03, -3.264000e+04, + -7.833600e+04, -2.828800e+04, 1.131520e+05, 1.555840e+05, -0.000000e+00, + -1.555840e+05, -1.131520e+05, 2.828800e+04, 7.833600e+04, 3.264000e+04, + -8.704000e+03, -1.251200e+04, -4.352000e+03, -5.440000e+02, + 1.700000e+03, 1.360000e+04, 3.910000e+04, 2.720000e+04, -1.020000e+05, + -2.448000e+05, -8.840000e+04, 3.536000e+05, 4.862000e+05, -0.000000e+00, + -4.862000e+05, -3.536000e+05, 8.840000e+04, 2.448000e+05, 1.020000e+05, + -2.720000e+04, -3.910000e+04, -1.360000e+04, -1.700000e+03, + 3.808000e+03, 3.046400e+04, 8.758400e+04, 6.092800e+04, -2.284800e+05, + -5.483520e+05, -1.980160e+05, 7.920640e+05, 1.089088e+06, -0.000000e+00, + -1.089088e+06, -7.920640e+05, 1.980160e+05, 5.483520e+05, 2.284800e+05, + -6.092800e+04, -8.758400e+04, -3.046400e+04, -3.808000e+03, + 6.188000e+03, 4.950400e+04, 1.423240e+05, 9.900800e+04, -3.712800e+05, + -8.910720e+05, -3.217760e+05, 1.287104e+06, 1.769768e+06, -0.000000e+00, + -1.769768e+06, -1.287104e+06, 3.217760e+05, 8.910720e+05, 3.712800e+05, + -9.900800e+04, -1.423240e+05, -4.950400e+04, -6.188000e+03, + 7.072000e+03, 5.657600e+04, 1.626560e+05, 1.131520e+05, -4.243200e+05, + -1.018368e+06, -3.677440e+05, 1.470976e+06, 2.022592e+06, -0.000000e+00, + -2.022592e+06, -1.470976e+06, 3.677440e+05, 1.018368e+06, 4.243200e+05, + -1.131520e+05, -1.626560e+05, -5.657600e+04, -7.072000e+03, + 4.862000e+03, 3.889600e+04, 1.118260e+05, 7.779200e+04, -2.917200e+05, + -7.001280e+05, -2.528240e+05, 1.011296e+06, 1.390532e+06, -0.000000e+00, + -1.390532e+06, -1.011296e+06, 2.528240e+05, 7.001280e+05, 2.917200e+05, + -7.779200e+04, -1.118260e+05, -3.889600e+04, -4.862000e+03, + -0.000000e+00, -0.000000e+00, -0.000000e+00, -0.000000e+00, 0.000000e+00, + 0.000000e+00, 0.000000e+00, -0.000000e+00, -0.000000e+00, 0.000000e+00, + 0.000000e+00, 0.000000e+00, -0.000000e+00, -0.000000e+00, -0.000000e+00, + 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, + -4.862000e+03, -3.889600e+04, -1.118260e+05, -7.779200e+04, 2.917200e+05, + 7.001280e+05, 2.528240e+05, -1.011296e+06, -1.390532e+06, 0.000000e+00, + 1.390532e+06, 1.011296e+06, -2.528240e+05, -7.001280e+05, -2.917200e+05, + 7.779200e+04, 1.118260e+05, 3.889600e+04, 4.862000e+03, + -7.072000e+03, -5.657600e+04, -1.626560e+05, -1.131520e+05, 4.243200e+05, + 1.018368e+06, 3.677440e+05, -1.470976e+06, -2.022592e+06, 0.000000e+00, + 2.022592e+06, 1.470976e+06, -3.677440e+05, -1.018368e+06, -4.243200e+05, + 1.131520e+05, 1.626560e+05, 5.657600e+04, 7.072000e+03, + -6.188000e+03, -4.950400e+04, -1.423240e+05, -9.900800e+04, 3.712800e+05, + 8.910720e+05, 3.217760e+05, -1.287104e+06, -1.769768e+06, 0.000000e+00, + 1.769768e+06, 1.287104e+06, -3.217760e+05, -8.910720e+05, -3.712800e+05, + 9.900800e+04, 1.423240e+05, 4.950400e+04, 6.188000e+03, + -3.808000e+03, -3.046400e+04, -8.758400e+04, -6.092800e+04, 2.284800e+05, + 5.483520e+05, 1.980160e+05, -7.920640e+05, -1.089088e+06, 0.000000e+00, + 1.089088e+06, 7.920640e+05, -1.980160e+05, -5.483520e+05, -2.284800e+05, + 6.092800e+04, 8.758400e+04, 3.046400e+04, 3.808000e+03, + -1.700000e+03, -1.360000e+04, -3.910000e+04, -2.720000e+04, 1.020000e+05, + 2.448000e+05, 8.840000e+04, -3.536000e+05, -4.862000e+05, 0.000000e+00, + 4.862000e+05, 3.536000e+05, -8.840000e+04, -2.448000e+05, -1.020000e+05, + 2.720000e+04, 3.910000e+04, 1.360000e+04, 1.700000e+03, + -5.440000e+02, -4.352000e+03, -1.251200e+04, -8.704000e+03, 3.264000e+04, + 7.833600e+04, 2.828800e+04, -1.131520e+05, -1.555840e+05, 0.000000e+00, + 1.555840e+05, 1.131520e+05, -2.828800e+04, -7.833600e+04, -3.264000e+04, + 8.704000e+03, 1.251200e+04, 4.352000e+03, 5.440000e+02, + -1.190000e+02, -9.520000e+02, -2.737000e+03, -1.904000e+03, 7.140000e+03, + 1.713600e+04, 6.188000e+03, -2.475200e+04, -3.403400e+04, 0.000000e+00, + 3.403400e+04, 2.475200e+04, -6.188000e+03, -1.713600e+04, -7.140000e+03, + 1.904000e+03, 2.737000e+03, 9.520000e+02, 1.190000e+02, + -1.600000e+01, -1.280000e+02, -3.680000e+02, -2.560000e+02, 9.600000e+02, + 2.304000e+03, 8.320000e+02, -3.328000e+03, -4.576000e+03, 0.000000e+00, + 4.576000e+03, 3.328000e+03, -8.320000e+02, -2.304000e+03, -9.600000e+02, + 2.560000e+02, 3.680000e+02, 1.280000e+02, 1.600000e+01, + -1.000000e+00, -8.000000e+00, -2.300000e+01, -1.600000e+01, 6.000000e+01, + 1.440000e+02, 5.200000e+01, -2.080000e+02, -2.860000e+02, 0.000000e+00, + 2.860000e+02, 2.080000e+02, -5.200000e+01, -1.440000e+02, -6.000000e+01, + 1.600000e+01, 2.300000e+01, 8.000000e+00, 1.000000e+00 +}; + void test_dx_sobel_kernel() { - auto const kernel = gil::generate_dx_sobel(1); - BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dx_sobel.begin(), gil::detail::dx_sobel.end()); + auto const kernel = gil::generate_sobel_kernel({1, 0}); + BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dx_sobel.begin(), + gil::detail::dx_sobel.end()); + + auto const kernel_x_6_15 = gil::generate_sobel_kernel({6, 0}, 15); + BOOST_TEST_ALL_EQ(kernel_x_6_15.begin(), kernel_x_6_15.end(), + dx_sobel_6_15.begin(), dx_sobel_6_15.end()); + + auto const kernel_x_7_15 = gil::generate_sobel_kernel({7, 0}); + BOOST_TEST_ALL_EQ(kernel_x_7_15.begin(), kernel_x_7_15.end(), + dx_sobel_7_15.begin(), dx_sobel_7_15.end()); + + auto const kernel_9_19 = gil::generate_sobel_kernel({9, 0}); + BOOST_TEST_ALL_EQ(kernel_9_19.begin(), kernel_9_19.end(), + dx_sobel_9_19.begin(), dx_sobel_9_19.end()); } void test_dx_scharr_kernel() { auto const kernel = gil::generate_dx_scharr(1); - BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dx_scharr.begin(), gil::detail::dx_scharr.end()); + BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dx_scharr.begin(), + gil::detail::dx_scharr.end()); } void test_dy_sobel_kernel() { - auto const kernel = gil::generate_dy_sobel(1); - BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dy_sobel.begin(), gil::detail::dy_sobel.end()); + auto const kernel = gil::generate_sobel_kernel({0, 1}); + BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dy_sobel.begin(), + gil::detail::dy_sobel.end()); + + auto const kernel_y_2_5 = gil::generate_sobel_kernel({0, 2}); + BOOST_TEST_ALL_EQ(kernel_y_2_5.begin(), kernel_y_2_5.end(), + gil::detail::dy_sobel_2_5.begin(), gil::detail::dy_sobel_2_5.end()); + + auto const kernel_y_2_15 = gil::generate_sobel_kernel({0, 2}, 15); + BOOST_TEST_ALL_EQ(kernel_y_2_15.begin(), kernel_y_2_15.end(), + dy_sobel_2_15.begin(), dy_sobel_2_15.end()); + + auto const kernel_y_3_15 = gil::generate_sobel_kernel({0, 3}, 15); + BOOST_TEST_ALL_EQ(kernel_y_3_15.begin(), kernel_y_3_15.end(), + dy_sobel_3_15.begin(), dy_sobel_3_15.end()); + + auto const kernel_y_4_15 = gil::generate_sobel_kernel({0, 4}, 15); + BOOST_TEST_ALL_EQ(kernel_y_4_15.begin(), kernel_y_4_15.end(), + dy_sobel_4_15.begin(), dy_sobel_4_15.end()); + + auto const kernel_y_5_15 = gil::generate_sobel_kernel({0, 5}, 15); + BOOST_TEST_ALL_EQ(kernel_y_5_15.begin(), kernel_y_5_15.end(), + dy_sobel_5_15.begin(), dy_sobel_5_15.end()); } void test_dy_scharr_kernel() { auto const kernel = gil::generate_dy_scharr(1); - BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dy_scharr.begin(), gil::detail::dy_scharr.end()); + BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dy_scharr.begin(), + gil::detail::dy_scharr.end()); +} + +void test_dx_dy_sobel_kernel() +{ + auto const kernel_x_y_3_3_19 = gil::generate_sobel_kernel({3, 3}, 19); + BOOST_TEST_ALL_EQ(kernel_x_y_3_3_19.begin(), kernel_x_y_3_3_19.end(), + dx_dy_sobel_3_3_19.begin(), dx_dy_sobel_3_3_19.end()); + + auto const kernel_x_y_4_4_19 = gil::generate_sobel_kernel({4, 4}, 19); + BOOST_TEST_ALL_EQ(kernel_x_y_4_4_19.begin(), kernel_x_y_4_4_19.end(), + dx_dy_sobel_4_4_19.begin(), dx_dy_sobel_4_4_19.end()); + + auto const kernel_x_y_1_7_19 = gil::generate_sobel_kernel({1, 7}, 19); + BOOST_TEST_ALL_EQ(kernel_x_y_1_7_19.begin(), kernel_x_y_1_7_19.end(), + dx_dy_sobel_1_7_19.begin(), dx_dy_sobel_1_7_19.end()); + + auto const kernel_x_y_5_1_19 = gil::generate_sobel_kernel({5, 1}, 19); + BOOST_TEST_ALL_EQ(kernel_x_y_5_1_19.begin(), kernel_x_y_5_1_19.end(), + dx_dy_sobel_5_1_19.begin(), dx_dy_sobel_5_1_19.end()); } int main() @@ -46,5 +792,7 @@ int main() test_dx_scharr_kernel(); test_dy_sobel_kernel(); test_dy_scharr_kernel(); + test_dx_dy_sobel_kernel(); + return boost::report_errors(); }