C++程序设计梯度锐化.doc_第1页
C++程序设计梯度锐化.doc_第2页
C++程序设计梯度锐化.doc_第3页
C++程序设计梯度锐化.doc_第4页
C++程序设计梯度锐化.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学 号: 0120809310425图像处理程序设计大作业题 目图像的梯度锐化学 院信息学院专 业电子信息工程班 级电信0804班姓 名龙 辉指导教师黄 朝 兵2011年6月13日2设计方案及功能描述图像锐化的主要目的有两个:一是增强图像边缘,使模糊的图像变得更加清晰,颜色变得鲜明突出,图像的质量有所改善,产生更适合人眼观察和识别的图像;二是希望经过锐化处理后,目标物体的边缘鲜明,以便于提取目标的边缘、对图像进行分割、目标区域识别、区域形状提取等,为进一步的图像理解与分析奠定基础。图像锐化一般有两种方法:一是微分法,二是高通滤波法。高通滤波法的工作原理和低通滤波相似,这里不再赘述。下面主要介绍一下两种常用的微分锐化方法:梯度锐化和拉普拉斯锐化。但由于锐化使噪声受到比信号还要强的增强,所以要求锐化处理的图像有较高的信噪比;否则,锐化后图像的信噪比更低。2.1基本理论邻域平均法或加权平均法可以平滑图像,反过来利用对应的微分方法可以锐化图像。微分运算是求信号的变化率,有加强高频率分量的作用,从而使图像轮廓清晰。由于图像模糊的实质是图像受到平均或积分运算造成的,所以为了把图像中任何方向伸展的边缘和模糊的轮廓变得清晰,可以对图像进行逆运算如微分运算,从而使图像清晰化。在图像处理中,一阶微分是通过梯度法来实现的。对于一幅图像用函数f(x,f)表示,定义 f(x,f)在点(x,f)处的梯度是一个矢量,定义为:(2-1)梯度的方向在函数f(x,f)最大变化率的方向上,梯度的幅度Gf(x,f) 可由下式算出:(2-2)由上式可知,梯度的数值就是f(x,f)在其最大变化率方向上的单位距离所增加的量。对于数字图像而言,微分 和 可用差分来近似。式(2-2)按差分运算近似后的梯度表达式为:(2-3)为便于编程和提高运算速度,在计算精度允许的情况下,可采用绝对差算法近似为:(2-4)这种梯度法又称为水平垂直差分法,另一种梯度法是交叉地进行差分计算,称为罗伯特梯度法(Robert Gradient),表示为:(2-5)同样,可以采用绝对差算法近似为:(2-6)运用以上两种梯度近似算法,在图像的最后一行或最后一列无法计算像素的梯度时,一般用前一行或前一列的梯度值近似代替。为了在不破坏图像背景的前提下更好地增强边缘,也可以对上述直接用梯度值代替灰度值的方法进行改进,即利用门限判断来改进梯度锐化方法。具体公式如下: 的计算方法可以采用式(2-5)或式(2-6)。对于图像而言,物体和物体之间、背景和背景之间的梯度变化很小,灰度变化较大的地方一般集中在图像的边缘上,也就是物体和背景交接的地方。当我们设定一个阈值时,大于阈值就认为该像素点处于图像的边缘,对结果加上常数C,以使边缘变亮;而对于 不大于阈值就认为该像素点是同类像素,即为物体或背景,常数C的选取可以根据具体的图像特点。这样,即增亮了物体的边界,同时又保留了图像背景原来的状态,比传统的梯度锐化方法具有更好的增强效果和适用性。3实现步骤第一步:生成一个单文档的工程,所有的选项都取默认值。第二步:在CMyDIPView:OnDraw(CDC* pDC)中添加如下代码:void CMyDIPView:OnDraw(CDC* pDC) CMyDIPDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if(pDoc-m_hDIB = NULL)return ;/ TODO: add draw code for native data hereint i,j; unsigned char *lpSrc;LPSTR lpDIB = (LPSTR) :GlobalLock(HGLOBAL) pDoc-m_hDIB);int cxDIB = (int) :DIBWidth(lpDIB); / Size of DIB - xint cyDIB = (int) :DIBHeight(lpDIB); / Size of DIB - yLPSTR lpDIBBits=:FindDIBBits (lpDIB);/ 计算图像每行的字节数long lLineBytes = WIDTHBYTES(cxDIB * 8);/ 每行for(i = 0; i cyDIB; i+)/ 每列for(j = 0; j m_hDIB);CRect rect(0,0,cxDIB,cyDIB), rcDIB(0,0,cxDIB,cyDIB);:PaintDIB(pDC-m_hDC, &rect, pDoc-m_hDIB, &rcDIB, pDoc-m_palDIB);第三步:添加OnMenuRuihua函数,添加如下代码:void CMyDIPView:OnMenuRuihua() / TODO: Add your command handler code hereCMyDIPDoc* pDoc = GetDocument();GradientSharp(pDoc-m_hDIB);Invalidate(TRUE);4部分主要程序代码(带必要的注释)4.1算法实现CImgEnhance类中的成员函数GradientSharp ()实现梯度锐化操作,本算法程序是根据门限判断的梯度锐化方法编写的,阈值设为20,如果梯度加100大于255,则将其置为255。在对灰度图像进行梯度锐化时直接调用GradientSharp()函数即可,以下是GradientSharp ()函数的代码实现。/* 函数名称:GradientSharp() *参数 :HDIB hDIB -待处理图像的句柄*返回值:无*功能:现图像的梯度锐化*说明:只能对2值图像进行处理,如果图像本身边缘较细,可能造成信息的损失*/void GradientSharp(HDIB hDIB)LPSTR lpDIB=(LPSTR) :GlobalLock(HGLOBAL)hDIB);/ 指向DIB的指针LPSTR lpDIBBits;/ 指向DIB象素指针lpDIBBits = :FindDIBBits(lpDIB);/ 找到DIB图像象素起始位置LONG lWidth=:DIBWidth (char*)lpDIB);/获取图像的宽度LONG lHeight=:DIBHeight (char*)lpDIB);/获取图像的长度BYTEbThre = 20;/ 阈值/ 指向源图像的指针unsigned char*lpSrc;unsigned char*lpSrc1;unsigned char*lpSrc2;LONGi; / 循环变量LONGj;LONGlLineBytes;/ 图像每行的字节数BYTEbTemp; / 中间变量lLineBytes = WIDTHBYTES(lWidth * 8);/ 计算图像每行的字节数 for(i = 0; i lHeight; i+)/ 每行 for(j = 0; j lWidth; j+)/ 每列 / 指向DIB第i行,第j个象素的指针lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;/ 指向DIB第i+1行,第j个象素的指针lpSrc1 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 2 - i) + j; / 指向DIB第i行,第j+1个象素的指针 lpSrc2 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j + 1; /计算梯度值 bTemp = abs(*lpSrc)-(*lpSrc1) + abs(*lpSrc)-(*lpSrc2); / 判断是否小于阈值 if (bTemp = bThre) / 直接赋值为bTemp *lpSrc = bTemp; else/ 直接赋值为255*lpSrc = 255; /最后还要处理一下图像中最下面那行for(j = 0; j m_hDIB);Invalidate(TRUE);5运行结果的截图5.1程序处理前的图像效果:原图5-1原图5-25.2图像经过程序处理后的效果:原图5-3原图5-46总结与心得通过此次程序设计,使我更加扎实的掌握了有关C+和图像处理方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手编写程序,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在本次设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次程序设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于解决了。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! C+程序设计诚然是一门很重要的课程,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这门课程,我掌握了常用的程序编写流程。我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。 回顾起此程序设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次程序设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论