对图像进行边缘检测之前,一般都需要先进行降噪(可调用GaussianBlur函数)。
都是一个离散微分算子 (discrete differentiation operator),用来计算图像灰度函数的近似梯度。结合了高斯平滑和微分求导。Sobel算子与Scharr算子的内核不同,Sobel内核产生误差比较明显,Scharr更为准确一些。
Sobel算子的计算步骤:
或者 (简单公式)
1
2
3
4
5
6
7
8
9
10
11
12 |
/// 求 X方向梯度 //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT ); Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT ); convertScaleAbs( grad_x, abs_grad_x ); /// 求Y方向梯度 //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT ); Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT ); convertScaleAbs( grad_y, abs_grad_y ); /// 合并梯度(近似) addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad ); |
计算的是二阶导数。由于 Laplacian使用了图像梯度,它内部调用了 Sobel 算子。Laplacian 算子 的定义:
1
2 |
Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT ); convertScaleAbs( dst, abs_dst ); |
被很多人认为是边缘检测的 最优算法。在Sober算子步骤后添加以下步骤:
OpenCV学习笔记(八) 边缘检测,布布扣,bubuko.com
原文:http://www.cnblogs.com/ericxing/p/3578478.html