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
posted on 2017-04-29 20:28  三只尾巴  阅读(876)  评论(0编辑  收藏  举报