• OpenCV4系列之图像梯度


    在图像处理中,求解图像梯度是常用操作。

    Sobel算子

    Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator.

    Sobel 算子是一种离散性差分算子,用来计算图像像素值的一阶、二阶、三阶或混合梯度。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。

    C++: void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
    C: void cvSobel(const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 )

    参数含义

    src – 输入图像

    dst – 输出结果,与输入图像具有相同的尺寸和通道数

    ddepth – 输出图像的数据类型。支持以下数据类型组合

    • src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
    • src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
    • src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
    • src.depth() = CV_64F, ddepth = -1/CV_64F

    当ddepth=-1时,输出与输入具有相同的数据类型。当输入是8比特图像时,输出结果将是截断的导数值(in the case of 8-bit input images it will result in truncated derivatives)。

    xorder – x方向求导阶数

    yorder – y方向求导阶数

    ksize – 卷积核的大小,只能是1/3/5/7之一(it must be 1, 3, 5, or 7)。

    scale – 缩放尺度因子,默认无缩放

    delta – 存储之前加到上述结果上的偏移量。

    borderType – 边界插值方法,详见附录A-1。

    Scharr算子

    Calculates the first x- or y- image derivative using Scharr operator.

    该算子参数和 Sobel 算子一致,与 Sobel 区别在于,Scharr 仅作用于大小为3的内核。具有和sobel算子一样的速度,但结果更为精确。

    C++: void Scharr(InputArray src, OutputArray dst, int ddepth, int dx, int dy, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )

    参数含义

    src – 输入图像

    dst – 输出结果,与输入图像具有相同的尺寸和通道数

    ddepth – 输出图像的数据类型,即矩阵中元素的一个通道的数据类型,这个值和 type 是相关的。例如 type 为 CV_16SC2,一个2通道的16位的有符号整数,depth是CV_16S

    dx – dx=1 表示求 x 方向的一阶梯度,dx=0 表示不求 x 方向

    dy – 与上类似,dy=1 表示求 y 方向的一阶梯度,dy=0 表示不求 y 方向

    scale – 求导得到的值的缩放尺度因子,默认无缩放

    delta – 在存储之前加到求导值上的数值,可以用于将0以下的值调整到0以上。delta=0 时表示梯度为0处结果保存为0;delta=m 时表示梯度为0处结果保存为m

    borderType – 表示图像四周像素外插值方法,默认是 BORDER_DEFAULT,该参数解释见附录A-1。

    附录A-1

    borderType

    决定在图像发生几何变换或者滤波操作(卷积)时边沿像素的处理方式

    /*
     Various border types, image boundaries are denoted with '|'
    
     * BORDER_REPLICATE:     aaaaaa|abcdefgh|hhhhhhh
     * BORDER_REFLECT:       fedcba|abcdefgh|hgfedcb
     * BORDER_REFLECT_101:   gfedcb|abcdefgh|gfedcba
     * BORDER_WRAP:          cdefgh|abcdefgh|abcdefg
     * BORDER_CONSTANT:      iiiiii|abcdefgh|iiiiiii  with some specified 'i'
     */
    • BORDER_CONSTANT 边沿像素用 i 扩展,需要设置borderValue 指定 ' i ' 值,const cv::Scalar& borderValue = cv::Scalar(0);
    • BORDER_REPLICATE,复制边界像素
    • BORDER_REFLECT,对边界对称扩展,包含对称轴处的元素
    • BORDER_REFLECT_101,以边界为对称轴对称扩展复制像素,不包含对称轴处的元素

    cv::Mat 的属性

    The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array.
    It can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel
    volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms
    may be better stored in a SparseMat ).

    Mat是用于表示一个多维的单通道或者多通道的稠密数组。能用来保存实数或复数的向量、矩阵,灰度或彩色图像,立体元素,点云,张量以及直方图(高维的直方图最好使用SparseMat保存)。总之Mat就是用来保存多维的矩阵的。

    • depth

    depth属性表示矩阵中元素的一个通道的数据类型。可以根据矩阵的 type 属性来判断( S 代表 signed int,即有符号整形;U 代表 unsigned int,即无符号整形;F 代表 float,即单精度浮点型。):

    对于 CV_8U/CV_8S 其 depth 为 1

    对于 CV_16U/CV_16S 其 depth 为 2

    对于 CV_32S/CV_32F 其 depth 为 4

    对于 CV_64F 其depth 为 8

    #define CV_8UC1 CV_MAKETYPE(CV_8U,1)
    #define CV_8UC2 CV_MAKETYPE(CV_8U,2)
    #define CV_8UC3 CV_MAKETYPE(CV_8U,3)
    #define CV_8UC4 CV_MAKETYPE(CV_8U,4)
    #define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))
    
    #define CV_8SC1 CV_MAKETYPE(CV_8S,1)
    #define CV_8SC2 CV_MAKETYPE(CV_8S,2)
    #define CV_8SC3 CV_MAKETYPE(CV_8S,3)
    #define CV_8SC4 CV_MAKETYPE(CV_8S,4)
    #define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))
    
    #define CV_16UC1 CV_MAKETYPE(CV_16U,1)
    #define CV_16UC2 CV_MAKETYPE(CV_16U,2)
    #define CV_16UC3 CV_MAKETYPE(CV_16U,3)
    #define CV_16UC4 CV_MAKETYPE(CV_16U,4)
    #define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))
    
    #define CV_16SC1 CV_MAKETYPE(CV_16S,1)
    #define CV_16SC2 CV_MAKETYPE(CV_16S,2)
    #define CV_16SC3 CV_MAKETYPE(CV_16S,3)
    #define CV_16SC4 CV_MAKETYPE(CV_16S,4)
    #define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))
    
    #define CV_32SC1 CV_MAKETYPE(CV_32S,1)
    #define CV_32SC2 CV_MAKETYPE(CV_32S,2)
    #define CV_32SC3 CV_MAKETYPE(CV_32S,3)
    #define CV_32SC4 CV_MAKETYPE(CV_32S,4)
    #define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))
    
    #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
    #define CV_32FC2 CV_MAKETYPE(CV_32F,2)
    #define CV_32FC3 CV_MAKETYPE(CV_32F,3)
    #define CV_32FC4 CV_MAKETYPE(CV_32F,4)
    #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
    
    #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
    #define CV_64FC2 CV_MAKETYPE(CV_64F,2)
    #define CV_64FC3 CV_MAKETYPE(CV_64F,3)
    #define CV_64FC4 CV_MAKETYPE(CV_64F,4)
    #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
    type definition

    参考资料

    [1] Image Filtering

    [2] OpenCV2:Mat属性type,depth,step

    [3] Sobel Derivatives

    [4] opencv边缘检测sobel算子

    [5] python opencv学习(六)图像梯度计算

  • 相关阅读:
    python模块之subprocess
    Linux系统中如何升级pip
    如何发布自己用python写的py模块
    Win10系统如何分区
    Win10修改编辑文件无法保存怎么办(没有权限)
    robotframework利用selenium2Library实现无界面自动化关键字
    jmeter学习之安装篇(一)
    javascript——this关键字
    Ajax——请求
    AJAX学习——什么是AJAX
  • 原文地址:https://www.cnblogs.com/phillee/p/12374573.html
Copyright © 2020-2023  润新知