Sobel算子

Posted tiemaxiaosu

tags:

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

一、Sobel算子基本原理

Sobel算子是一阶导数的边缘检测算子,在算法实现过程中,通过3×3模板作为核与图像中的每个像素点做卷积和算

,然后选取合适的阈值以提取边缘。采用3×3邻域可以避免在像素之间内插点上计算梯度。Sobel算子也是一种梯度幅值,即:其中的偏导数Sx 和Sy可用卷积模板来实现。


Sx=(Z1+2Z2+Z3)-(Z7+2Z8+Z9)

Sy=(Z1+2Z4+Z7)-(Z3+2Z6+Z9)

二、Sobel作用

索贝尔算子Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。

Sobel算子算法的优点是计算简单,速度快。但是由于只采用了2个方向的模板,只能检测水平和垂直方向的边缘,因此这种算法对于纹理较为复杂的图像,其边缘检测效果就不是很理想。该算法认为:凡灰度新值大于或等于阈值的像素点时都是边缘点。这种判断欠合理,会造成边缘点的误判,因为许多噪声点的灰度值也很大

三、Sobel函数

void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, 
               int aperture_size=3 );
参数说明:
src   输入图像. 

dst        输出图像.

xorder   x 方向上的差分阶数

yorder   y 方向上的差分阶数

aperture_size    扩展 Sobel 核的大小,必须是 1, 3, 5 或 7。 除了尺寸为 1, 其它情况下,

                          aperture_size ×aperture_size 可分离内核将用来计算差分。对 aperture_size=1的情况,使用 3x1

                          或 1x3 内核 (不进行高斯平滑操作)。这里有一个特殊变量 CV_SCHARR (=-1),对应 3x3

                          Scharr 滤波器,可以给出比 3x3 Sobel 滤波更精确的结果。Scharr 滤波器系数是:

 

对 x-方向以及转置矩阵对 y-方向。

函数 cvSobel 通过对图像用相应的内核进行卷积操作来计算图像差分:

由于Sobel 算子结合了 Gaussian 平滑和微分,所以,其结果或多或少对噪声有一定的鲁棒性。通常情况,函数调用采用如下参数 (xorder=1, yorder=0, aperture_size=3) 或 (xorder=0, yorder=1, aperture_size=3) 来计算一阶 x- 或 y- 方向的图像差分。第一种情况对应:

核。

第二种对应:

或者

核的选则依赖于图像原点的定义 (origin 来自 IplImage 结构的定义)。由于该函数不进行图像尺度变换,所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即象素的深度)。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。当然可以用函数 cvConvertScale 或 cvConvertScaleAbs 转换为 8 位的。除了 8-比特 图像,函数也接受 32-位 浮点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。

 

 

 

 

 

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

sobel算子里的阈值是怎么设的

OpenCV中不用库函数实现sobel算子

OpenCV 边缘检测之Sobel算子

Sobel & 各向同性Sobel(Isotropic Sobel)算子

图像边缘检测:Canny算子、Prewitt算子和sobel算子

边缘检测sobel算子