没有合适的资源?快使用搜索试试~ 我知道了~
【老生谈算法】Matlab图像锐化处理及边缘检测.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 133 浏览量
2023-05-11
21:03:53
上传
评论
收藏 3.02MB DOC 举报
温馨提示
试读
30页
matlab算法
资源推荐
资源详情
资源评论
101
Matlab 图像锐化处理及边缘检测
1 图像边缘锐化的基本方法
物体的边缘是以图像局部特性不连续性的形式出现。本质上边缘常意味着一个区域的终
结和另一个区域的开始。图像边缘信息在图像分析和人的视觉中都是十分重要的,是图像识
别中提取图像特征的一个重要特性。图像的边缘有方向和幅度两个特性。通常,延边缘走向
的像素变化平缓,而垂直于边缘走向的像素变化剧烈。边缘的描述包含以下几个方面 1:
(1) 边缘点——它两边像素的灰度值有显著的不同。边缘点也存在于这样一对邻点之
间即一个在较亮的区域内部,另一个在外部。
(2)边缘法线方向——在某点灰度变化最剧烈的方向,与边缘方向垂直。
(3)边缘方向——与边缘法线方向垂直,是目标边界的切线方向。
(4)边缘位置——边缘所在的坐标位置。
(5)边缘强度——沿边缘法线方向图像局部的变化强度的量度。
粗略地区分边缘种类可以有两种,其一是阶跃状边缘,它两边像素的灰度值有显著的不
同,其二是屋顶状边缘,它位于灰度值从增加到减少的变化转折点。这些变化分别对应景物
中不同的物理状态。边缘是图像上灰度变化比较剧烈的地方,如果一个像素落在图像中某一
个物体的边界上,那么它的邻域将成为一个灰度级的变化带。对这种变化最有用的两个特征
是灰度的变化率和方向,在灰度变化突变处进行微分,将产生高值。经典的边缘提取方法是
考虑图像的每个像素在某个领域内的变化,利用边缘邻近一阶或二阶方向导数变化规律,来
检测边缘。图像灰度值的显著变化可以用一阶差分替代一阶微分的梯度来表示,它们分别以
梯度向量的幅度和方向来表示。因此图像中陡峭边缘的梯度值将是很大的;那些灰度变化平
缓的地方,梯度值是比较小的;而那些灰度值相同的地方,梯度值将为零。图像经过梯度运
算能灵敏地检测出边界线,这种微分边缘检测算子运算简单易行,但有方向性。
利用计算机进行图像锐化处理有两个目的,一是与柔化处理相反,增强图像边缘,使
模糊的图像变得更加清晰起来,颜色变得鲜明突出,图像的质量有所改善,产生更适合人观
察和识别的图像,本章的梯度锐化就是介绍这方面的内容。二是希望经过锐化处理后,目标
物体的边缘鲜明,以便于计算机提取目标物体的边界、对图像进行分割、目标区域识别、区
域形状提取等,为图像理解和分析打下基础,目前它已成为机器视觉研究领域最活跃的课题
之一,在工程应用中占有十分重要的地位,本章的边缘检测算子就是介绍这方面的内容。
与图像平滑处理相对应,图像锐化也可以分为空间域图像锐化法和空间频率域图像锐
化法两大类型。空间频率域图像锐化的方法将在第九章介绍,本章介绍边缘增强及边缘检测
的方法,基于空间域处理,为分割及目标物体特征提取打下基础。
2 微分运算
边缘是由相邻域灰度级不同像素点构成的,若想增强边缘,就应该突出相邻点间灰度
级的变化。如下图所示,不难发现原图中左边暗,右边亮,中间存在着一条明显的边界。
0 0 1 255 255 255 255
1 1 1 254 253 254 254
0 0 0 255 255 253 253
1 1 0 254 254 254 254
102
注意:由于计算机显示屏幕的坐标原点在视窗的左上角,显示屏幕的坐标系如图
6-1 所示。
(0,0) x
f(x,y)
y
图 6-1 显示屏幕的坐标系
为了与 f ( x,y)表示法相一致,图像 f(i,j)中的 i 代表列,j 代表行。如果用右列减去左列,
即每一个像素的值为:
G ( i, j ) = f ( i , j )- f ( i-1, j )
结果如下:
0 1 254 0 0 0
0 0 253 -1 1 0
0 0 255 0 -2 0
0 - 1 254 0 0 0
可以看出,第 3 列比其他列的灰度值高很多,在边界附近,灰度值有明显的跳变,人眼
观察时,就能发现一条很明显的亮边;在灰度相近的区域内,这么做的结果使得该点的灰度
值接近于 0,区域都很暗。
这样,G ( i, j ) = f ( i , j )- f ( i-1, j )就起到了垂直边沿检测的作用。
如对于上面那幅图像转置,得到如下图像数据:
0 1 0 1
0 1 0 1
1 1 0 0
255 254 255 254
255 253 255 254
255 254 253 254
255 254 253 254
该边缘是水平方向的,这时如果还用左列减去右列就得不到边界数据,必须是下一行
减去上一行,即每一个像素的值为:
G ( i, j ) = - f ( i, j-1 ) + f ( i , j ),图像上得到一条很明显的亮边。
这就是一种边沿检测器,它在数学上的涵义是一种基于梯度的滤波器,又称边沿算子,
梯度是有方向的,和边沿的方向总是正交(垂直)的。
图像灰度的变化情况可以用灰度分布的梯度来反映。图像处理中最常用的微分方法是求
梯度。对于图像 f(i,j), 它在点(i,j)处的梯度是一个矢量,定义为:
103
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
j
f
i
f
j)]g[f(i,
(6-1)
其方向导数在边缘法线方向上取得局部最大值。怎样求 f(i,j)梯度的局部最大值和方向
呢?我们知道 f(i,j) 沿方向 r 的梯度为:
��
sincos
ji
ff
r
j
j
f
r
i
i
f
r
f
��
�
�
�
�
�
�
�
�
�
�
�
�
�
�
(6-2)
r
f
�
�
的最大值条件是
�
�
�
�
�
�
�
�
�
�
�
r
f
=0
即:
��
cossin
ji
ff ��
=0 (6-3)
梯度是向量,各向同性。梯度方向对应于 f(i,j)最大变化率方向上,即
ij
ff /tan
1�
�
�
�
梯度最大值 G=
max
�
�
�
�
�
�
�
�
r
f
=
22
ji
ff �
(6-4)
为了减少计算量而用 G=
ji
ff �
(6-5)
梯度幅度比例于邻像素的灰度级,在灰度陡变区域,梯度值大,在灰度相似区,梯度值
小,在灰度级为常数区,梯度为零。因此,微分运算应用在图像上,可使图像的轮廓清晰。
本节介绍的微分运算有:
纵向微分运算;
横向微分运算;
双方向一次微分运算。
2.1 纵向微分运算
1.理论基础
对灰度图像在纵方向进行微分实现了将图像向左平移一个像素,再用原图像减去平移
后图像。相减的结果反映了原图像亮度变化率的大小。原图像中像素值保持不变的区域,相
减的结果为零,即像素为黑;原图像中像素灰度值变化剧烈的区域,相减后得到较大的变化
率,对应的像素很亮,而且像素灰度值差别越大,则得到的像素就越亮,所以图像的垂直边
缘得到增强。
本程序对灰度图像 f 在纵方向或横方向进行微分,在数字处理中,微分用差分表近似,
并按下式求得:
G ( i, j ) = f ( i , j )- f ( i-1, j-1 ) (6-6)
该算法用如下卷积核:
104
�
�
�
�
�
�
�
�
�
�
�
000
011
000
2.实现步骤
(1)取得原图的数据区指针。
(2)开辟一块内存缓冲区,并初始化为 255。
(3)每个像素依次循环,新图像缓冲区中的当前像素的灰度值等于原图中当前像素的
灰度值与其左方的像素的灰度值之差的绝对值。
(4)将缓冲区中的图像复制回原图数据区。
3.程序代码
/**************************************************************
*函数名称:ZongXiang()
*函数类型:void
*功能:对图像进行纵向微分
**************************************************************/
void WeiFenDib::ZongXiang()
{
LPBYTE p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp=new BYTE [wide*height]; //开辟图像一缓冲区
memset(temp,255,wide*height);
for(int j=1;j<height-1;j++)
for(int i=1;i<wide-1;i++)
//当前像素的灰度值等于其和左方像素灰度值之差的绝对值
temp[wide*j+i]=abs(p_data[wide*j+i]-p_data[wide*j+(i-1)]);
//将缓冲区中的图像复制回原图数据区
memcpy(p_data, temp,wide*height);
//删除缓冲区
delete temp;
}
4.效果对比图
(a)原图 (b)纵向微分运算
图 6-2 纵向微分运算
105
2.2 横向微分运算
1.理论基础
该算法的数学表达式为:
G ( i, j ) = f ( i , j ) - f ( i , j-1 )+ (6-7)
该算法用如下卷积核:
�
�
�
�
�
�
�
�
�
�
�
000
010
010
2。实现步骤
(1)取得原图的数据区指针。
(2)开辟一块内存缓冲区,并初始化为 255。
(3)每个像素依次循环,新图像缓冲区中的当前像素的灰度值等于原图中当前像
素的灰度值与其上方的像素的灰度值之差的绝对值。
(4)将缓冲区中的图像复制回原图数据区。
3.程序代码
/**************************************************************
*函数名称:HengXiang()
*函数类型:void
*功能:对图像进行横向微分
**************************************************************/
void WeiFenDib::HengXiang()
{
LPBYTE p_data; //原图数据区指针
int wide,height; //原图长、宽
p_data=this->GetData ();
wide=this->GetWidth ();
height=this->GetHeight ();
LPBYTE temp=new BYTE [wide*height]; //开辟图像一缓冲区
memset(temp,255,wide*height);
for(int j=1;j<height-1;j++)
for(int i=1;i<wide-1;i++)
//当前像素的灰度值等于其和上方像素灰度值之差的绝对值
temp[wide*j+i]=abs(p_data[wide*j+i]-p_data[wide*(j-1)+i]);
//将缓冲区中的图像复制回原图数据区
memcpy(p_data, temp,wide*height);
//删除缓冲区
delete temp;
}
4.效果对比图
剩余29页未读,继续阅读
资源评论
阿里matlab建模师
- 粉丝: 3377
- 资源: 2786
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功