差分近似图像导数算子之Sobel算子

背景引言

图像处理中,一个最基本并且最重要的卷积就是导数的计算,一般用来表达微分最常用的操作是Sobel算子,可以包含任意阶的微分以及融合偏导。主要用作为边缘检测。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量。本节介绍Sobel算子知识,给出参考代码以及测试输出结果。

基本理论

Sobel算子的原始推导过程方面很少,根据(Heath et al. 1997) [1],最初Sobel算子是源自于一篇博士论文(Sobel, 1970 )[2]。当时可能用于计算大模板系数的理论基础很少被提到。一个可能的理论基础是考虑到均值计算和差分处理的最优方式。高斯平均已经被公认为最优的均值方法。二项展开式(binomial expansion)可求出级数的整数系数,在极限情况下近似于正态分布(normal distribution)。Pascal's Triangle[3]可计算出平滑算子的一组系数,在极限情况下这组系数与高斯平滑算子的系数大致相同。

在图像处理中,Sobel算子的这个通用形式缩合了一条坐标轴上最优平滑和另一条坐标轴上的最优差分。换而言之,Sobel 算子有两个,一个是检测水平边缘的 ;另一个是检测垂直边缘的 。它对于象素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。但缺点就是Sobel算子并没有将图像的主体与背景严格地区分开来,即:Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意

首先,我们定义一个3X3的模板,如下图1(a)所示,同时定义一个3X3一般算子模板系数表现形式,如下图1(b)所示:

    

图1 (a) 3x3图像的模板   图1 (b) 3x3一般算子的模板系数

所以,可以得出一般的算子的表示G为:

G  = O1*Z1 + O2*Z2 + O3*Z3+O4*Z4+ O5*Z5

              + O6*Z6 +O7*Z7+O8*Z8 + O9*Z9        ........   (1)

根据给出不同算子模板,上式公式可以得出G表示形式。现在,我们给出Sobel算子中的用卷积模板来实现,此算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作卷积,即可分别得出横向及纵向的亮度差分近似值。如下图像所示:

图(2) Sobel算子的3X3模板

其次,根据公式(1)和图(2)给出Sobel算子的3x3模板,Gx和Gy分别表经横向及纵向边缘的图像灰度值,其所表示:

梯度幅度值所表示为:


上述所示Sobel算子基本理论,此时,给出 Sobel算子算法的主要步骤如下:
  1. 分别将两个方向模板沿着图像从一个像素移动到另一像素,并将像素的中心与某个像素位置相重合;
  2. 将模板内的系数与其图像上相对应的像素值相乘;
  3. 将所有相乘的值相加;
  4. 将两个卷积的最大值赋给图像中对应模板中心位置的像素作为该像素新的灰度值;
  5. 选取合适的阈值TH,若新像素灰度值≥TH,则判断该像素点为图像边缘点。

在此,贴出参考代码(仅作参考),若有误,请多多指出。

参考代码

OpenCV-Python版Sobel
[python] view plain copy print ?
  1. #coding=utf-8    
  2. import cv2    
  3. import numpy as np      
  4.     
  5. img = cv2.imread("test.jpg"0)    
  6.     
  7. x = cv2.Sobel(img,cv2.CV_16S,1,0)    
  8. y = cv2.Sobel(img,cv2.CV_16S,0,1)    
  9.     
  10. absX = cv2.convertScaleAbs(x)     
  11. absY = cv2.convertScaleAbs(y)    
  12.     
  13. dst = cv2.addWeighted(absX,0.5,absY,0.5,0)  
  14.   
  15. cv2.imshow("Orig",img)    
  16. cv2.imshow("absX", absX)    
  17. cv2.imshow("absY", absY)    
  18.     
  19. cv2.imshow("Result", dst)    
  20.     
  21. cv2.waitKey(0)    
  22. cv2.destroyAllWindows()   
#coding=utf-8  
import cv2  
import numpy as np    
  
img = cv2.imread("test.jpg", 0)  
  
x = cv2.Sobel(img,cv2.CV_16S,1,0)  
y = cv2.Sobel(img,cv2.CV_16S,0,1)  
  
absX = cv2.convertScaleAbs(x)   
absY = cv2.convertScaleAbs(y)  
  
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)

cv2.imshow("Orig",img)  
cv2.imshow("absX", absX)  
cv2.imshow("absY", absY)  
  
cv2.imshow("Result", dst)  
  
cv2.waitKey(0)  
cv2.destroyAllWindows() 
输出测试结果

原始图像


经Sobel算子的水平轴上处理后图像边缘检测,如下所示:


经Sobel算子的垂直轴上处理后图像边缘检测如下所示:


经Sobel算子的水平轴和垂直轴处理后图像边缘检测,如下图所示:

在博文【特征提取】差分近似图像导数算子之Laplace算子 , 介绍了Laplace算子相关原理,在此时,给出测试输出结果与本节介绍Sobel算子的提取图像边缘直观比较。经Laplace算子处理后图像边缘检测,如下图所示:


补充

扩展链接

(2013年11月7日补充)

[1] 博文  Phone Vision14 -Sobel Operators .

[2] 博文Sobel Edge.

[3] Feature Detectors-Sobel Edge Detectors.

参考文献

[1]  Heath,M.D.,Sarker,S.,Sanocki,T. and Bowyer,K.W."A Robust Visual Method fo Assessing the Relative Performance of Edge Detection Algorithms", IEEE Trans. PAMI,19(12),pp.1338-1359,1997.

[2] I.E. Sobel, "Camera Models and Machine Perception",PhD thesis,Stanford Univ.1970.

[3] Pascal's Triangle  From Wikipedia, the free encyclopedia.

原文地址:http://blog.csdn.net/songzitea/article/details/14108503



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值