暗涌 杨丞琳简谱:Sobel算子

来源:百度文库 编辑:偶看新闻 时间:2024/05/03 02:14:18
索贝尔算子(Sobel operator)是图像处理中的算子之一,主要用作边缘检测。在技术上,它是一离散性差分算子,用来运算图像亮度函数的梯度之近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或是其法矢量
核心公式
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像,其公式如下:

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

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

在以上例子中,如果以上的角度Θ等于零,即代表图像该处拥有纵向边缘,左方较右方暗。
其他介绍
在边沿检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边沿的 ;另一个是检测垂直平边沿的 。与 和 相比,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{
lP1+=Histogram*i;
lS1+=Histogram;
}
iMean1Gray=lP1/lS1;
for(i=iThreshold;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];
Robert算子
Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内 产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。
.NET代码如下:
private void menuItem23_Click(object sender, System.EventArgs e)
{
if(this.pictureBox1.Image!=null)
{
this.pictureBox2.Visible=true;
int height=this.pictureBox1.Image.Height;
int width=this.pictureBox1.Image.Width;
Bitmap temp=new Bitmap(width,height);
Bitmap process=(Bitmap)this.pictureBox1.Image;
int i,j,p0,p1,p2,p3;
Color [] pixel=new Color[4];
int result;
for(j=height-2;j>0;j--)
{
for(i=0;i{
pixel[0]=process.GetPixel(i,j);
pixel[1]=process.GetPixel(i,j+1);
pixel[2]=process.GetPixel(i+1,j);
pixel[3]=process.GetPixel(i+1,j+1);
p0=(int)(0.3*pixel[0].R+0.59*pixel[0].G+0.11*pixel[0].B);
p1=(int)(0.3*pixel[1].R+0.59*pixel[1].G+0.11*pixel[1].B);
p2=(int)(0.3*pixel[2].R+0.59*pixel[2].G+0.11*pixel[2].B);
p3=(int)(0.3*pixel[3].R+0.59*pixel[3].G+0.11*pixel[3].B);
result=(int)Math.Sqrt((p0-p3)*(p0-p3)+(p1-p2)*(p1-p2));
if (result>255)
result=255;
if (result<0)
result=0;
temp.SetPixel(i,j,Color.FromArgb(result,result,result));
}
}
this.pictureBox2.Image=temp;
}
}
图像边缘检测
物体的边缘是以图像局部特性的不连续性的形式出现的,例如,灰度值的突变,颜色的突变,纹理结构的突变等。从本质上说,边缘就意味着一个区域的终结和另外一个区域的开始。图像边缘信息在图像分析和人的视觉中十分重要,是图像识别中提取图像特征的一个重要属性。
图像的边缘有方向和幅度两个特性。通常,沿边缘走向的像素变化平缓,而垂直于边缘走向的像素变化剧烈。这种变化可能呈现阶跃型、房顶型和凸缘型,如图6-1所示。这些变化分别对应景物中不同的物理状态。例如,阶跃型变化常常对应目标的深度或者是反射边界,而后两者则常常反映表面法线方向的不连续。实际要分析的图像往往是比较复杂的,灰度变化不一定是上述的标准形式。例如;灰度的变化不是突变而是在一个空间范围内的渐变。而且,在实际工程中获得的图像难免要混有噪声。

第112页
[BW,thresh] =edge(I,'sobel'…)
更详细的使用语法可以在MATLAB命令窗口巾键入“helpedge.m"获得帮助。
接下来,将在对常用的一些边缘检测算法进行分析的基础上介绍几种新的边缘检测方法。
1.简单边缘检测算于
由于边缘的灰度不连续性,可以使用求导数的方法检测到,最早的边缘检测方法都是基于像素的数值导数的运算。下面将介绍两种简单的算子:梯度算子和拉普拉斯算子。
2.梯度算子
梯度是图像处理中最常用的一次微分方法。下面先介绍一下梯度运算:

可见图像在该像素点的梯度值与临近像素灰度级的差分成正比,因此在图像变化缓慢区域值很小而在线条轮廓等变化快的地方值却很大。可见通过图像梯度运算能灵敏地检测出中界线,而克服导数运算的方向性。在MATLAB6.x图像处理工具箱中,常使用基于对角方向相邻像素梯度的Robert算子和采用先加权平均然后微分的Sobel算子。其中由于Sobel算子是滤波算子的形式,用于提取边缘可以利用快速卷积函数,简单有效,所以使用很广泛。

由图可以看出,利用6-2Robert算子提取的边缘较粗,因此边缘定位不是很准确。相对来说,Sobel算子定位比较准确。