Matlab图像锐化处理及边缘检测
本章要点:
?图像边缘锐化的基本方法
?微分运算
?梯度锐化
?边缘检测
6.1 图像边缘锐化的基本方法
物体的边缘是以图像局部特性不连续性的形式出现。本质上边缘常意味着一个区域的终结和另一个区域的开始。图像边缘信息在图像分析和人的视觉中都是十分重要的,是图像识别中提取图像特征的一个重要特性。图像的边缘有方向和幅度两个特性。通常,延边缘走向的像素变化平缓,而垂直于边缘走向的像素变化剧烈。边缘的描述包含以下几个方面:(1)边缘点——它两边像素的灰度值有显著的不同。边缘点也存在于这样一对邻点之间即一个在较亮的区域内部,另一个在外部。
(2)边缘法线方向——在某点灰度变化最剧烈的方向,与边缘方向垂直。
(3)边缘方向——与边缘法线方向垂直,是目标边界的切线方向。
(4)边缘位置——边缘所在的坐标位置。
(5)边缘强度——沿边缘法线方向图像局部的变化强度的量度。
粗略地区分边缘种类可以有两种,其一是阶跃状边缘,它两边像素的灰度值有显著的不同,其二是屋顶状边缘,它位于灰度值从增加到减少的变化转折点。这些变化分别对应景物中不同的物理状态。边缘是图像上灰度变化比较剧烈的地方,如果一个像素落在图像中某一个物体的边界上,那么它的邻域将成为一个灰度级的变化带。对这种变化最有用的两个特征是灰度的变化率和方向,在灰度变化突变处进行微分,将产生高值。经典的边缘提取方法是考虑图像的每个像素在某个领域内的变化,利用边缘邻近一阶或二阶方向导数变化规律,来检测边缘。图像灰度值的显著变化可以用一阶差分替代一阶微分的梯度来表示,它们分别以梯度向量的幅度和方向来表示。因此图像中陡峭边缘的梯度值将是很大的;那些灰度变化平缓的地方,梯度值是比较小的;而那些灰度值相同的地方,梯度值将为零。图像经过梯度运算能灵敏地检测出边界线,这种微分边缘检测算子运算简单易行,但有方向性。
利用计算机进行图像锐化处理有两个目的,一是与柔化处理相反,增强图像边缘,使模糊的图像变得更加清晰起来,颜色变得鲜明突出,图像的质量有所改善,产生更适合人观察和识别的图像,本章的梯度锐化就是介绍这方面的内容。二是希望经过锐化处理后,目标物体的边缘鲜明,以便于计算机提取目标物体的边界、对图像进行分割、目标区域识别、区域形状提取等,为图像理解和分析打下基础,目前它已成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位,本章的边缘检测算子就是介绍这方面的内容。
与图像平滑处理相对应,图像锐化也可以分为空间域图像锐化法和空间频率域图像锐化法两大类型。空间频率域图像锐化的方法将在第九章介绍,本章介绍边缘增强及边缘检测的方法,基于空间域处理,为分割及目标物体特征提取打下基础。
..
..
6.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
注意:由于计算机显示屏幕的坐标原点在视窗的左上角,显示屏幕的坐标系如图
6-1所示。
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)处的梯度是一个矢量,定义为:
?????
? ??????=j f i f j)]g[f(i, (6-1) 其方向导数在边缘法线方向上取得局部最大值。怎样求f(i,j)梯度的局部最大值和方向呢?我们知道f(i,j) 沿方向r 的梯度为:
θθsin cos j i f f r
j j f r i i f r f +=?????+?????=?? (6-2) r f
?? 的最大值条件是θ
??????????r f =0 即:θθcos sin j i f f +-=0 (6-3)
梯度是向量,各向同性。梯度方向对应于f(i,j)最大变化率方向上,即
i j f f /tan 1-=ξθ
梯度最大值 G=max
????????r f =22j i f f + (6-4) 为了减少计算量而用G=j i f f + (6-5)
梯度幅度比例于邻像素的灰度级,在灰度陡变区域,梯度值大,在灰度相似区,梯度值小,在灰度级为常数区,梯度为零。因此,微分运算应用在图像上,可使图像的轮廓清晰。
本节介绍的微分运算有:
纵向微分运算;
横向微分运算;
双方向一次微分运算。
6.2.1 纵向微分运算
1.理论基础
对灰度图像在纵方向进行微分实现了将图像向左平移一个像素,再用原图像减去平移
..
后图像。相减的结果反映了原图像亮度变化率的大小。原图像中像素值保持不变的区域,相减的结果为零,即像素为黑;原图像中像素灰度值变化剧烈的区域,相减后得到较大的变化率,对应的像素很亮,而且像素灰度值差别越大,则得到的像素就越亮,所以图像的垂直边缘得到增强。
本程序对灰度图像f 在纵方向或横方向进行微分,在数字处理中,微分用差分表近似,并按下式求得:
G ( i, j ) = f ( i , j )- f ( i-1, j-1 ) (6-6)
该算法用如下卷积核:
????
??????-000011000 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 for(int i=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纵向微分运算 6.2.2 横向微分运算 1.理论基础 该算法的数学表达式为: G ( i, j ) = f ( i , j ) - f ( i , j-1 )+ (6-7) 该算法用如下卷积核: ???? ??????-000010010 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 .. for(int i=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.效果对比图 图6-3 横向微分运算 6.2.3 双方向一次微分运算 1.理论基础 对灰度图像f 在纵方向和横方向两个方向进行微分。该算法是同时增强水平和垂直方向的边缘。该算法的数学表达式为: G(i,j)=sqrt{[f(i,j)-f(i,j-1)]*[f(i,j)-f(i,j-1)]+[f(i,j)-f(i-1,j)]* [f(i,j)-f(i-1,j)]} (6-8) 对于含小数的G ( i , j )可四舍五入。 该算法用如下卷积核: ??????????-000010010 ???? ??????-000011000 水平(i 方向) 垂直(j 方向) 使用水平方向卷积核得出像素值为m ,使用垂直方向卷积核得出像素值为n ,该像素边界强度为:sqrt[(m ×m )+(n ×n )]。该算法是同时增强水平和垂直方向的边缘。 2.实现步骤 (1)取得原图的数据区指针。 (2)开辟一块内存缓冲区,并初始化为255。 (3)每个像素依次循环,原图中当前像素的灰度值与其左方的像素的灰度值之差 的绝对值的平方,再加上当前像素的灰度值与其上方的像素的灰度值之差的绝对值的平方,所得的平方根即为新图像当前像素的灰度值。 (4)缓冲区中的图像复制回原图数据区。 3.程序代码 .. /************************************************************** *函数名称:ShuangXiang() *函数类型:void *功能:对图像进行双向一次微分 **************************************************************/ void WeiFenDib::ShuangXiang() { 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 for(int i=1;i //根据双向一次微分公式计算当前像素的灰度值 temp[wide*j+i]=(int)sqrt((p_data[wide*j+i]-p_data[wide*j+(i-1)])*(p_data[wide*j+i] -p_data[wide*j+(i-1)])+(p_data[wide*j+i]-p_data[wide*(j-1)+i]) *(p_data[wide*j+i]-p_data[wide*(j-1)+i])); //将缓冲区中的图像复制回原图数据区 memcpy(p_data, temp,wide*height); //删除缓冲区 delete temp; } 4.处理结果 (a)原图 (b)纵向微分运算 .. (c) 横向微分运算 (d) 双方向一次微分运算 图6-4 微分运算 6.3梯度锐化 图像平滑往往使图像中的边界、轮廓变得模糊,为了减少这类不利效果的影响,这就需要利用图像鋭化技术,使边缘变得清晰。经过平滑的图像变得模糊的根本原因是图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算),就可以使图像变得清晰。 图像处理中最常用的微分方法是求梯度。对于图像f(i,j), 它在点(i,j)处的梯度是一个矢量,定义为: G[f(i,j)]的梯度为: G[f(i,j)]=[ (i f ??)2+( j f ??)2] 1/2 (6-9) 对离散图像而言,可用差分法近似上述公式,得到: G[f(i,j)]={[ f(i,j) - f(i-1,j)]2+ [ f(i,j) - f(i,j-1)]2 }1/2 (6-10) 这正是双方向一次微分运算。为了便于编程和提高运算,在某些场合可进一步简化为: G[f(i,j)]=| f(i,j)- f(i-1,j)|+| f(i,j)- f(i,j-1)| (6-11) 利用差分运算时,图像的第一行和第一列的像素的梯度无法求得,一般用后一行或后一列的梯度值近似代替。微分运算可用来求信号的变化率,因而具有加强高频分量的作用,从上一节效果图上可知仅仅微分处理后的图像非常暗,不适用。如果将前面介绍的各种微分运算应用在图像上,既要求图像的轮廓清晰,又要求保持目标物体的内部灰度不变,这就是图像梯度锐化的目的。 梯度锐化常用的方法有: 直接以梯度值代替; 辅以门限判断; 给边缘规定一个特定的灰度级; 给背景规定灰度级; 根据梯度二值化图像. 6.3.1 直接以梯度值代替 利用双方向一次微分运算,算出梯度后让梯度值等于该点的灰度值。 即f(i,j)= G[f(i,j)]。 G[f(i,j)]={[ f(i,j) - f(i-1,j)]2+ [ f(i,j) - f(i,j-1)]2 } 1/2 实验四、图像的几何变换与彩色处理 一、实验目的 1理解和掌握图像的平移、垂直镜像变换、水平镜像变换、缩放和旋转的原理和应用; 2熟悉图像几何变换的MATLAB操作和基本功能 3 掌握彩色图像处理的基本技术 二、实验步骤 1 启动MATLAB程序,读入图像并对图像文件分别进行平移、垂直镜像变换、水平镜像变换、缩放和旋转操作 %%%%%%平移 >> flowerImg=imread('flower.jpg'); >> se=translate(strel(1),[100 100]); >> img2=imdilate(flowerImg,se); >> subplot(1,2,1); >> imshow(flowerImg); >> subplot(1,2,2); >> imshow(img2); I1=imread('flower.jpg'); I1=double(I1); H=size(I1); I2(1:H(1),1:H(2),1:H(3))=I1(H(1):-1:1,1:H(2),1:H(3)); I3(1:H(1),1:H(2),1:H(3))=I1(1:H(1),H(2):-1:1,1:H(3)); Subplot(2,2,1); Imshow(uint8(I1)); Title('原图'); Subplot(2,2,2); Imshow(uint8(I3)); Title('水平镜像'); Subplot(2,2,3); Imshow(uint8(I2)); Title('垂直镜像'); img1=imread('flower.jpg'); figure,imshow(img1); %%%%%%缩放 img2=imresize(img1,0.25); figure,imshow(img2); imwrite(img2,'a2.jpg'); 图像增强和边缘检测 实验内容 1)将Image1.jpg 转换为灰度图像A。 2)读懂文档(图像直方图均衡化.doc),利用里面的方法通过编程对图像A进行直方图均衡化处理,得到处理后的图像B。显示图像A和B,以及各自对应的灰度直方图。 3)利用锐化方法(教材118-120页),编制程序,对图像A和B分别使用罗伯特梯度,索伯尔梯度,拉普拉斯方法,进行处理,比较哪种求边缘的方法好,以及进行图像的直方图均衡化后能否提高求边缘的精确度。 4)撰写报告书,说明实验的步骤和方法,实验的结果等。 5)提交报告书以及源程序 实验步骤和方法 1)调用rgb2gray()函数将Image1.jpg 转换为灰度图像A。并将图像A保存到f和I1中。2)统计图像A中的像素并进行均衡化处理并将结果保存到B,显示图像A和B;调用imhist()函数显示两图像的灰度直方图。 3)编制罗伯特锐化函数,设定两个模板t1=[1,0;0,-1] t2=[0,-1;1,0],调用conv2()函数获得图像和两个模板的卷积并取绝对值相加获得罗伯特锐化结果,缩小结果图像。4)编制索伯尔锐化函数,设定两个模板t1=[1,2,1;0,0,0;-1,-2,-1] t2=[-1,0,1;-2,0,2;-1,0,1] ,其余步骤与罗伯特锐化相似。 5)编制拉普拉斯锐化函数,设定模板t(m,n)=[0,1,0;1,-4,1;0,1,0],将待处理图像与模板卷积,并用原图像的至减去模板运算结果的整数倍,将结果缩小化到原图像大小既得拉普拉斯锐化结果。 6)函数整合,将编制好的3)、4)、5)三个函数整合到2)的程序后面并加以调整,分别对图像A和B进行锐化,并将结果输出到2*4的图框中进行对比 实验结果 1) MATLAB 实现数字图像锐化处理 摘要:讨论了数字图像增强技术中空域图像锐化的四种算法及其用MATLAB的实现;同时给出了利用四种算法进行图像锐化后的对照图像。比较实验结果,可知运用算法锐化处理后,图像比原来图像清晰。 关键词:MATLAB、线性锐化、非线性锐化、sobel算子、prewitt算子、log算子 1.引言 MATLAB全称是Matrix Laboratory(矩阵实验室),一开始它是一种专门用于矩阵数值计算的软件,从这一点上也可以看出,它在矩阵运算上有自己独特的特点。实际运用中MATLAB 中的绝大多数的运算都是通过矩阵这一形式进行的,这一特点决定了MATLAB 在处理数字图像上的独特优势。理论上讲,图像是一种二维的连续函数,然而计算机对图像进行数字处理时,首先必须对其在空间和亮度上进行数字化,这就是图像的采样和量化的过程。 二维图像均匀采样,可得到一幅离散化成M ×N 样本的数字图像,该数字图像是一个整数阵列,因而用矩阵来描述该数字图像是最直观最简便的。而MATLAB 的长处就是处理矩阵运算,因此用MATLAB 处理数字图像非常的方便。MATLAB 支持五种图像类型,即索引图像、灰度图像、二值图像、RGB 图像和多帧图像阵列;支持BMP,GIF,HDF,JPEG,PCX,PNG,XWD,CUR,ICO等图像文件格式的读、写和显示。MATLAB 对图像的处理功能主要集中在它的图像处理工具箱(Image Processing Toolbox)中。图像处理工具箱是由一系列支持图像处理操作的函数组成,可以进行诸如几何操作、线性滤波和滤波器设计、图像变换、图像分析与图像增强、二值图像操作以及形态学处理等图像处理操作口。 数字图像处理中图像锐化的目的有两个:一是增强图像的边缘,使模糊的图像变得清晰起来;这种模糊不是由于错误操作,就是特殊图像获取方法的固有影响。二是提取目标物体的边界,对图像进行分割,便于目标区域的识别等。通过图像的锐化,使得图像的质量有所改变,产生更适合人观察和识别的图像。 2.数字图像的锐化 数字图像的锐化可分为线性锐化滤波和非线性锐化滤波。如果输出像素是输入像素领域像素的线性组合则称为线性滤波,否则称为非线性滤波。 2.1线性锐化滤波器 线性高通滤波器是最常用的线性锐化滤波器。这种滤波器必须满足滤波器的中心系数为正数,其他系数为负数。线性高通滤波器3 ×3 模板的典型系数如表1 所示: 表 1 用线性高通滤波实现图像锐化的程序和图像如下: F=imread('F:/text.png'); %读入图像 f=rgb2gray(F); h=double(f); %转化为double类型 g=[-1 -1 -1; -1 8 -1; -1 -1 -1];%线性高通滤波3×3 模板 laplace(拉普拉斯)锐化matlab程序 部门: xxx 时间: xxx 整理范文,仅供参考,可下载自行编辑matlab 图像的几何变换与彩色处理
图像增强和边缘检测实验报告
MATLAB 实现数字图像锐化处理
laplace(拉普拉斯)锐化matlab程序