




免费预览已结束,剩余21页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
毕业设计论文基于vc数字图像处理系统摘要:数字图像处理是从 20 世纪 60 年代以来随着计算机技术和 vlsi 的发展而产生、发展和不断成熟起一个新兴技术领域,它在理论上和实际应用上都取得了巨大的成就,并引起各方面人士的广泛重视。本实验研究基于vc平台的数字图像处理基本操作的方法,并在vc平台下实现。该软件可对数字图像实现基本的处理操作,包括对图像的点运算、几何变换以及部分正交变换的操作。该软件功能包括对图像的打开、图像处理的基本操作以及保存新生成的图像。关键字:数字图像处理、vc+6.0平台、vc+6.0编程工具一 引言 数字图像处理采用一定的算法对数字图像进行处理,以获得人眼视觉或 者某种接受系统所需要的图像处理过程。图像处理的基础是数字,主要任务是进行各种算法设计和算法实现。通过界面实现显示原数字图像以及操作后的效果图。通过界面实现不同操作方法的选择、参数设置等,能通过编程实现对处理后的图像进行保存、生成新的图像文件,能实现不少于6种基本操作。其目的是进一步理解数字图像的原理、基本操作;掌握对数字图像处理操作的实现过程;学习使用visual c+进行软件编程;熟悉数字图像文件的基本格式。二 设计流程及结果显示(1) 设计平台visual c+6.0(2) 设计思想、框图及显示界面思想:首先建立open()函数,然后调用子程序openbmp(cstring filename)打开bmp位图,调用子程序drawpic(unsigned char* pda, int dx,int dy)显示图片。接着实现图像放大、图像缩小、反色、阈值变换、镜像变换、显示系统时间等功能。框图:调用子程序openbmp()打开图片调用子程序drawpic()显示图片实现的功能图像放大图像缩小阈值变换反 色镜像变换时间显示对话框背景图平 移建立函数open()开 始显示界面:(3)各模块功能及流程图a. 图像显示原理:调用openbmp()子程序打开图片,调用drawpic()子程序显示图片。流程图: 显示结果:b. 图像放大原理: 最邻近点插值算法是最简单也是速度最快的一种算法,其做法是將放大后未知的像素点p,將其位置换算到原始影像上,与原始的邻近的4周像素点a,b,c,d做比较,令p点的像素值等于最靠近的邻近点像素值即可。这种方法会带来明显的失真。在a,b中点处的像素值会突然出现一个跳跃,这就是出现马赛克和锯齿等明显走样的原因。最临近插值法唯一的优点就是速度快。流程图:开始i=0,j=0in_heightj=0 & x1-m=0 & y1-nheight) /坐标(x1-m, y1-n) 在原图像范围内f(x1,y1) = f(x1-m, y1-n);else f(x1, y1) = 255;显示结果(x平移50,y平移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.时间显示原理: 显示结果: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_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|,null);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_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(filename,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(bitmapinfoheader);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,256*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;/图像显示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;in_height;i+)for(j=0;jn_width;j+)m=pdan*(n_height-i-1)+j;clientdc.setpixel(j+dx+10,i+dy+10,rgb(m,m,m);/图像放大void ctdlg:onfd() / 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;in_height;i+)for(j=0;jn;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 = 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 hereint i,j,dx,dy,n,m;updatedata(true);n=n_width+(4-n_width%4)%4;for(i=0;in_height;i+)for(j=0;jn;j+)dx = (int)(j*m_nsx);dy = (int)(i*m_nsx);m=n_height-i-1;if( dx=n | 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);updatedata(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;in_height;i+)for(j=0;jn;j+)dx = j - m_nxpy;dy = i - m_nypy;m=n_height-i-1;if( dx=n | dy=n_height )g_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;in_height;i+)for(j=0;jn;j+) m=n_height-i-1;g_pdstn*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;in_height;i+)for(j=0;jn;j+)m=n_height-i-1;g_pdstn*m+j = m_pimgn*i+j;drawpic(g_pdst,n+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;in_height;i+)for(j=0;jn;j+)m=n_height-i-1;g_pdstn*m+j = m_pimgn*(i+1)-j;drawpic(g_pdst,n+10,0);updatedata(false);/图像阈值变换void 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;in_height;i+)m=n_height-i-1;for(j=0;j=m_nyz)g_pdstn*m+j = 255;elseg_pdstn*m+j = 0;drawpic(g_pdst,n+10,0);updatedata(false);/图像反色void 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;in_height;i+)for(j=0;jn;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 your 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自带的绘图工具将自已选择的图片打开并另存为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 bmpbackground; bmpbackground.loadbitmap(idb_bitmap1); / idb_bitmap1为对应图的id bitmap b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 端午露营活动方案
- 童语同音活动方案
- 美术鉴赏比赛活动方案
- 电商公司开工活动方案
- 竹筒引水活动方案
- 社工小组老年活动方案
- 礼仪我来学活动方案
- 端午假期活动方案
- 组织残疾人烧烤活动方案
- 笔会采风活动方案
- 2025年疫苗上岗证考试题及答案
- 2025中国载人eVTOL行业白皮书
- 2025中国人民抗日战争纪念馆招聘4人考试模拟试题及答案解析
- 2025年老年康复科老年康复护理技能评估试卷答案及解析
- 征地拆迁面试题目及答案
- 果树栽培工专业技能考核试卷及答案
- 航空科普课件
- 2025广西壮族自治区药用植物园招聘高层次人才21人备考试题及答案解析
- 2025-2026学年人教版(2024)初中地理八年级上册教学计划及进度表
- 电气运行基础知识培训课件
- 水工闸门操作培训
评论
0/150
提交评论