边缘检测:Sobel算子

1、图像梯度:sobel算子

Sobel算子主要用于边缘检测,在技术上它是以离散型的差分算子,用来运算图像亮度函数的梯度的近似值, Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响

Sobel算子对于象素的位置的影响做了加权,与Prewitt算子、Roberts算子相比因此效果更好。

Sobel算子包含两组3x3的矩阵,分别为横向及纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值

实际使用中,常用如下两个模板来检测图像边缘。

1、检测水平边沿横向模板 :

边缘检测:Sobel算子 

2、检测垂直平边沿纵向模板:

边缘检测:Sobel算子

图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。

边缘检测:Sobel算子

然后可用以下公式计算梯度方向。

边缘检测:Sobel算子

在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。

缺点是Sobel算子并没有将图像的主题与背景严格地区分开来,换言之就是Sobel算子并没有基于图像灰度进行处理,由于Sobel算子并没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。

调用如下:

sobelx = cv2.sobel(src,depth,dx,dy,ksize)

sobely = cv2.sobel(src,depth,dx,dy,ksize)

sobel = cv2.addweight(sobelx,0.5,sobely,0.5,0)

白到黑是正数,黑到白是负数,所有负数截断为0,所以要取绝对值

cv2.convertScaleAbs(sobel)

 

2、图像梯度:scharr算子

和sobel的区别就是,权重差别更大,效果更明显

边缘检测:Sobel算子

cv2.scharr(img,cv2,CV_64F,1,0)

 

3、图像梯度:laplacian算子

Laplacian 算子对噪声比较敏感,二阶,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子结合起来生成一个新的模板。

如果邻域系统是4 邻域,Laplacian 算子的模板为:

边缘检测:Sobel算子

如果邻域系统是8 邻域,Laplacian 算子的模板为:

边缘检测:Sobel算子

cv2.laplacian(img,cv2.CV_64F)

 

参考文章:

https://blog.****.net/xddwz/article/details/78006655