sobel算子以及Scharr滤波器Laplacian滤波器使用

sobel算子和scharr算子Laplacian一般都应用于边缘提取,具体原理我们已经在上一篇博客中进行了介绍和相关核的推导。那么我们来看看具体函数怎么使用。

void Sobel(
InputArray src,  //输入图像
OutputArray dst, //输出图像
int ddepth,      //图像深度
int xorder,      //x方向导数
int yorder,     //y方向的导数
Size ksize,      //图像核大小
double scale,    //计算导数值的可选缩放因子,越大表示边沿越明显
double delta,    //导数值加减某个常数值
int borderType   //边缘平滑方式
);

参数xorder和yorder,可以取值0或者1,取值0表示在那个方向上不进行求导,也就是没有相应方向的边缘信息。

注意:图像输出深度应该大于原图像的深度,满足下列参数表

sobel算子以及Scharr滤波器Laplacian滤波器使用_第1张图片

这是因为图像在经过sobel算子运算之后可能会产生负值,我们希望得到的边界是255,却可能出现一边是0,另一边是255的情况,计算结果为-255,采用八位存储截断后显示为0,那么边沿特征就会损失。所以不能存储为原来的大小,也就是不使用默认参数-1。一般我们在转换完之后调用函数convertScale()这个函数转换为八位,这样才能正常在opencv中显示。

图像核的大小一般取3*3,如果取值小于3会自动调整为3,如果取值为-1,那么将使用SCHARR滤波器,可以认为对sobel滤波器的改进,比sobel滤波器精度更高。

拉普拉斯滤波器

它的原理是对图像求二阶导,但是原图像中一些是边缘的像素点和不是边缘的像素点在乘拉普拉斯滤波器后都会变成零,因此函数内部还会通过计算sobel一阶导数,滤掉拥有较大值的点,便可得到正确的边缘。

void Laplacian(
InputArray src,                  //输入图像
OutputArray dst,                 //输出图像
int ddepth,                      //输出图像深度
Size ksize = 3,                  //拉普拉斯核大小
double scale = 1,                //扩大倍数
double delta= 0,                 //固定值
int borderType = BORDER_DEFAULT  //边缘平滑方式
);

你可能感兴趣的:(opencv)