1、*实践教学*兰州理工大学计算机与通信学院2009 年秋季学期计算机图像处理综合训练题 目: 图像的锐化处理和图像压缩编码程序设计 专业班级: 姓 名: 学 号: 指导教师: 目录摘 要 .1一、前 言 .2二、算法分析与描述 32.1 图象锐化 SOBEL微分算子 32.2DCT 变换编码 .3三、详细设计过程 .53.1 类的详细设计说明 .53.2 主要函数作用说明 .5四、调试过程中出现的问题及相应解决办法 .64.1 程序调试中出现的问题及解决办法 .64.2 程序运行过程中出现的问题 .6五、程序运行截图及其说明 .9六、简单操作手册 12设计 总结 .14参考资料 .15致 谢 1
2、6附 录 17摘 要数字图像处理(DigitalImageProcessing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。图像锐化处理的主要目的是突出图像中的细节或者增强被模糊了的部分。模糊可能是由于错误的操作,或者是由于图像获取的方法的固有影响所致的。采用 C+ 面向对象语言,实现对图像的 Sobel 算子的锐化处理。为了有效地进行图像信息的传输或存储,减少描述图像信息的数据量是一个非常重要的工作。图像压缩编码的核心是,通过改变图像的描述方式,将数据中的冗杂信息去除,由此达到压缩数据量的目的。运用 C+面向语言实现对图像 DCT 编码的功能。在图像处理中主
3、要用 VC+编写图像处理程序并调用 C+图像处理的部分内部函数进行处理。关键词 数字图象处理;图像锐化处理;图像压缩编码;面向对象一、前 言数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。 数字图像处理主要研究以下内容: 图像几何变换;如傅立叶变换、沃尔什变换、离散余弦变换等;图象锐化处理;图像编码压缩;图像增强和复原;图像分割;图像描述;图像分类(识别) 。在图像分析中,通常需要突出图像中的细节或者增强被模糊了的部分,这种处理就是图像锐化。有时为了有效地进行图像信息的传输或存储,减少描述图像信
4、息的数据量,需要将图像进行压缩编码,从而达到压缩数据量的目的。图像锐化在图像分析、图像识别、图像检测等方面占有非常重要的地位,而图象编码在图像信息传输和存储、图像的加密方面起着很重要的作用。二、算法分析与描述2.1 图像锐化 Sobel 微分算子Sobel 算法的优点是方法简单、处理速度快,并且所得的边缘光滑、连续。Sobel 微分算子是一种奇数大小(3X3)的模板下的全方向微分算子。Sobel 微分算子定义如下: )1,()1,()1,(),(2)1,()1,( yxfyxfyxfyxfyxfyxfDyx2yx如果用图像处理的模板来表示,则有:2.2 DCT 变换编码 DCT 变换编码的核心
5、思想是,利用 DCT 变换对数据信息强度的集中特性,可以将数据中视觉上容易觉察的部分与不容易觉察的部分进行分离,由此达到进行有损压缩的目的。DCT 变换的公式如下:正变换: )1,21,( )12(cos)12(cos,(),F10 Nvu vyNuxNyxfNxy, 逆变换: 111 2)1(cos)2(cs),(2)(cos),02)(cos)0,2)0,(1),( NuvNvNu NvyuxFxFuxFyxf 为了提高压缩效率,考虑带局部子块中图像的相关性强的事实,通常采用的方法是,将图像分成 的子块,对每个子块进行独立的 DCT 变换。8三、详细设计过程3.1 类的详细设计说明类的属性
6、说明:double* m_pDbImage;int m_nSupp;int m_nDWTCurDepth;类的行为说明:int InitDocVariable();int FreeDocVariable();virtual void AssertValid() const;virtual void Dump(CDumpContextBOOL DIBDWTStep(CDib* pDib, int nInv);C06500131panzhangrongDoc* GetDocument();afx_msg void OnEdgeRoberts();afx_msg void OnEdgeSobel()
7、;afx_msg void OnEdgePrewitt();afx_msg void OnEdgeLaplace();afx_msg void OnEdgeCanny();afx_msg void OnEdgeTrack();afx_msg void OnRegionGrow();主要类的关系如图 3.1 所示图 3.1 主要类的继承关系图 3.13.2 主要函数作用说明(1)void Sobel Thin(BYTE *list,BYTE *list0,int Dx,int Dy)其中,list1,list0 分别输入,输出图像的二维数组指针;Dx、Dy 为处理窗口的宽度和高度。 (2) co
8、mpute_dct_coefficients(double *a,int n):DCT 变换的主要算法。(3)get_allpalette(pal); 读原来的调色板数据;(4)Str16(); 显示相应标题(5) put_image(600,300+i,Width,1buf1); 显示处理结果;(6) Sobel1D(); 对边缘图做 Sobel 边缘检测(7) VesaOn(0x105); 设置 256 色显示模式(8) OnePWidthD(); 边界宽度单点化;classCWinAppclassCDocumentC06500201ViewclassCScrollViewC0650020
9、1DocC06500201AppC06500201classes四、调试过程中出现的问题及相应解决办法4.1 程序调试中出现的问题及解决办法1.for()get_image(400,300+i,Width,1,buf1); /读边界宽度单点化结果图像for(j=0;j16) buf1j=0; /结果大于 16 者设为 255else buf1j=0; /其余像素设为 0put_image(600,300+i,Width,1buf1); /显示处理结果break; 错误 1:程序中 if 判断条件为空,程序无法顺利执行。错误 2:bufj=0 ,按照图象锐化原理将 buf1j设为 255.改正为
10、:for(i=0;i16) buf1j=255; /结果大于 16 者设为 255else buf1j=0; /其余像素设为 0put_image(600,300+i,Width,1buf1); /显示处理结果break; 4.2 程序运行过程中出现的问题该程序只能处理 256 色的文件,对于其他格式的图像文件不能直接处理要经过格式转换后才能在改程序上执行。1.打开一幅 24 位图界面如图 4.1 所示图 4.1 2.图像处理失败后的界面如图 4.2 所示图 4.23.打开一幅 256 色图片后的界面如图 4.3 所图 4.3 4. 用 Sobel 算子处理 256 色图像成功后的图象如图 4
11、.4 所示图 4.4 五、程序运行截图及其说明1.未经任何处理的 256 色原图如图 5.1 所示图 5.1(未经处理的图)2.经 Sobel 算子处理后图像与未处理的图像对比如图 5.2 所示(未处理的图像) 图 5.2 (经 Sobel 处理过的图像)说明:可以从图像的对比来看,经过 Sobel 算子处理过的图像够了出了原图像的大概轮廓。6.经 DCT 变换处理后图像如图 5.3 所示(未经处理的图像) 图 5.3 (经 DCT 变换编码得到的图像)说明:从上图的比较可以明显看出经 DCT 变换编码后的图像。编码后的图像中亮色部分代表原图中的高频部分。7.对经 DCT 变换后的图像进行逆变
12、换,显示结果如图 5.4:DCT 变换后的图像 图 5.4 经逆变换后得到的图像说明:你比较可以看出,经逆变换得到的图像与原图像大致相同。六、简单操作手册本系统主要是用实现基于图象灰度分布的阈值分割方法和实现基于区域提取的分割方法;在该程序的实现的过程中,主要的实现的步骤有:A:图像锐化处理(Sobel)的实现1、选取若干张目标图像文件,在计算机图象驱动程序中显示;2、实现 Sobel 算子的锐化;1.程序执行的初始界面如图 6.1 所示图 6.1 2.打开图像的界面如图 6.2 所示图 6.2 3. 打开图象进行 Sobel 算子的锐化处理的界面如图 6.3 所示图 6.3 4. 经 Sob
13、el 算子处理后的图象如图 6.4 所示图 6.4 B:图像 DCT 编码的实现1、导入图像2、选择 DCT 变换方法,开始进行 DCT 变换1.打开程序执行的初始界面,如图 6.5 2.读入图像如图 6.6图 6.5 图 6.63.进行 DCT 变换得到结果 4.将 DCT 变换后的图像进行逆变换,如图 6.8 所示结果图 6.7 图 6.8设计总结通过这次综合训练,使我受到了一次用专业知识、专业技能分析和解决问题的全面系统的锻炼。使我在综合知识的选用方面,在应用软件开发的基本思想、方法方面,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步。为日后成为合格的应用型人才打下良好的基础。这
14、次在柯老师的指导帮助下,在同学的帮助下,基本上完成了设计任务,在软件的设计方面也有了一定的提高,熟练掌握了一些 Visul C+编程技巧,为今后走上工作岗位打下了专业基础。 在这次的综合训练中,让我深深地体现到进行软件开发不是一件简单的事情,它需要设计者具有全面的专业知识、缜密的思维、严谨的工作态度以及较高的分析问题、解决问题的能力,而我在很多方面还有欠缺。最后,我要衷心感谢柯老师在我的设计过程中给予我的极大帮助,使我能够及时、顺利地完成此次的课程设计。参考资料1 朱虹.计算机图象处理基础M. 科学出版社, 20052 R C.Gonzalez, R E.Woods 著,阮秋琦,阮宇智等译.计
15、算机图象处理(第 2版).北京:电子工业出版社,20033 K.R.Castleman. 计算机图象处理.北京:电子工业出版社,20024 章毓晋.图像处理与分析-图像工程(上册),清华大学,20015 何斌等编著.Visual C+计算机图象处理.人民邮电出版社,2002 6 张宏林编著.Visual C+计算机图象模式识别技术及工程实践.人民邮电出版社,2003.7 黄维通.Visual C+面向对象与可视化程序设计.清华大学出版社,20038 R C.Gonzalez, R E.Woods, S L. Eddins 著,阮秋琦,阮宇智等译.计算机图象处理(MATLAB 版).北京:电子工
16、业出版社,2005致 谢为期两周的计算机图象处理综合训练终于落下了帷幕,在这段日子里,非常感谢老师和同学的帮助和支持,才能使我顺利的完成课设。尤其是我的指导老师柯铭老师,她在我的课程设计过程中提出了指导性的方案和建议,并指引我查找和阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术、新的知识。在此,对柯老师在我的设计过程中给予我的极大帮助表示衷心的感谢。同时,对给予我很多帮助和支持的同学们也表示感谢。附 录部分核心代码如下:/图象锐化 Sobel 算子#include “vesa_w.h“#include “file_w.h“#include “font_w.h“void T66(
17、void)char file50,file20=“lena_8g.bmp“;char buffer18=“P1 原图像 “,“P2 Sobel(P1)“,“P3 Sobel(P2)“,“P4 P2-Sobel(P2)“,“P5 P4-Sobel(P4)“,“P6 P4-Sobel(P5)“,“P7 P4+P5+P6“,“P8 P7 单点化“,“P9 全部边缘化“, “P10 高梯度边缘“;char StringT20;BYTE buf11024,buf21024,buf31024;int i,j,g,x,y,l,u;struct VGA_PAL pal256;SetTile(“T66: Sob
18、el 边缘细化“);VesaOn(0x105); /设置 256 色显示模式cls(255);strcpy(file,filepath);strcat(file,file1);loadBMPimage(file,0,0,swide,sdeep,0,0); /在屏幕左上角显示图像x=0;y=0;set_colour(0);for (u=0;u255) g=255;Else if(g16) buf1j=255; /结果大于 16 者设为 255else buf1j=0; /其余像素设为 0put_image(600,300+i,Width,1buf1); /显示处理结果break; strapy(
19、StringT,buffery);l=strlen(SreingT);Str16(StringT,x+width/2-4*l,y+Heith+10); /显示相应标题x+=200; /指向下一个显示位置if(u=4)x=0;y=300;delay(2000);delay(4000);get_allpalette(pal); /读原来的调色板数据for (i=0;i255) g=255;g=255-g;pali.r=g;pali.g=g;pali.b=g;set_allpalette(pal);DCT 的程序如下:*-*/*Discrete Cosine Transform of Image S
20、ignal*/*-*/#define DIM 256 /* the dimension of the input image */#define Pi (acos(0.0)*2.0)double in_imageDIMDIM; /* the input image */double out_imageDIMDIM; /* the reconstructed image */double dct_imageDIMDIM; /* the DCT image */*-*/*Compute_dct_coefficients*/*-*/void compute_dct_coefficients(doub
21、le * * a, int n )int i ,j ;for(i=0;i=0;i-)free(char * )afi);free(af);/*-*/*Main()*/*-*/void main (int argc , char *argv)int i,j,k,1,size_block,iter_num;double *temp,* *dct_coef, * *dct_coeft, * *image;char ch;/* input the size of the block */cout(“n Divide the input image into blocks?(Default size i
22、s 8*8)(Y/N)?n”);ch=getchar();if(ch= =y)|(ch= =Y)cout(“n Please input the size of the block:n”);scanf(“%d”,else size_block=8;/*compute the dct coefficient matrix of size_block * size_block */compute_dct_coefficients(dct_coef,size_block);/*transpose the dct coefficient matrix*/for(i=0;isize_block;i+)f
23、or(j=0;jsize_block;j+)dct_coeftij=dct_coefji;iter_num=DIM/size_block;/* computer the iteration number */for(i=0;iiter_num;i+)for(j=0;jiter_num;j+)for(k=0;ksize_block;k+)for(l=0;lsize_block;l+)imagekl=in_imagei*size_block+kj*size_block+l;/*Discrete Cosine Transform */dct(image,dct_coeft,dct_coef,size_block);/*output the dct image */for(k=0;ksize_block;k+)for(l=0;lsize_block;l+)dct_imagei*size_block+kj*size_block+l=imagekl;/*Inverse Discrete Cosine Transform*/dct(image,dct_coef,dct_coeft,size_block);for(k=0;ksize_block;k+)for(l=0;lsize_block;l+)out_imagei*size_block+kj*size_block+l=imagekl;