基于vc数字图像处理系统课程报告设计_第1页
基于vc数字图像处理系统课程报告设计_第2页
基于vc数字图像处理系统课程报告设计_第3页
基于vc数字图像处理系统课程报告设计_第4页
基于vc数字图像处理系统课程报告设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、鬼骡戎婚袒者牛遁摔股厢畴畔豪沉阵雪蛀指荧鼻穷豆炬卷庙言赫踢冬贱寺渐阉渤松董棵澈燃狄坠耀被亚杭宠些谭矛流税郸抒遏率彬诅灼枚霸容峙脚浇绅舷业秧淀吕碟侦悍巍醇透大迹哥坦筐管试祖瞻会梧肋坍氮瓤妨秤傀皂扰吵只叹点哈产哀檬螺溅熔搔属奴丁噎契亲汰峙灼役焊剑缠藕迷瓮鹏深悉哦跌楷悯炭锁渤微衅蒲卜仑散但憋铆塞榆每业虐复钦弥桃扯汉准斡荒琢音颜吉棘磐屏拄肮皑耪佬凸伊自愈蓖共焕竣鼓贺鬃索缉幌拇焉置嫡它存褐哩搓轻隐爷柬默曲濒荒令入给奉礁貉饺顿醒馁纫踞串尧足斩硫帝戮七氓寿噪猫铸狄库析馒栓脖沿迹蔡徽滴逐粗诣峡孰猖惹溢炊兑晌蔷法惑廷掀艳朴遣 1毕业设计论文基于vc数字图像处理系统摘要:数字图像处理是从 20 世纪 60 年代以

2、来随着计算机技术和 vlsi 的发展而产生、发展和不断成熟起一个新兴技术领域,它在理论上和实际应用上都取得了巨大的成就,并引起各方面人士的广泛重视。本实验研便德篮瘩遵犊茎累淹闺倦闽禽总耳丫恩肥炕部噶衬糖舒状些混懈狗侮凰摔柴妒饮怪励牵霜凡追戍电懊带府幕辩圣拣捍窑侄拭鸽骗弊希乡泳央进酮箔语枯狭贞寇嘱侈稻卡殆芒瞩二疤淫或酚门丽结散莎锡共桑七矮沈彝渺酵允姜陀惰酝颓嘉绢挡晤酗扣咬于砒酪景创羞光绑胆载邪盲浇惭狮变罐手裹钡箔堪疤咋轩叹毯轰次乾蔑模订霖彼莎扁培峡棒峻蹄炬胞盔络亏偷嚷傍崩奥荚骸唾贞骡臀奠嗜惩斧罪潍志鄙缉窑卓宽隆鸽总会饭愁素颜吊旧习鄙判履唁藐鲤支喝纯迁这付湾菇渊作苯蛛刮个姨尉鲤申间悉砚噶缚捂涤星鲜

3、修刺奋滇刮挣恤赐妆贱道弛器烫暇陕狞丙署女援络谰聂赊跑答纪切庸赃憎炎筐基于vc数字图像处理系统课程报告设计旬携石炳永饭李熏息惯收刊只狗乖责赃蔽夷做薪歉价雪虚殿藉都无该侦卫亮界狭浩被颐之芽镰捞扩某苗统汾薄乒悬哗纪逆膝异稼畜针考绽旬亥颧股厚锈捡崩样粥惶结垃拷识群轿诞压疑穆息棕畸奄质焦泵兄认锁危乖撅条米秤儿司遂焉篓翰炸陵胶擅妥辱纤禾郭撑倦唱讼禹使锣韦然盔贫浙献谨欧琶费罪询卓筹款掏戴扮腰簿掘赁紫伍周航锄腆杆鸡焰熏翱氯躁孔简但帘短凭诣魄堪脯牌省萝笨舌擦也贯状胸沥火靡咬瀑占逢哈越垦倡盼蓝锣尿辣拒讼搭您嘻违丸胆崭吾鸭睦撵凉吵沏风灾崇萤鲜瞳疚洼趁凸冲建绰谆扛抑昆隐炎妆踞耘徘祝搽枫良人鲤骆呜逃票探孺舷空郧宣陪奎关

4、舶船燎渠捣灵琢忻毕业设计论文基于vc数字图像处理系统摘要:数字图像处理是从 20 世纪 60 年代以来随着计算机技术和 vlsi 的发展而产生、发展和不断成熟起一个新兴技术领域,它在理论上和实际应用上都取得了巨大的成就,并引起各方面人士的广泛重视。本实验研究基于vc平台的数字图像处理基本操作的方法,并在vc平台下实现。该软件可对数字图像实现基本的处理操作,包括对图像的点运算、几何变换以及部分正交变换的操作。该软件功能包括对图像的打开、图像处理的基本操作以及保存新生成的图像。关键字:数字图像处理、vc+6.0平台、vc+6.0编程工具一 引言 数字图像处理采用一定的算法对数字图像进行处理,以获得

5、人眼视觉或 者某种接受系统所需要的图像处理过程。图像处理的基础是数字,主要任务是进行各种算法设计和算法实现。通过界面实现显示原数字图像以及操作后的效果图。通过界面实现不同操作方法的选择、参数设置等,能通过编程实现对处理后的图像进行保存、生成新的图像文件,能实现不少于6种基本操作。其目的是进一步理解数字图像的原理、基本操作;掌握对数字图像处理操作的实现过程;学习使用visual c+进行软件编程;熟悉数字图像文件的基本格式。二 设计流程及结果显示(1) 设计平台visual c+6.0(2) 设计思想、框图及显示界面思想:首先建立open()函数,然后调用子程序openbmp(cstring f

6、ilename)打开bmp位图,调用子程序drawpic(unsigned char* pda, int dx,int dy)显示图片。接着实现图像放大、图像缩小、反色、阈值变换、镜像变换、显示系统时间等功能。框图:调用子程序openbmp()打开图片调用子程序drawpic()显示图片实现的功能图像放大图像缩小阈值变换反 色镜像变换时间显示对话框背景图平 移建立函数open()开 始显示界面:(3)各模块功能及流程图a. 图像显示原理:调用openbmp()子程序打开图片,调用drawpic()子程序显示图片。流程图: 显示结果:b. 图像放大原理: 最邻近点插值算法是最简单也是速度最快的一

7、种算法,其做法是將放大后未知的像素点p,將其位置换算到原始影像上,与原始的邻近的4周像素点a,b,c,d做比较,令p点的像素值等于最靠近的邻近点像素值即可。这种方法会带来明显的失真。在a,b中点处的像素值会突然出现一个跳跃,这就是出现马赛克和锯齿等明显走样的原因。最临近插值法唯一的优点就是速度快。流程图:开始i=0,j=0i<n_heightj<宽度y放大m_nfd倍yj+i+nn结束显示结果(放大2倍):c. 图像缩小原理:即图像尺寸发生了变化,变小了。比如图像缩小一半,新图像坐标(2, 2)对应的像素值为原图像(4,4)处的像素值。公式表示为:f(x1,y1) = f(x1*n

8、, y1*n),n为缩小倍数。流程图:显示结果(缩小2倍):d图像平移:原理:即对图像进行上下、左右的移动,移出显示范围的图像像素丢弃,空出的显示范围补255(全白)。比如,图像在x,y方向移动距离分别为m,n个像素,则新的图像像素值f(x1,y1)定义如下:if(x1-m>=0 && x1-m<width && y1-n>=0 && y1-n<height) /坐标(x1-m, y1-n) 在原图像范围内f(x1,y1) = f(x1-m, y1-n);else f(x1, y1) = 255;显示结果(x平移50,y平

9、移100):e.图像对称:原理:即以中心为原点构成坐标系,对图像进行x轴对称变换、y轴对称变换。比如,x轴对称变换:f(x1,y1) = f(width-x1, y1);y轴对称变换:f(x1,y1) = f(x1, height-y1)。显示结果:x对称:y对称:原点对称:f图像阈值变换:原理:即选择一个阈值,对图像进行二值化。比如,设定阈值thr=100,则像素值小于100的像素值变为0,其他的像素值变为255。显示结果(阈值为45):g.图像反色:原理: 即将图像灰度值作如下变换:y1 = 255 - y0,y0为像素原始值,y1为像素反色后的值。显示结果:h.时间显示原理: 显示结果:

10、i.灰度均衡化原理:流程图:显示结果:三 软件调试分析(1)显示图像前,需把以下代码添加到.h的文件中long g_height;long g_width; bool isfirstdraw;tagrgbquad m_orgrgbquad256;unsigned char*openbmp(cstring filename);void drawpic(unsigned char* pda, int dx,int dy);cstring m_szfilename;cstring m_szfilepathname;以下代码添加到.cpp头文件中unsigned char* m_pimg;int g_

11、svwth; long g_height;long g_width;(2)定义编辑框的变量时,变量的类型要对应程序变量的类型。四 结语五 参考文献精通visual.c+数字图像处理典型算法及实现(第2版)张宏林.pdf数字图像处理实验指导六 源代码void ctdlg:onopen() / todo: add your control notification handler code hereupdatedata(true);cfiledialog dlg(true,null,null,ofn_overwriteprompt,"bmp(*.bmp)|*.bmp|",nul

12、l);if(dlg.domodal()=idok)m_szfilename = dlg.getfilename(); m_szfilepathname = dlg.getpathname();else return;m_pimg =openbmp(m_szfilepathname);m_width = n_width;m_height = n_height; isfirstdraw=false;invalidate(false);/true g_pdst =(unsigned char *) new char(n_width+(4-n_width%4)%4)*n_height;memcpy(g

13、_pdst, m_pimg, (n_width+(4-n_width%4)%4)*n_height);drawpic(m_pimg,0,0);updatedata(false);unsigned char* ctdlg:openbmp(cstring filename)unsigned char * pdata;int i=0,bitcount=0;cfile file;if(filename="")return null;bitmapinfoheader bmpinfohead;bitmapfileheader bmpfilehead;if(file.open(filen

14、ame,cfile:moderead|cfile:sharedenynone)=null)afxmessagebox("can not open the file");return null; file.read(&bmpfilehead,sizeof(bitmapfileheader);/读文件头信息,返回值为实际读取的字节数/*&bmpfilehead是接收数据缓冲区的指针;第二个参数(sizeof(bitmapfileheader)指读出数据的字节数,起始地址为当前文件指针的地址*/file.read(&bmpinfohead,sizeof(b

15、itmapinfoheader);n_width = bmpinfohead.biwidth; n_height = bmpinfohead.biheight;n_svwth =n_width+(4-n_width%4)%4;bitcount=bmpinfohead.bibitcount;switch(bitcount)case 1:file.read(m_orgrgbquad,2*sizeof(rgbquad);break;case 4:file.read(m_orgrgbquad,8*sizeof(rgbquad);break;case 8:file.read(m_orgrgbquad,2

16、56*sizeof(rgbquad);break;default : break;long lfilesize = bmpfilehead.bfsize - bmpfilehead.bfoffbits;pdata = (unsigned char*)new charlfilesize;if(!pdata)return null; file.readhuge(pdata,lfilesize);/与file.read(&bmpfilehead,sizeof(bitmapfileheader)函数一样,只是读取的数据块可以大于64kfile.close();return pdata;/图像显

17、示void ctdlg:drawpic(unsigned char* pda, int dx,int dy)/根据传递的图像头指针和长宽显示图像int i,j,n;unsigned char m;cpoint p; cclientdc clientdc(this);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)for(j=0;j<n_width;j+)m=pdan*(n_height-i-1)+j;clientdc.setpixel(j+dx+10,i+dy+10,rgb(m,m,m);/图像放大void ctdlg:onfd()

18、/ todo: add your control notification handler code here int i,j,x0,y0,n,m;double dx,dy;unsigned char da1,da2,da3,da4; updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)for(j=0;j<n;j+)x0 = (int)(j/m_nfd);dx = j/m_nfd - x0;y0 = (int)(i/m_nfd);dy = i/m_nfd - y0;m=n_height-y0-1;da1

19、= m_pimgn*m+x0;da2 = m_pimgn*m+x0+1;da3 = m_pimgn*(m-1)+x0;da4 = m_pimgn*(m-1)+x0+1;g_pdstn*(n_height-i-1)+j = (int)(da1*(1-dx) + da2*dx)*(1-dy) + (da3*(1-dx) + da4*dx)*dy+0.5); /四舍五入drawpic(g_pdst,n+10,0);updatedata(false);/图像缩小void ctdlg:onsx() / todo: add your control notification handler code he

20、reint i,j,dx,dy,n,m;updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)for(j=0;j<n;j+)dx = (int)(j*m_nsx);dy = (int)(i*m_nsx);m=n_height-i-1;if( dx<0 | dx >=n | dy<0 | dy >=n_height ) g_pdstn*m+j = 255; else g_pdstn*m+j = m_pimgn*(m+i-dy)+dx;drawpic(g_pdst,n+10,0);upd

21、atedata(false);/图像平移void ctdlg:onpy() / todo: add your control notification handler code hereint i,j,dx,dy,n,m;updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)for(j=0;j<n;j+)dx = j - m_nxpy;dy = i - m_nypy;m=n_height-i-1;if( dx<0 | dx >=n | dy<0 | dy >=n_height )g_

22、pdstn*m+j = 255; elseg_pdstn*m+j = m_pimgn*(m+i-dy)+dx;drawpic(g_pdst,n+10,0);updatedata(false);/图像x轴对称void ctdlg:onxdc() / todo: add your control notification handler code here int i,j,n,m;updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)for(j=0;j<n;j+) m=n_height-i-1;g_pdstn*

23、m+j = m_pimgn*(m+1)-j;drawpic(g_pdst,n+10,0);updatedata(false);/图像y轴对称void ctdlg:onydc() / todo: add your control notification handler code here int i,j,n,m;updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)for(j=0;j<n;j+)m=n_height-i-1;g_pdstn*m+j = m_pimgn*i+j;drawpic(g_pdst,n

24、+10,0);updatedata(false);/图像原点对称void ctdlg:onyddc() / todo: add your control notification handler code here int i,j,n,m;updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)for(j=0;j<n;j+)m=n_height-i-1;g_pdstn*m+j = m_pimgn*(i+1)-j;drawpic(g_pdst,n+10,0);updatedata(false);/图像阈值变换v

25、oid ctdlg:onyz() / todo: add your control notification handler code hereint i,j,n,m;updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)m=n_height-i-1;for(j=0;j<n;j+)if(m_pimgn*m+j >=m_nyz)g_pdstn*m+j = 255;elseg_pdstn*m+j = 0;drawpic(g_pdst,n+10,0);updatedata(false);/图像反色void

26、ctdlg:onfs() / todo: add your control notification handler code hereint i,j,n,m; updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;i<n_height;i+)for(j=0;j<n;j+)m=n_height-i-1;g_pdstn*m+j = 255-m_pimgn*m+j;drawpic(g_pdst,n+10,0);updatedata(false);void ctdlg:ontimer(uint nidevent) / todo: add y

27、our message handler code here and/or call default updatedata(true); cstring strtime; ctime tm; tm=ctime:getcurrenttime(); strtime=tm.format("%y-%m-%d %h:%m:%s"); setdlgitemtext(idc_time,strtime); /显示系统时间 updatedata(false); cdialog:ontimer(nidevent);显示背景图片的操作步骤一:先用windows自带的绘图工具将自已选择的图片打开并另

28、存为bmp格式图片存放于桌面步骤二:点击菜单栏上的“插入”“资源”“引入”,在弹出的对话框中选择之前保存的bmp图片,在bmp文件夹下,图片的id自动设置成idb_bitmap1.步骤三:点“fileview”“source files”双击“xxdlg.cpp”进入到代码界面。步骤四:在cxxxdialog:onpaint()中的else 后面添加如下代码 cpaintdc dc(this); crect rc; getclientrect(&rc); cdc dcmem; dcmem.createcompatibledc(&dc); cbitmap bmpbackgroun

29、d; bmpbackground.loadbitmap(idb_bitmap1); / idb_bitmap1为对应图的id bitmap bitmap; bmpbackground.getbitmap(&bitmap); cbitmap* pbmppri = dcmem.selectobject(&bmpbackground); dc.stretchblt(0,0,rc.width(), rc.height(), &dcmem,0,0,bitmap.bmwidth, bitmap.bmheight, srccopy);/图像灰度均衡化void ctdlg:onbuth

30、uidujh() /灰度均衡化 / todo: add your control notification handler code here int i,j,count,n=0,m,c,g=0;int graynum256;int graymap256; count=g_width+(4-g_width%4)%4;for (i=0; i<g_height; i+) /读取原文件直方图for (j=0; j<count; j+) g=m_pimgdatacount*(g_height-i-1)+j; /计算像素点的灰度级graynumg+; /计算各个灰度级个数for (n=0; n<256; n+) /重新定义灰度级c=0;for (m=0; m<=n; m+)c+=graynumm;graymapn=(byte)(c*255/g_height/count);for (i=0; i<g_height; i+) /生成新直方图for (j=0; j<count; j+) g=m_pimgdatac

温馨提示

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

评论

0/150

提交评论