图像边缘Word文件下载.docx
《图像边缘Word文件下载.docx》由会员分享,可在线阅读,更多相关《图像边缘Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
而屋顶状边缘位于灰度增加与减少的交界处。
在数学上可利用灰度的导数来刻画边缘点的变化,对阶跃边缘、屋顶状边缘分别求其一阶、二阶导数。
对一个边缘来说,有可能同时具有阶跃和线条边缘特性.例如在一个表面上,由一个平面变化到法线方向不同的另一个平面就会产生阶跃边缘;
如果这一表面具有镜面反射特性且两平面形成的棱角比较圆滑,则当棱角圆滑表面的法线经过镜面反射角时,由于镜面反射分量,在棱角圆滑表面上会产生明亮光条,这样的边缘看起来象在阶跃边缘上叠加了一个线条边缘.由于边缘可能与场景中物体的重要特征对应,所以它是很重要的图像特征。
比如,一个物体的轮廓通常产生阶跃边缘,因为物体的图像强度不同于背景的图像强度。
3.线性滤波边缘检测方法
经典的算子,它们都是计算一阶导数的边缘检测器。
其基本思想都是:
如果所求的一阶导数高于某一阈值,则确定该点为边缘点。
但是这样做会导致检测的边缘点太多。
一种更好的方法就是求梯度局部最大值对应的点,并认定它们是边缘点。
造成经典边缘算子不能准确判定边缘的存在及正确位置的原因在与:
1、实际的边缘灰度与理想的边缘灰度值间存在差异,这类算子可能检测出多个边缘;
2、边缘存在的尺度范围各不相同,这类算子固定的大小不利于检测出不同尺度上的所有边缘;
3、对噪声比较敏感。
为了解决这一问题,发展并产生了平滑滤波边缘检测方法,也就是边缘检测中理论最成熟的线性滤波方法,也称线性边缘检测算子。
在线性滤波边缘检测方法中,最具代表性的是Marr_Hildreth提出的LOG(LaplacianofGaussian,LoG)算法,canny最优算子及Mallat等提出的小波边缘检测方法。
本文主要利用LOG算法实现图像的边缘检测。
3.1LOG算法
利用图像强度二阶导数的零交叉点来求边缘点的算法对噪声十分敏感。
所以,希望在边缘增强前滤除噪声。
为此,Marr和Hildreth将高斯滤波和拉普拉斯边缘检测结合在一起,形成LOG(LaplacianofGaussian,LOG)算法,也有人称之为拉普拉斯高斯算法。
LOG算法理论是从生物视觉理论导出的方法。
其基本思想是:
首先在一定范围内做平滑滤波,然后利用差分算子检测在相应尺度上的边缘。
滤波器的选择取决于两个因素,一是要求滤波器在空间上平稳,空间位置误差
要小,二是要求平滑滤波器本身是带通滤波器,在其有限带通内是平稳的,即要求频域误差
要小。
由信号处理中的测不准原理知,
与
是矛盾的,达到测不准下限的滤波器是高斯滤波器。
Marr和Hildreth提出的差分算子是各向同性的拉普拉斯二阶差分算子。
LOG边缘检测器的基本特征是:
1、平滑滤波器是高斯滤波器;
2、增强步骤采用二阶导数(二维拉普拉斯函数);
3、边缘检测判据是二阶导数零交叉点并对应一阶导数的较大峰值。
这种方法的特点是图像首先与高斯滤波器进行卷积,这一步既平滑了图像又降低了噪声,孤立的噪声点和较小的结构组织将波滤除。
由于平滑会导致边缘的延展,因此边缘检测器只考虑那些具有局部梯度最大值的点为边缘点,这一点可以用二阶导数的零交叉点来实现。
拉普拉斯函数用作二维二阶导数的近似,是因为它是一种无方向算子。
为了避免检测出非显著边缘,应选择一阶导数大于某一阈值的零交叉点作为边缘点。
LOG算子的输出h(x,y)是通过卷积运算得到的:
(3-1)
根据卷积求导法有:
(3-2)
其中:
(3-3)
称之为墨西哥草帽算子。
如图2-1所示:
是对视网膜神经节感受野的空间组织的近似,可以看作由一个兴奋中心区和一个抑制性周边区组成,中心区宽度为
如图1(b)所示。
当σ取不同的值时,则可以用LOG算子检测不同尺度下图像的强度变化,小的滤波器(σ较小)用于检测细节,大的滤波器(σ较大)用于检测轮廓(模糊的边缘)。
通常,我们取σ≥1,并且以σ=1为最小的滤波器,此时W=22≈3,可用于检测非常精确的细节,但同时对噪声的抑制作用减弱,对于反差较小的区域也比较敏感。
事实上,边缘往往是在相邻像素之间产生,也就是说,最精确的细节应该在W≤2时产生。
此时,σ<
1,对原始影像的低通滤波
作用极小,几乎相当于直接对原始影像作拉普拉斯变换(高通滤波),只有在灰度变化比较明显(聚焦良好)的情况下,才能检测到零交叉,从而可以部份地避免检测反差较小的区域。
图3-1LOG算子
此外,由于实际处理的对象为数字图像,当σ=015时,LOG算子在r=1处达到负的极值,因此,σ的取值应大于015,否则,实际的卷积核已不能表示出LOG算子。
由以上分析知,下面两种方法在数学上是等价的:
1、求图像与高斯滤波器卷积,再求卷积的拉普拉斯变换;
2、求高斯滤波器的拉普拉斯变换,再求与图像的卷积。
如果采用第一种方法,就要用到高斯平滑滤波器。
直接实现LOG算法的典型模板见表3-1。
滤波(通常是平滑)、增强、检测这三个边缘检测步骤对使用LOG边缘检测仍然成立,其中平滑是用高斯滤波器来完成的;
增强是将边缘转换成零交叉点来实现的;
边缘检测则是通过检测零交叉点来进行的。
可以看到,零交叉点的斜率依赖于图像强度在穿过边缘时的变化对比度。
剩下的问题是把那些由不同尺度算子检测到的边缘组合起来。
在上述方法中,边缘是在特定的分辨下得到的.为了从图像中得到真正的边缘,有必要把那些通过不同尺度算子得到的信息组合起来。
-1
-2
16
表2-1典型拉普拉斯高斯模板
高斯平滑运算导致图像中边缘和其它尖锐不连续部分的模糊,其中模糊量取决于σ的值。
σ值越大,噪声滤波效果越好,但同时也丢失了重要的边缘信息,影响了边缘检测器的性能。
如果用小尺度的滤波器,又有可能平滑不完全而留有太多的的噪声。
大尺度滤波器在平滑相互邻近的两个边缘时,可能会将它们连在一起,这样只能检测出一个边缘。
因此,在不知道物体尺度和位置的情况下,很难准确确定滤波器的尺度。
3.2利用LOG算法实现图像边缘检测程序如下:
voidCImgProcess:
:
EdgeLoG(CImgProcess*pTo)
{
//应用模板到图像
Template(pTo,5,5,2,2,Template_Log,1);
//临时CImgProcess变量
CImgProcessimgTemp=*pTo;
//自动阈值化
imgTemp.AutoThreshold(pTo);
//第一次反色:
为边缘细化准备
pTo->
LinTran(&
imgTemp,-1,255);
//边缘细化
imgTemp.Thining();
//第二次反色:
得到最终结果
imgTemp.LinTran(pTo,-1,255);
}
其中细化的算法如下:
Thining()
intnHeight=GetHeight();
intnWidth=GetWidthPixel();
//四个条件
BOOLbCondition1;
BOOLbCondition2;
BOOLbCondition3;
BOOLbCondition4;
//5×
5相邻区域像素值
unsignedcharneighbour[5][5];
inti,j;
intm,n;
BOOLbModified=TRUE;
while(bModified)
{
bModified=FALSE;
CImgProcesspic=*this;
pic.InitPixels(255);
//清空目标图像
for(j=2;
j<
nHeight-2;
j++)
{
for(i=2;
i<
nWidth-2;
i++)
{
bCondition1=FALSE;
bCondition2=FALSE;
bCondition3=FALSE;
bCondition4=FALSE;
BYTEdata=GetGray(i,j);
if(data==255)
continue;
//获得当前点相邻的5×
5区域内像素值,白色用0代表,黑色用1代表
for(m=0;
m<
5;
m++)
{
for(n=0;
n<
n++)
{
neighbour[m][n]=(GetGray(i+n-2,j+m-2)==0);
}
}
//neighbour[][]
//逐个判断条件。
//判断2<
=NZ(P1)<
=6
intnCount=neighbour[1][1]+neighbour[1][2]+neighbour[1][3]\
+neighbour[2][1]+neighbour[2][3]+\
+neighbour[3][1]+neighbour[3][2]+neighbour[3][3];
if(nCount>
=2&
&
nCount<
=6)
bCondition1=TRUE;
//判断Z0(P1)=1
nCount=0;
if(neighbour[1][2]==0&
neighbour[1][1]==1)
nCount++;
if(neighbour[1][1]==0&
neighbour[2][1]==1)
if(neighbour[2][1]==0&
neighbour[3][1]==1)
if(neighbour[3][1]==0&
neighbour[3][2]==1)
if(neighbour[3][2]==0&
neighbour[3][3]==1)
if(neighbour[3][3]==0&
neighbour[2][3]==1)
if(neighbour[2][3]==0&
neighbour[1][3]==1)
if(neighbour[1][3]==0&
neighbour[1][2]==1)
if(nCount==1)
bCondition2=TRUE;
//判断P2*P4*P8=0orZ0(p2)!
=1
if(neighbour[1][2]*neighbour[2][1]*neighbour[2][3]==0)
bCondition3=TRUE;
else
nCount=0;
if(neighbour[0][2]==0&
neighbour[0][1]==1)
nCount++;
if(neighbour[0][1]==0&
if(neighbour[1][1]==0&
if(neighbour[2][1]==0&
neighbour[2][2]==1)
if(neighbour[2][2]==0&
if(neighbour[2][3]==0&
if(neighbour[1][3]==0&
neighbour[0][3]==1)
if(neighbour[0][3]==0&
neighbour[0][2]==1)
if(nCount!
=1)
bCondition3=TRUE;
//判断P2*P4*P6=0orZ0(p4)!
if(neighbour[1][2]*neighbour[2][1]*neighbour[3][2]==0)
bCondition4=TRUE;
neighbour[1][0]==1)
if(neighbour[1][0]==0&
neighbour[2][0]==1)
if(neighbour[2][0]==0&
neighbour[3][0]==1)
if(neighbour[3][0]==0&
if(neighbour[3][1]==0&
if(neighbour[3][2]==0&
if(neighbour[1][2]==0&
bCondition4=TRUE;
if(bCondition1&
bCondition2&
bCondition3&
bCondition4)
pic.SetPixel(i,j,RGB(255,255,255));
bModified=TRUE;
pic.SetPixel(i,j,RGB(0,0,0));
}//fori
}//forj
*this=pic;
}//while
效果图如下图3-2-2,3-2-1为原图。
3-2-1原图
3-2-2实现效果图
4.结束语
本文对边检检测技术进行研究,主要研究了LOG算子,并且利用LOG算法实现图像的边缘检测。
参考文献
[1]韦春桃程晓宇.LOG算子进行边缘检测的研究.桂林工学院学报,1999,19,No.2.
[2]甘金来.图像边缘检测算法的比较研究.2005.