sobel算子

更新时间:2024-05-27 09:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Sobel算子改进算法

通过以上对经典边缘检测算法的分析可知,Sobel算法的优点是计算简单,速

度快。但是由于只采用了2个方向的模板,只能检测水平和垂直方向的边缘,因此这种算法对于纹理较为复杂的图像,其边缘检测效果就不是很理想。该算法认为:凡灰度新值大于或等于阈值的像素点时都是边缘点。这种判断欠合理,会造成边缘点的误判,因为许多噪声点的灰度值也很大。由于图像的边缘有许多方向,除了水平方向和垂直方向外,还有其他的方向,下面将对Sobel算子进行改进,即将算子模板扩展到8个模板,如图3.1所示。

图3.1 8个方向模板

进过8个方向模板的计算,对某一幅图像进行逐点计算,并且去最大值为像素点的新灰度值,通过阈值的设定,判断边缘点。最大值对应的模板所表示的方向为该像素点的边缘方向。

Sobel改进算法的思想与步骤。

针对经典Sobel算子对边缘具有很强的方向性特点,设计了一种基于Sobel算子上改进的算法,其主要思想是先对图像进行全局阈值的分割处理,因为分割后的图像是二值图像,此时进行边缘提取,这就可以各个方向的边缘都可以检测到。但也可能会丢失原本直接用算子检测到的边缘。Sobel 算子的优点是方法简单、 处理速度快, 并且所得的边缘光滑, 其缺点是

边缘较粗, 得到的边缘象素往往是分小段连续, 由于处理时需作二值化处理, 故得到的边缘与阈值的选取有很大的关系, 并且边缘图中梯度幅值较小的边缘也丢失了。为克服这个缺陷,对 S( i, j)引入一个衰减因子 D, 用它去除计算的结果, 即:

S(i,j)?S002?S4502?...S3150D (3.1)

因此,用处理后的所得到图像与Sobel算子直接对原始图像进行边缘检测的图像相加,这一步显得尤为重要。最后分别对数字图像和红外图像进行MATLAB仿真,从仿真的结果可以看出,此算法具有较好的精度。

三次样条插值

Sobel 算子检测出像素级边缘后,为了得到亚像素级的边缘,要对灰度边缘图进行内插处理。插值算法有很多种,例如最近邻插值、双线性插值、三次样条插值等等。最近邻插值和双线性插值不如三次样条插值精度高。为了得到精度高的亚像素级边缘,本文采用三次样条插值法对灰度边缘图进行插值处理。下面先介绍三次样条插值函数的定义。

若函数S(x)满足:S(x)在每个子区间[xi-1, xi](i =1,2, …n)上是不高于三次的多项式,其中(a=x0

(1) S(x) ,S′(x) ,S″(x)在[a,b]上连续。 (3.1)

(2) 满足插值条件S(xi) =f(xi) (i =0,1, …,n) ,则称S(x)为函数f(x)关于节点x0,x1,…,xn的三次样条插值函数。

在图像插值处理中,经常使用的三次样条插值函数S(ω)的数学表达式为

?1??2??3,??1?23S(?)??4?8??5???,1???2 (3.3) ??0,??2??这里,三次多项式S(ω)是对理论上的最佳插值函数sinc(ω)的逼近。

具体的做法是考虑一个浮点坐标(i +μ,j +v)周围的十六个邻点,目的像素c的值

f(i ??,j ?v)可通过如下的插值公式得到:

f(i ??,j ?v)?ABC (3.4)

其中:

A???S(1?u)S(u)S(1?u)S(2?u)?? (3.5)

?f(i?1,j?1)?f(i,j?1)B???f(i?1,j?1)??f(i?2,j?1)?S(1?v)??S(v)?? (3.6) C???S(1?v)???S(2?v)??f(i?1,j)f(i?1,j?1)f(i?1,j?2)?f(i,j)f(i,j?1)f(i,j?2)?? (3.7) f(i?1,j)f(i?1,j?1)f(i?1,j?2)??f(i?2,j)f(i?2,j?1)f(i?2,j?2)?最大类间方差法(Ostu)

对上述插值得到的图像进行二值化,从而得到边缘信息,其中阈值的选择是关键。这里采用最大类间方差法(也叫Otsu法)自动确定阈值。该方法具有简单,处理速度快的特,是一种常用的阈值选取方法。其基本思想如下:设图像像素数为N,灰度范围为[0,L?1],对应灰度级i 的像素数为Ni 几率为;

pi?ni/N,i?0,1,2...L?1 (3.8)

?pi?0L?1i?1 (3.9)

把图像中的像素按灰度值用阈值T分成两类 C0和C1,C0由灰度值在[0,T]之间的像素组成,C1由灰度值在[T+1,L-1]之间的像素组成,对于灰度分布几率,整幅图像的均值为;

uT=?iPii=0L-1 (3.10)

则C0和C1的均值为

u0=?iPi/?0i=0Tu1=?iPi/?1i=T+1L-1

(3.11)

其中

?0=?Pii=0T?1=?Pi=1-?0i=T+1L-1 (3.12)

由上面式子可得:

uT=?0u0+?1u1 类间方差的定义为:

22?B2=?((0u0-uT)+?1u1-uT)22=?(0u0-uT)+uT(?0+?1)-2(?0u0+?1u1)uT=?0u02+?1u12-uT2=?0u0+?u-(?0u0+?1u1)=?0?1(u0-u1)222112

=?0u02(1-?0)+?1u12(1-?1)-2?0?1u0u12让T在[0,L-1]范围内依次取值,使?B最大的T值为Otso法的最佳阈值。

Matlab中的graythresh函数求取阈值采用的就是Otso法

算法实现

由于经典Sobel 算子只有检测水平和垂直两个方向的3×3邻域模板,而实际图像边缘的方向会有8个方向。因此在Sobel 算子的基础上定义了8个方向模板,使模板表示的方向为图像的实际边缘方向。

在边缘检测时,将这8个模板分别与被检测图像中的3×3邻域进行卷积,取模板卷积结果中的最大值作为梯度幅度值,得到灰度边缘图G。但是这样检测出的边缘仍然较粗,为了能够得到较细的边缘,我们引入衰减因子D对计算的结果进行处理。因此最后得到的梯度幅度值为原来的1/ D,从而保留了较小的梯度幅度值,得到了不失真的灰度边缘图G′。

Sobel 算子检测出像素级边缘后,为了得到亚像素级的边缘,要对灰度边缘图进行内插处理。为了得到精度高的亚像素级边缘,本文采用三次样条插值法对灰度边缘图进行插值处理。

插值后的灰度边缘图已经达到亚像素级,为了得到最后的二值边缘图,要对灰度边缘图进行阈值分割。在众多的阈值化分割算法中,最大类间方差法是性能评估最好的方法之一, Matlab中的graythresh函数来Matlab实现边缘检测。

实验结果

图3.4 lena原灰度图

图3.5改进sobel算子提取的像素

图3.7 插值后灰度边缘图

图3.6 衰减后灰度边缘图

图3.8 亚像素级边缘提取图(放大4

图3.9 原始灰度图 3.10 sobel算子的检测结果

图3.11基于灰度矩的亚像素边缘检测结果图

实验结果分析

上面是对120?120的lena图像分别进行像素级和亚像素级边缘检测的结果,如图3.5到3.8的所示的图,图3.5是采用经典sobel算子的像素级边缘检测结果,可以看出,采用Sobel 较难检测出有效的边缘。利用本文章法,图3.6是经sobel算子检测后引入衰减因子的灰度图像的边缘这里衰减因子取4,已检测出有效边缘:图3.7是图3.6灰度边缘图经三次样条插值后所得的图像,插值后灰度边缘图像图放大倍数4倍,可以看出插值后图像变得更加平滑,图3.7为图3.8的亚像素边缘提取图,可以看出亚像素边缘更清晰,定位精度更高,优于传统的边缘检测方法。

本章小结

本文设计了一种Sobel算子和三次样条插值结合起来的得到亚像素级边缘检测的方法,先用Sobel算子粗定位边缘,再用三次插值样条法对边缘图进行插值处理,获得

亚像素级边缘,最后利用最大类间方差法判断出边缘点,得到二值化的边缘图像。实验结果表明,该方法能精确定位目标边缘,优于传统方法的边缘检测方法,,有利于图像高精度测量和匹配的后续处理。

本文来源:https://www.bwwdw.com/article/dhg7.html

Top