opencv源码之sobel的核模板

opencv滤波算子的pad方式

opencv滤波类算子,如果ksize!=1, 如果图像四周不补pad, 滤波后的图像尺寸会变小,为了让滤波后图像尺寸不变,opencv函数都会在图像四周补pad ,有如下几种pad方式,默认采用BORDER_REFLECT_101的方式。

enum BorderTypes {
    BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`
    BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
    BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`
    BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`
    BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
    BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`

    BORDER_REFLECT101  = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
    BORDER_DEFAULT     = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
    BORDER_ISOLATED    = 16 //!< do not look outside of ROI
};

Sobel的模板生成函数

opencv实现的Sobel的核模板的生成是一个单独的函数,可以观察到不同的k_size时候,具体的核函数是什么。

void test_getSobelKernel()
{
    Mat kx,ky;
    int dx=1;
    int dy=0;
    int ksize=5;
    getDerivKernels(kx,ky,dx,dy,ksize,false, CV_32F);
    cout<<kx<<endl;
    cout<<ky<<endl;

}

当ksize=3,(dx,dy)=(1,0)

kx=[-1;  0;  1]

ky=[1;  2;  1]

当ksize=3,(dx,dy)=(0,1)

kx=[1;  2;  1]

ky=[-1;  0;  1]

当ksize=3,(dx,dy)=(1,1)

kx=[-1;  0;  1]

ky=[-1;  0;  1]

Sobel函数的计算流程:
1, 计算kerel模板值。

2, 调用sepFilter2D函数加速计算。

猜你喜欢

转载自blog.csdn.net/u010420283/article/details/128461409