Matlab图像锐化处理及边缘检测.docx
- 文档编号:7112847
- 上传时间:2023-01-18
- 格式:DOCX
- 页数:47
- 大小:405.52KB
Matlab图像锐化处理及边缘检测.docx
《Matlab图像锐化处理及边缘检测.docx》由会员分享,可在线阅读,更多相关《Matlab图像锐化处理及边缘检测.docx(47页珍藏版)》请在冰豆网上搜索。
Matlab图像锐化处理及边缘检测图像锐化处理及边缘检测Matlab图像锐化处理及边缘检测本章要点:
图像边缘锐化的基本方法微分运算梯度锐化边缘检测61图像边缘锐化的基本方法物体的边缘是以图像局部特性不连续性的形式出现。
本质上边缘常意味着一个区域的终结和另一个区域的开始。
图像边缘信息在图像分析和人的视觉中都是十分重要的,是图像识别中提取图像特征的一个重要特性。
图像的边缘有方向和幅度两个特性。
通常,延边缘走向的像素变化平缓,而垂直于边缘走向的像素变化剧烈。
边缘的描述包含以下几个方面:
(1)边缘点它两边像素的灰度值有显著的不同。
边缘点也存在于这样一对邻点之间即一个在较亮的区域内部,另一个在外部。
(2)边缘法线方向在某点灰度变化最剧烈的方向,与边缘方向垂直。
(3)边缘方向与边缘法线方向垂直,是目标边界的切线方向。
(4)边缘位置边缘所在的坐标位置。
(5)边缘强度沿边缘法线方向图像局部的变化强度的量度。
粗略地区分边缘种类可以有两种,其一是阶跃状边缘,它两边像素的灰度值有显著的不同,其二是屋顶状边缘,它位于灰度值从增加到减少的变化转折点。
这些变化分别对应景物中不同的物理状态。
边缘是图像上灰度变化比较剧烈的地方,如果一个像素落在图像中某一个物体的边界上,那么它的邻域将成为一个灰度级的变化带。
对这种变化最有用的两个特征是灰度的变化率和方向,在灰度变化突变处进行微分,将产生高值。
经典的边缘提取方法是考虑图像的每个像素在某个领域内的变化,利用边缘邻近一阶或二阶方向导数变化规律,来检测边缘。
图像灰度值的显著变化可以用一阶差分替代一阶微分的梯度来表示,它们分别以梯度向量的幅度和方向来表示。
因此图像中陡峭边缘的梯度值将是很大的;那些灰度变化平缓的地方,梯度值是比较小的;而那些灰度值相同的地方,梯度值将为零。
图像经过梯度运算能灵敏地检测出边界线,这种微分边缘检测算子运算简单易行,但有方向性。
利用计算机进行图像锐化处理有两个目的,一是与柔化处理相反,增强图像边缘,使模糊的图像变得更加清晰起来,颜色变得鲜明突出,图像的质量有所改善,产生更适合人观察和识别的图像,本章的梯度锐化就是介绍这方面的内容。
二是希望经过锐化处理后,目标物体的边缘鲜明,以便于计算机提取目标物体的边界、对图像进行分割、目标区域识别、区域形状提取等,为图像理解和分析打下基础,目前它已成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位,本章的边缘检测算子就是介绍这方面的内容。
与图像平滑处理相对应,图像锐化也可以分为空间域图像锐化法和空间频率域图像锐化法两大类型。
空间频率域图像锐化的方法将在第九章介绍,本章介绍边缘增强及边缘检测的方法,基于空间域处理,为分割及目标物体特征提取打下基础。
6.2微分运算边缘是由相邻域灰度级不同像素点构成的,若想增强边缘,就应该突出相邻点间灰度级的变化。
如下图所示,不难发现原图中左边暗,右边亮,中间存在着一条明显的边界。
001255255255255111254253254254000255255253253110254254254254注意:
由于计算机显示屏幕的坐标原点在视窗的左上角,显示屏幕的坐标系如图6-1所示。
(0,0)xf(x,y)y图6-1显示屏幕的坐标系为了与f(x,y)表示法相一致,图像f(i,j)中的i代表列,j代表行。
如果用右列减去左列,即每一个像素的值为:
G(i,j)=f(i,j)-f(i-1,j)结果如下:
0125400000253-110002550-200-1254000可以看出,第3列比其他列的灰度值高很多,在边界附近,灰度值有明显的跳变,人眼观察时,就能发现一条很明显的亮边;在灰度相近的区域内,这么做的结果使得该点的灰度值接近于0,区域都很暗。
这样,G(i,j)=f(i,j)-f(i-1,j)就起到了垂直边沿检测的作用。
如对于上面那幅图像转置,得到如下图像数据:
010101011100255254255254255253255254255254253254255254253254该边缘是水平方向的,这时如果还用左列减去右列就得不到边界数据,必须是下一行减去上一行,即每一个像素的值为:
G(i,j)=-f(i,j-1)+f(i,j),图像上得到一条很明显的亮边。
这就是一种边沿检测器,它在数学上的涵义是一种基于梯度的滤波器,又称边沿算子,梯度是有方向的,和边沿的方向总是正交(垂直)的。
图像灰度的变化情况可以用灰度分布的梯度来反映。
图像处理中最常用的微分方法是求梯度。
对于图像f(i,j),它在点(i,j)处的梯度是一个矢量,定义为:
(6-1)其方向导数在边缘法线方向上取得局部最大值。
怎样求f(i,j)梯度的局部最大值和方向呢?
我们知道f(i,j)沿方向r的梯度为:
(6-2)的最大值条件是=0即:
=0(6-3)梯度是向量,各向同性。
梯度方向对应于f(i,j)最大变化率方向上,即梯度最大值G=(6-4)为了减少计算量而用G=(6-5)梯度幅度比例于邻像素的灰度级,在灰度陡变区域,梯度值大,在灰度相似区,梯度值小,在灰度级为常数区,梯度为零。
因此,微分运算应用在图像上,可使图像的轮廓清晰。
本节介绍的微分运算有:
纵向微分运算;横向微分运算;双方向一次微分运算。
6.2.1纵向微分运算1理论基础对灰度图像在纵方向进行微分实现了将图像向左平移一个像素,再用原图像减去平移后图像。
相减的结果反映了原图像亮度变化率的大小。
原图像中像素值保持不变的区域,相减的结果为零,即像素为黑;原图像中像素灰度值变化剧烈的区域,相减后得到较大的变化率,对应的像素很亮,而且像素灰度值差别越大,则得到的像素就越亮,所以图像的垂直边缘得到增强。
本程序对灰度图像f在纵方向或横方向进行微分,在数字处理中,微分用差分表近似,并按下式求得:
G(i,j)=f(i,j)-f(i-1,j-1)(6-6)该算法用如下卷积核:
2实现步骤
(1)取得原图的数据区指针。
(2)开辟一块内存缓冲区,并初始化为255。
(3)每个像素依次循环,新图像缓冲区中的当前像素的灰度值等于原图中当前像素的灰度值与其左方的像素的灰度值之差的绝对值。
(4)将缓冲区中的图像复制回原图数据区。
3程序代码/*函数名称:
ZongXiang()*函数类型:
void*功能:
对图像进行纵向微分*/voidWeiFenDib:
ZongXiang()LPBYTEp_data;/原图数据区指针intwide,height;/原图长、宽p_data=this-GetData();wide=this-GetWidth();height=this-GetHeight();LPBYTEtemp=newBYTEwide*height;/开辟图像一缓冲区memset(temp,255,wide*height);for(intj=1;jheight-1;j+)for(inti=1;iGetData();wide=this-GetWidth();height=this-GetHeight();LPBYTEtemp=newBYTEwide*height;/开辟图像一缓冲区memset(temp,255,wide*height);for(intj=1;jheight-1;j+)for(inti=1;iGetData();wide=this-GetWidth();height=this-GetHeight();LPBYTEtemp=newBYTEwide*height;/开辟图像一缓冲区memset(temp,255,wide*height);for(intj=1;jheight-1;j+)for(inti=1;iGetData();wide=this-GetWidth();height=this-GetHeight();LPBYTEp_temp=newBYTEwide*height;/开辟图像一缓冲区memset(p_temp,255,wide*height);/初始化为255inttemp;for(intj=1;jheight-1;j+)for(inti=1;i=30)if(temp+100)255)p_tempwide*j+i=255;elsep_tempwide*j+i=temp+100;if(tempGetData();wide=this-GetWidth();height=this-GetHeight();LPBYTEp_temp=newBYTEwide*height;/开辟图像一缓冲区memset(p_temp,255,wide*height);/初始化为255inttemp;for(intj=1;jheight-1;j+)for(inti=1;i30)p_tempwide*j+i=255;elsep_tempwide*j+i=p_datawide*j+i;/将缓冲区中的图像复制回原图数据区memcpy(p_data,p_temp,wide*height);/删除缓冲区deletep_temp;4效果对比图(a)原图(b)给边缘规定一个特定的灰度级图6-6给边缘规定一个特定的灰度级6.3.4给背景规定灰度级Gf(i,j);Gf(i,j)Tg(i,j)=Lb;其它(6-14)Lb为一对背景指定的灰度值。
这种处理的原理和上一节介绍的给边缘规定一个特定的灰度级的原理是一样的,只不过这种处理将图像的背景灰度值统一化了,因此在这里不重复介绍了。
6.3.5根据梯度二值化图像1理论基础对阶跃边缘,在边缘点其一阶导数取极值。
由此,我们对数字图像f(i,j)的每个像素取它的梯度值G(i,j),适当取门限T作如下判断:
若G(i,j)T则(i,j)点为阶跃状边缘点,G(i,j)称为梯度算子的边缘图像。
La;Gf(i,j)Tg(i,j)=Lb;其它(6-15)La和Lb的意义同上。
梯度是向量,各向同性。
梯度方向对应于F(i,j)最大变化率方向上,即Q=arctan/(6-16)梯度幅度比例于邻像素的灰度级,在灰度陡变区域,梯度值大,在灰度相似区,梯度值小,在灰度级为常数区,梯度为零。
这样处理可以使图像锐化的结果更加清晰,把图像中我们关心的部分突出出来,去除了我们不感兴趣的部分。
2实现步骤
(1)获得原图像的首地址,及图像的高和宽;
(2)开辟一块内存缓冲区,并初始化为255;(3)计算图像的像素的梯度;(4)将结果保存在内存缓冲区比较像素的梯度是否大于30,是则将灰度值置为255,否则将该像素的灰度值置位0;(5)将内存中的数据复制到原图像的数据区。
3.编程代码/*函数名称:
Erzhirihua()*函数类型:
void*功能:
根据梯度二值化图像。
*/voidTiDuRuiHuaDib:
Erzhirihua()LPBYTEp_data;/原图数据区指针intwide,height;/原图长、宽p_data=this-GetData();wide=this-GetWidth();height=this-GetHeight();LPBYTEp_temp=newBYTEwide*height;/开辟图像一缓冲区memset(p_temp,255,wide*height);/初始化为255inttemp;for(intj=1;jheight-1;j+)for(inti=1;i30)p_tempwide*j+i=255;elsep_tempwide*j+i=0;/将缓冲区中的图像复制回原图数据区memcpy(p_data,p_temp,wide*height);/删除缓冲区deletep_temp;4处理效果图(a)原图(b)根据梯度二值化效果图图6-7根据梯度二值化6.4边缘检测图像边缘对图像识别和计算机分析十分有用。
边缘能勾划出目标物体,使观察者一目了然;边缘蕴含了丰富的内在信息(如方向,阶跃性质、形状等),是图像识别中抽取图像特征的重要属性。
从本质上说,图像边缘是图像局部特性不连续性(灰度突变、颜色突变等)的反映,它标志着一个区域的终结和另一个区域的开始。
边缘提取首先检出图像局部特性的不连续性,然后在将这些不连续的边缘像素连成完备的边界。
边缘的特性是沿边缘走向的像素变化平缓,而垂直与边缘方向的像素变化剧烈。
所以,从这个意义上说,提取边缘的算法就是检出符合边缘特性的边缘像素的数学算子。
边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,通常也包括方向的确定。
有若干种方法可以使用,其中大多数是基于方向导数模板求卷积的方法。
边缘模板用于沿着不同的方向检测边缘的四个模板。
如下给出了大小为33的边缘模板,它们能够在0、45、90和135四个方向上检测边缘,将所有的边缘模板逐一作用于图像中的每一个像素,产生最大输出值的边缘模板为候选模板,其方向表示了该点处边缘的方向,如果所有方向上的边缘模板接近于零,则在该像素点处没有边缘;如果所有方向上的边缘模板输出值都近似相等,则该像素点处没有可靠的边缘方向。
(a)0模板(b)90模板(c)45模板(d)135模板对于灰度图像f,对以像素f(i,j)为中心的33区域施加不同的33加权屏蔽窗口,每个33窗口称为算子,是一个33的整数矩阵,处理时用卷积的方法,即将算子覆盖的区域按相应位置的像素值乘以算子中相应的系数再相加,其结果即为此窗口的相关值,求最大值作为中心点像素的灰度值。
由于我们常常无法事先确定轮廓的取向,因而挑选用于轮廓增强的微分算子时,必须选择那些不具备空间方向性的和具有旋转不变的线形微分算子。
最基本的一类边缘检测算子是微分算子类。
包括:
梯度算子,Robert梯度算子、Sobel算子、Prewitt边缘检测算子、Krisch边缘检测算子、Laplacian算子等。
除了Laplacian算子,其他的算子基于的是一阶方向导数在边缘处取最大值这一变化规律。
Robert采用的是对角方向相邻的两个像素之差。
从图像处理的实际效果来看,用Robert梯度检测边缘较好。
Sobel算子有一定噪声抑制能力,在检测阶跃边缘时得到的边缘宽度至少为二像素,它不依赖于边缘方向的二阶微分算子,是一个标量而不是向量,具有旋转不变即各向同性的性质,在图像处理中经常被用来提取图像的边缘。
Laplacian算子基于的是二阶导数的零交叉。
微分算子类边缘检测方法的效果类似于空间域的高通滤波,有增强高频分量的作用。
因而,这类算子对噪声是敏感的。
对于有噪声的图像,LoG算子对图像先进行高斯滤波,然后应用Laplacian算子来提高边缘提取的能力。
当然也可以不先滤除噪声,而是对处理的结果进行统计检测来获得边缘。
本节介绍的算子有:
Roberts边缘检测算子;Sobel边缘检测算子;Prewitt边缘检测算子;Krisch边缘检测;LoG_Laplacian高斯-拉普拉斯算子。
6.4.1Roberts边缘检测算子1理论基础Roberts边缘算子采用的是对角方向相邻的两个像素之差。
从图像处理的实际效果来看,边缘定位准,对噪声敏感。
Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,它由下式给出:
Roberts算子:
Gi,j=|fi,j-fi+1,j+1|+|fi+1,j-fi,j+1|;(6-17)Gi,j=(fi,j-fi+1,j+1)2+(fi+1,j-fi,j+1)21/2;(6-18)其中Gi,j表示处理后(i,j)点的灰度值,fi,j表示处理前该点的灰度值。
其中f(i,j)是具有整数像素坐标的输入图像,平方根运算使该处理类似于在人类视觉系统中发生的过程。
该算法的算子如下:
2实现步骤
(1)取得原图的数据区指针。
(2)开辟一个和原图相同大小的图像缓冲区,并设定新图像初值为全白(255)。
(3)每个像素依次循环,用Roberts边缘检测算子分别计算图像中各点灰度值,对它们平方之和,再开方。
(4)将缓冲区中的数据复制到原图数据区。
3编程实现/*函数名称:
Robert()*函数类型:
void*功能:
用罗伯特算子对图像进行边缘检测。
*/voidBianYuanJianCeDib:
Robert()LPBYTEp_data;/原图数据区指针intwide,height;/原图长、宽inti,j;/循环变量intpixel4;/Robert算子p_data=this-GetData();wide=this-GetWidth();height=this-GetHeight();LPBYTEtemp=newBYTEwide*height;/新图像缓冲区/设定新图像初值为255memset(temp,255,wide*height);/由于使用2*2的模板,为防止越界,所以不处理最下边和最右边的两列像素for(j=0;jheight-1;j+)for(i=0;iwide-1;i+)/生成Robert算子pixel0=p_dataj*wide+i;pixel1=p_dataj*wide+i+1;pixel2=p_data(j+1)*wide+i;pixel3=p_data(j+1)*wide+i+1;/处理当前像素tempj*wide+i=(int)sqrt(pixel0-pixel3)*(pixel0-pixel3)+(pixel1-pixel2)*(pixel1-pixel2);/将缓冲区中的数据复制到原图数据区memcpy(p_data,temp,wide*height);/删除缓冲区deletetemp;4效果对比图图6-8Roberts边缘检测效果图6.4.2Sobel边缘检测算子1理论基础
(1)卷积卷积可以简单的看成加权求和的过程。
卷积时使用的权用一个很小的矩阵来表示,矩阵的大小是奇数,而且与使用的区域的大小相同。
这种权矩阵叫做卷积核,区域中的每个像素分别与卷积核中的每个元素相乘,所有乘积之和即区域中心像素的新值。
比如,对于一个33的区域P与卷积核K卷积后,区域P的中心像素p5表示如下:
p5=p1*k1+p2*k2+p8*k8+p9*k9其中p1p2p3k1k2k3p4p5p6k=k4k5k6p7p8p9k7k8k9卷积核中各元素叫卷积系数。
卷积核中卷积系数的大小、方向及排列次序决定了卷积的图像处理效果。
大多数常用的卷积核都是33的,所有卷积核的行、列都是奇数。
进行卷积时会遇到一些较复杂的问题,首先是图像边界的问题。
当在图像上逐个移动卷积核时,只要卷积核移到了图像边界,即卷积核悬挂在图像边界上时,就会出现计算上的问题。
这时在原图像上就不能完整找到与卷积核中卷积系数相对应的九个(对33卷积核)图像像素。
解决这一问题的两个简单方法是:
或者忽略图像边界数据,或者在图像的四周复制图像的边界数据。
(2)Sobel边缘检测算子Sobel边缘检测算子是先做成加权平均,再微分,然后求梯度。
以下两个卷积核形成了Sobel边缘检测算子,图中的每个点都用这两个核做卷积,其中一个对垂直边缘影响最大,而另一个对水平边缘影响最大。
边缘检测算子的中心与中心像素相对应,进行卷积运算。
两个卷积核的最大值作为该点的输出位。
运算结果是一幅边缘幅度图像。
在边沿检测中,sobel算子对于像素的位置的影响做了加权,加权平均边宽2像素,因此效果更好。
水平边缘Sobel算子垂直边缘Sobel算子即:
f(i-1,j-1)f(i,j-1)f(i+1,j-1)f(i-1,j)f(i,j)f(i+1,j)f(i-1,j+1)f(i,j+1)f(i+1,j+1)Gi=f(i-1,j+1)+2f(i,j+1)+f(i+1,j+1)-f(i-1,j-1)-2f(i,j-1)-f(i+1,j-1);Gj=f(i-1,j-1)+2f(i-1,j)+f(i-1,j+1)-f(i+1,j-1)-2f(i+1,j)-f(i+1,j+1);Gf(i,j)=|Gi|+|Gj|;有时为了检测特定方向上的边缘,也采用特殊的方向算子,如检测450或1350边缘的Sobel方向算子检测450Sobel方向算子检测1350Sobel方向算子2实现步骤
(1)取得原图的数据区指针。
(2)开辟两个和原图相同大小的图像缓冲区,将原图复制到两个缓冲区。
(3)分别设置Sobel算子的两个模板,调用Templat()模板函数分别对两个缓冲区中的图像进行卷积计算。
(4)两个缓存图像每个像素依次循环,取两个缓存中各个像素灰度值较大者。
(5)将缓冲区中的图像复制到原图数据区。
2编程实现
(1)卷积/*函数名称:
Templat(BYTE*m_pdata,intwide,intheight,inttempH,inttempW,inttempMX,inttempMY,float*fpArray,floatfCoef)*函数类型:
void*参数:
BYTE*m_pdata:
指向原DIB图像指针*intwide:
原图像宽度*intheight:
原图像高度*inttempH:
模板高度*inttempW:
模板宽度*inttempMX:
模板的中心元素X坐标(tempW-1)*inttempMY:
模板的中心元素Y坐标(tempH-1)*float*fpArray:
指向模板数组的指针*floatfCoef:
模板系数*返回值:
处理成功返回TRUE;处理失败返回FALSE。
*功能:
用指定模板对图像进行操作。
*/voidBianYuanJianCeDib:
Templat(BYTE*m_pdata,intwide,intheight,inttempH,inttempW,inttempMX,inttempMY,float*fpArray,floatfCoef)inti,j,k,l;/循环变量BYTE*temp=newBYTEwide*height;/新图像缓冲区/初始化新图像为原始图像memcpy(temp,m_pdata,wide*height);floatfResult;/像素值计算结果for(j=tempMY;jheight-tempH+tempMY+1;j+)for(i=tempMX;iwide-tempW+tempMX+1;i+)/计算像素值fResult=0;for(k=0;ktempH;k+)for(l=0;l255)/若超过255,直接赋值为255tempj*wide+i=255;else/未超过255,赋值为计算结果tempj*wide+i=(int)(fResult+0.5);memcpy(m_pdata,temp,wide*height);/复制处理后的图像deletetemp;
(2)Sobel水平与垂直边缘检测边缘检测/*函数名称:
Sobel()*函数类型:
void*功能:
用索伯尔算子对图像进行水平与垂直边缘检测。
*/voidBianYuanJianCeDib:
Sobel()LPBYTEp_data;/原图数据区指针intwide,height;/原图长、宽inti,j;/循环变量inttempH;/模板高度inttempW;/模板宽度floattempC;/模板系数inttempMY;/模板中心元素Y坐标inttempMX;/模板中心元素X坐标floatTemplate9;/模板数组p_data=this-GetData();wide=this-GetWidth();height=this-GetHeight
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 图像 锐化 处理 边缘 检测
![提示](https://static.bdocx.com/images/bang_tan.gif)