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函数加速计算。