请输入您要查询的百科知识:

 

词条 Sobel算子
释义

概述

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

核心公式

该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:

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

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

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

相关介绍

在边沿检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边沿的 ;另一个是检测垂直平边沿的 。与Prewitt算子相比,Sobel算子对于象素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。

Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的 ,另一个是检测垂直边沿的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。

由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数, 简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。 在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。

.NET代码如下

for(Times=0;Times<128&&iThreshold!=iNewThreshold;Times++)

{

iThreshold=iNewThreshold;

lP1=0;

lP2=0;

lS1=0;

lS2=0;

for(i=iMinGray;i<iThreshold;i++)

{

lP1+=Histogram*i;

lS1+=Histogram;

}

iMean1Gray=lP1/lS1;

for(i=iThreshold;i<iMaxGray;i++)

{

lP2+=Histogram*i;

lS2+=Histogram;

}

iMean2Gray=lP2/lS2;

iNewThreshold=(iMean1Gray+iMean2Gray)/2;

}

补充Sobel算子的矩阵表达式:

Sobel1=[-1 -2 -1; %检测水平边沿的Sobel算子

0 0 0;

1 2 1];

Sobel2=[1 0 -1; %检测垂直平边沿的Sobel算子

2 0 -2;

1 0 -1];

Sobel算法实现(C语言)

1 void MySobel(IplImage* gray, IplImage* gradient)

2 {

3 /* Sobel template

4 a00 a01 a02

5 a10 a11 a12

6 a20 a21 a22

7 */

8

9 unsigned char a00, a01, a02, a20, a21, a22;

10 unsigned char a10, a11, a12;

11

12 for (int i=1; i<gray->height-1; ++i)

13 {

14 for (int j=1; j<gray->width-1; ++j)

15 {

16 CvScalar color = cvGet2D(gray, i, j);

17

18 a00 = cvGet2D(gray, i-1, j-1).val[0];

19 a01 = cvGet2D(gray, i-1, j).val[0];

20 a02 = cvGet2D(gray, i-1, j+1).val[0];

21

22 a10 = cvGet2D(gray, i, j-1).val[0];

23 a11 = cvGet2D(gray, i, j).val[0];

24 a12 = cvGet2D(gray, i, j+1).val[0];

25

26 a20 = cvGet2D(gray, i+1, j-1).val[0];

27 a21 = cvGet2D(gray, i+1, j).val[0];

28 a22 = cvGet2D(gray, i+1, j+1).val[0];

29

30 // x方向上的近似导数

31 double ux = a20 * (1) + a21 * (2) + a22 * (1)

32 + (a00 * (-1) + a01 * (-2) + a02 * (-1));

33

34 // y方向上的近似导数

35 double uy = a02 * (1) + a12 * (2) + a22 * (1)

36 + a00 * (-1) + a10 * (-2) + a20 * (-1);

37

38 color.val[0] = ux;

39

40 cvSet2D(gradient, i, j, color);

41 }

42 }

43 }

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2025/2/26 19:44:08