sobel函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sobel函数相关的知识,希望对你有一定的参考价值。

 在opencv3.1.0中,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 ) 
函数参数解释: 
InputArray src:输入的原图像,Mat类型 
OutputArray dst:输出的边缘检测结果图像,Mat型,大小与原图像相同。 
int 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时,代表输出图像与输入图像相同的深度。 
int dx:int类型dx,x 方向上的差分阶数,1或0 
int dy:int类型dy,y 方向上的差分阶数,1或0 
其中,dx=1,dy=0,表示计算X方向的导数,检测出的是垂直方向上的边缘;dx=0,dy=1,表示计算Y方向的导数,检测出的是水平方向上的边缘。 
int ksize:为进行边缘检测时的模板大小为ksize*ksize,取值为1、3、5和7,其中默认值为3。特殊情况:ksize=1时,采用的模板为3*1或1*3。 
当ksize=3时,Sobel内核可能产生比较明显的误差,此时,可以使用 Scharr 函数,该函数仅作用于大小为3的内核。具有跟sobel一样的速度,但结果更精确,其内核为: 
 技术分享
 
 其调用格式为: 
Scharr( src_gray, grad_x, ddepth, 1, 0, 1, 0, BORDER_DEFAULT ); 
Scharr( src_gray, grad_y, ddepth, 0, 1, 1, 0, BORDER_DEFAULT ); 
等价于: 
/// 求 X方向梯度 
Sobel(src_gray,grad_x,ddepth, 1, 0, CV_SCHARR, scale, delta, BORDER_DEFAULT ); 
/// 求 Y方向梯度 
Sobel(src_gray,grad_y,ddepth, 0, 1, CV_SCHARR, scale, delta, BORDER_DEFAULT );

double scale:默认1。 
double delta:默认0。 
int borderType:默认值为BORDER_DEFAULT。

sobel算法代码实现过程为: 
/// 求 X方向梯度 
Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT ); 
/// 求 Y方向梯度 
Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT ); 
convertScaleAbs( grad_x, abs_grad_x ); 
convertScaleAbs( grad_y, abs_grad_y ); 
addWeighted( dst_x, 0.5, dst_y, 0.5, 0, dst); //一种近似的估计
 
来源:http://blog.csdn.net/streamchuanxi/article/details/51542141



































以上是关于sobel函数的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV Sobel函数的手动实现

如何在 C# 中调用 Sobel 过滤器、图像处理的函数

OpenCV Sobel()函数

实现Sobel算子滤波Robers算子滤波Laplace算子滤波

2.7 Sobel导数

sobel 算子和 canndy 算子的区别