/* * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** * @file * common functions for edge detection */ #ifndef AVFILTER_EDGE_COMMON_H #define AVFILTER_EDGE_COMMON_H #include "avfilter.h" /** * @brief Rounded directions used in av_image_sobel() */ enum AVRoundedDirection { DIRECTION_45UP, DIRECTION_45DOWN, DIRECTION_HORIZONTAL, DIRECTION_VERTICAL, }; /** * Simple sobel operator to get rounded gradients * * @param w the width of the image in pixels * @param h the height of the image in pixels * @param dst data pointers to magnitude image * @param dst_linesize linesizes for the magnitude image * @param dir data pointers to direction image * @param dir_linesize linesizes for the direction image * @param src data pointers to source image * @param src_linesize linesizes for the source image */ #define PROTO_SOBEL(depth) \ void ff_sobel_##depth(int w, int h, \ uint16_t *dst, int dst_linesize, \ int8_t *dir, int dir_linesize, \ const uint8_t *src, int src_linesize, int src_stride); PROTO_SOBEL(8) PROTO_SOBEL(16) /** * Filters rounded gradients to drop all non-maxima pixels in the magnitude image * Expects gradients generated by av_image_sobel() * Expects zero's in the destination buffer dst * * @param w the width of the image in pixels * @param h the height of the image in pixels * @param dst data pointers to magnitude image * @param dst_linesize linesizes for the magnitude image * @param dir data pointers to direction image * @param dir_linesize linesizes for the direction image * @param src data pointers to source image * @param src_linesize linesizes for the source image */ void ff_non_maximum_suppression(int w, int h, uint8_t *dst, int dst_linesize, const int8_t *dir, int dir_linesize, const uint16_t *src, int src_linesize); /** * Filters all pixels in src to keep all pixels > high, * and keep all pixels > low where all surrounding pixels > high * * @param low the low threshold value * @param high the hegh threshold value * @param w the width of the image in pixels * @param h the height of the image in pixels * @param dst data pointers to destination image * @param dst_linesize linesizes for the destination image * @param src data pointers to source image * @param src_linesize linesizes for the source image */ void ff_double_threshold(int low, int high, int w, int h, uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize); /** * Applies gaussian blur. * 5x5 kernels, sigma = 1.4 * * @param w the width of the image in pixels * @param h the height of the image in pixels * @param dst data pointers to destination image * @param dst_linesize linesizes for the destination image * @param src data pointers to source image * @param src_linesize linesizes for the source image */ #define PROTO_GAUSSIAN_BLUR(depth) \ void ff_gaussian_blur_##depth(int w, int h, \ uint8_t *dst, int dst_linesize, \ const uint8_t *src, int src_linesize, int src_stride); PROTO_GAUSSIAN_BLUR(8) PROTO_GAUSSIAN_BLUR(16) #endif