图像的锐化处理和图像压缩编码程序设计.docx
- 文档编号:3433902
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:22
- 大小:1,019.80KB
图像的锐化处理和图像压缩编码程序设计.docx
《图像的锐化处理和图像压缩编码程序设计.docx》由会员分享,可在线阅读,更多相关《图像的锐化处理和图像压缩编码程序设计.docx(22页珍藏版)》请在冰豆网上搜索。
图像的锐化处理和图像压缩编码程序设计
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2009年秋季学期
计算机图像处理综合训练
题目:
图像的锐化处理和图像压缩编码程序设计
专业班级:
姓名:
学号:
指导教师:
目录
摘要1
一、前言2
二、算法分析与描述3
2.1图象锐化Sobel微分算子3
2.2DCT变换编码3
三、详细设计过程5
3.1类的详细设计说明5
3.2主要函数作用说明5
四、调试过程中出现的问题及相应解决办法6
4.1程序调试中出现的问题及解决办法6
4.2程序运行过程中出现的问题6
五、程序运行截图及其说明9
六、简单操作手册12
设计总结14
参考资料15
致谢16
附录17
摘要
数字图像处理(DigitalImageProcessing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。
图像锐化处理的主要目的是突出图像中的细节或者增强被模糊了的部分。
模糊可能是由于错误的操作,或者是由于图像获取的方法的固有影响所致的。
采用C++面向对象语言,实现对图像的Sobel算子的锐化处理。
为了有效地进行图像信息的传输或存储,减少描述图像信息的数据量是一个非常重要的工作。
图像压缩编码的核心是,通过改变图像的描述方式,将数据中的冗杂信息去除,由此达到压缩数据量的目的。
运用C++面向语言实现对图像DCT编码的功能。
在图像处理中主要用VC++编写图像处理程序并调用C++图像处理的部分内部函数进行处理。
关键词数字图象处理;图像锐化处理;图像压缩编码;面向对象
一、前言
数字图像处理(DigitalImageProcessing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。
数字图像处理主要研究以下内容:
图像几何变换;如傅立叶变换、沃尔什变换、离散余弦变换等;图象锐化处理;图像编码压缩;图像增强和复原;图像分割;图像描述;图像分类(识别)。
在图像分析中,通常需要突出图像中的细节或者增强被模糊了的部分,这种处理就是图像锐化。
有时为了有效地进行图像信息的传输或存储,减少描述图像信息的数据量,需要将图像进行压缩编码,从而达到压缩数据量的目的。
图像锐化在图像分析、图像识别、图像检测等方面占有非常重要的地位,而图象编码在图像信息传输和存储、图像的加密方面起着很重要的作用。
二、算法分析与描述
2.1图像锐化Sobel微分算子
Sobel算法的优点是方法简单、处理速度快,并且所得的边缘光滑、连续。
Sobel微分算子是一种奇数大小(3X3)的模板下的全方向微分算子。
Sobel微分算子定义如下:
如果用图像处理的模板来表示,则有:
2.2DCT变换编码
DCT变换编码的核心思想是,利用DCT变换对数据信息强度的集中特性,可以将数据中视觉上容易觉察的部分与不容易觉察的部分进行分离,由此达到进行有损压缩的目的。
DCT变换的公式如下:
正变换:
逆变换:
为了提高压缩效率,考虑带局部子块中图像的相关性强的事实,通常采用的方法是,将图像分成
的子块,对每个子块进行独立的DCT变换。
三、详细设计过程
3.1类的详细设计说明
类的属性说明:
double*m_pDbImage;
intm_nSupp;
intm_nDWTCurDepth;
类的行为说明:
intInitDocVariable();
intFreeDocVariable();
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&dc)const;
BOOLDIBDWTStep(CDib*pDib,intnInv);
C06500131panzhangrongDoc*GetDocument();
afx_msgvoidOnEdgeRoberts();
afx_msgvoidOnEdgeSobel();
afx_msgvoidOnEdgePrewitt();
afx_msgvoidOnEdgeLaplace();
afx_msgvoidOnEdgeCanny();
afx_msgvoidOnEdgeTrack();
afx_msgvoidOnRegionGrow();
主要类的关系如图3.1所示
图3.1主要类的继承关系
图3.1
3.2主要函数作用说明
(1)voidSobelThin(BYTE**list,BYTE**list0,intDx,intDy)
其中,list1,list0分别输入,输出图像的二维数组指针;Dx、Dy为处理窗口的宽度和高度。
(2)compute_dct_coefficients(double**a,intn):
DCT变换的主要算法。
(3)get_allpalette(pal);读原来的调色板数据;
(4)Str16();显示相应标题
(5)put_image(600,300+i,Width,1buf1);显示处理结果;
(6)Sobel1D();对边缘图做Sobel边缘检测
(7)VesaOn(0x105);设置256色显示模式
(8)OnePWidthD();边界宽度单点化;
四、调试过程中出现的问题及相应解决办法
4.1程序调试中出现的问题及解决办法
1.
for(){
get_image(400,300+i,Width,1,buf1);
//读边界宽度单点化结果图像
for(j=0;j g=buf1[j]+buf2[j]+buf3[j]; if(buf1[j]>16)buf1[j]=0; //结果大于16者设为255 elsebuf1[j]=0;//其余像素设为0 put_image(600,300+i,Width,1buf1);//显示处理结果 } break; 错误1: 程序中if判断条件为空,程序无法顺利执行。 错误2: buf[j]=0,按照图象锐化原理将buf1[j]设为255. 改正为: for(i=0;i get_image(400,300+i,Width,1,buf1); //读边界宽度单点化结果图像 for(j=0;j g=buf1[j]+buf2[j]+buf3[j]; if(buf1[j]>16)buf1[j]=255; //结果大于16者设为255 elsebuf1[j]=0;//其余像素设为0 put_image(600,300+i,Width,1buf1);//显示处理结果 } break; 4.2程序运行过程中出现的问题 该程序只能处理256色的文件,对于其他格式的图像文件不能直接处理要经过格式转换后才能在改程序上执行。 1.打开一幅24位图界面如图4.1所示 图4.1 2.图像处理失败后的界面如图4.2所示 图4.2 3.打开一幅256色图片后的界面如图4.3所 图4.3 4.用Sobel算子处理256色图像成功后的图象如图4.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变换后的图像进行逆变换,显示结果如图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.经Sobel算子处理后的图象如图6.4所示 图6.4 B: 图像DCT编码的实现 1、导入图像 2、选择DCT变换方法,开始进行DCT变换 1.打开程序执行的初始界面,如图6.52.读入图像如图6.6 图6.5图6.6 3.进行DCT变换得到结果4.将DCT变换后的图像进行逆变换,如图6.8所示结果 图6.7图6.8 设计总结 通过这次综合训练,使我受到了一次用专业知识、专业技能分析和解决问题的全面系统的锻炼。 使我在综合知识的选用方面,在应用软件开发的基本思想、方法方面,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步。 为日后成为合格的应用型人才打下良好的基础。 这次在柯老师的指导帮助下,在同学的帮助下,基本上完成了设计任务,在软件的设计方面也有了一定的提高,熟练掌握了一些VisulC++编程技巧,为今后走上工作岗位打下了专业基础。 在这次的综合训练中,让我深深地体现到进行软件开发不是一件简单的事情,它需要设计者具有全面的专业知识、缜密的思维、严谨的工作态度以及较高的分析问题、解决问题的能力,而我在很多方面还有欠缺。 最后,我要衷心感谢柯老师在我的设计过程中给予我的极大帮助,使我能够及时、顺利地完成此次的课程设计。 参考资料 [1]朱虹.计算机图象处理基础[M].科学出版社,2005 [2]RC.Gonzalez,RE.Woods著,阮秋琦,阮宇智等译.计算机图象处理(第2版).北京: 电子工业出版社,2003 [3]K.R.Castleman.计算机图象处理.北京: 电子工业出版社,2002 [4]章毓晋.图像处理与分析-图像工程(上册),清华大学,2001 [5]何斌等编著.VisualC++计算机图象处理.人民邮电出版社,2002 [6]张宏林编著.VisualC++计算机图象模式识别技术及工程实践.人民邮电出版社,2003. [7]黄维通.VisualC++面向对象与可视化程序设计.清华大学出版社,2003 [8]RC.Gonzalez,RE.Woods,SL.Eddins著,阮秋琦,阮宇智等译.计算机图象处理(MATLAB版).北京: 电子工业出版社,2005 致谢 为期两周的计算机图象处理综合训练终于落下了帷幕,在这段日子里,非常感谢老师和同学的帮助和支持,才能使我顺利的完成课设。 尤其是我的指导老师柯铭老师,她在我的课程设计过程中提出了指导性的方案和建议,并指引我查找和阅读相关的资料和书籍,使我在不熟悉的领域中仍能迅速掌握新的技术、新的知识。 在此,对柯老师在我的设计过程中给予我的极大帮助表示衷心的感谢。 同时,对给予我很多帮助和支持的同学们也表示感谢。 附录 部分核心代码如下: //图象锐化Sobel算子 #include"vesa_w.h" #include"file_w.h" #include"font_w.h" voidT66(void) { charfile[50],file[20]="lena_8g.bmp"; charbuffer[][18]={"P1原图像","P2Sobel(P1)","P3Sobel(P2)", "P4P2-Sobel(P2)","P5P4-Sobel(P4)", "P6P4-Sobel(P5)","P7P4+P5+P6", "P8P7单点化","P9全部边缘化","P10高梯度边缘"}; charStringT[20]; BYTEbuf1[1024],buf2[1024],buf3[1024]; inti,j,g,x,y,l,u; structVGA_PALpal[256]; SetTile("T66: Sobel边缘细化"); 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;u<10;u++){ switch(u){ case0: break; case1: Sobel1D(0,0,Width,Heith,200,0);//对原图做Sobel边缘检测 break; case2: Sobel1D(200,0,Width,Heith,400,0);//对边缘图做Sobel边缘检测 break; case3: Sobel1D(200,0,Width,Heith,600,0); break; case4: Sobel1D(600,0,Width,Heith,800,0); break; case5: Sobel1D(800,0,Width,Heith,300,0); break; case6: for(i=0;i get_image(600,i,Width,1,buf1); get_image(800,i,Width,1,buf2); get_image(0,300+i,Width,1,buf3); for(j=0;j g=buf1[j]+buf2[j]+buf3[j]; if(g>255)g=255; Elseif(g<0)g=0; buf1[j]=g;//存储处理结果 } put_image(200,300+i,Width,1,vuf1); } break; case7: OnePWidthD(200,300,Width,Heith,400,300);//边界宽度单点化 break; case8: for(i=0;i get_image(400,300+i,Width,1,buf1);//边界宽度单点化结果图像 for(j=0;j g=buf1[j]+buf2[j]+buf3[j]; if(buf1[j])buf1[j]=255;//非零值全部设成255 put_image(600,300+i,Width,1buf1);//显示处理结果 } break; case9: for(i=0;i get_image(400,300+i,Width,1,buf1);//读边界宽度单点化结果图像 for(j=0;j g=buf1[j]+buf2[j]+buf3[j]; if(buf1[j]>16)buf1[j]=255;//结果大于16者设为255 elsebuf1[j]=0;//其余像素设为0 put_image(600,300+i,Width,1buf1);//显示处理结果 } break; } strapy(StringT,buffer[y]); 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;i<256;i<++){/ g=2*pal[i].r;//灰度值扩大一倍 if(g>255)g=255; g=255-g; pal[i].r=g;pal[i].g=g; pal[i].b=g; } set_allpalette(pal); } DCT的程序如下: ********************************************************************* /*---------------------------------------------------------------------------------------------*/ /*DiscreteCosineTransformofImageSignal*/ /*-------------------------------------------------------------------------------------------------------*/ #defineDIM256/*thedimensionoftheinputimage*/ #definePi(acos(0.0)*2.0) doublein_image[DIM][DIM];/*theinputimage*/ doubleout_image[DIM][DIM];/*thereconstructedimage*/ doubledct_image[DIM][DIM];/*theDCTimage*/ /*----------------------------------------------------------------*/ /*Compute_dct_coefficients*/ /*----------------------------------------------------------------*/ voidcompute_dct_coefficients(double**a,intn) { inti,j; for(i=0;i a[0][i]=1/sqrt(2.0); for(i=1;i for(j=0;j a[i][j]=cos(i*Pi*(j+0.5)/((double)n)); } /*-------------------------*/ /*dct()*/ /*--------------------------*/ voiddct(double*a[],double*b[],double*c[],intn) { inti,j,k; doublex; double**af; for(i=0;i for(j=0;j { x=0.0; for(k=0;k x+=a[i][k]*b[k][j]; af[i][j]=x; } for(i=0;i for(j=0;j { X=0.0; for(k=0;k x+=c[i][k]*af[k][j]; a[i][j]=2.0*x/((double)n); } for(i=n–1;i>=0;i--) free((char*)af[i]); free(af); } /*--------------------------------*/ /*Main()*/ /*-----------------------------------*/ voidmain(intargc,char*argv[]) { inti,j,k,1,size_block,iter_num; double*temp,**dct_coef,**dct_coeft,**image; charch; /*inputthesizeoftheblock*/ cout(“\nDividetheinputimageintoblocks? (Defaultsizeis8*8)(Y/N)? \n”); ch=getchar(); if((ch==’y’)||(ch==’Y’)) { cout(“\nPleaseinputthesizeoftheblock: \n”); scanf(“%d”,&size_block); } elsesize_block=8; /*computethedctcoefficientmatrixofsize_block*size_block*/ compute_dct_coefficients(dct_coef,size_block); /*transposethedctcoefficientmatrix*/ for(i=0;i for(j=0;j dct_coeft[i][j]=dct_coef[j][i]; iter_num=DIM/size_block;/*computertheiterationnumber*/ for(i=0;i for(j=0;j { for(k=0;k for(l=0;l image[k][l]=in_image[i*size_block+k][j*size_block+l]; /*DiscreteCosineTransform*/ dct(image,dct_coeft,dct_coef,size_block); /*outputthedctimage*/ for(k=0;k for(l=0;l dct_image[i*size_block+k][j*size_block+l]=image[k][l]; /*InverseDiscreteCosineTransform*/ dct(image,dct_c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 锐化 处理 压缩 编码 程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)