ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:117.56KB ,
资源ID:5923448      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5923448.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(精品运用VisualC完成基本数字图像处理.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

精品运用VisualC完成基本数字图像处理.docx

1、精品运用VisualC完成基本数字图像处理运用VisualC完成基本数字图像处理引言:微软的新的。NET平台为开发者带来了许多新的诸如GDI+、Globalization之类的编程机制,同时还发明了一门全新的类似Java的编程语言C。对于这些新知识,我们应尽快了解、掌握并试图运用到实践项目中去,而通过实例学习的方法无疑是一个非常有效的途径。本文就通过一个简单的实例,向大家展示了在VisualC中如何运用GDI+和Unsafe代码类等技术以实现简单的数字图像处理.一概述:本文的实例是一个数字图像处理的应用程序,它完成的功能包括对图像颜色的翻转、对图像进行灰度处理和对图像进行增亮处理。该程序对图像

2、进行处理部分的代码包含在一个专门的Filters类里面,通过调用该类里的静态成员函数,我们就可以实现相应的图像处理功能了。为实现图像处理,我们要对图像进行逐个象素处理。我们知道图像是由一个个的象素点组成的,对一幅图像的每个象素进行了相应的处理,最后整个图像也就处理好了。在这个过程中,我们只需对每个象素点进行相应的处理,在处理过程中却不需要考虑周围象素点对其的影响,所以相对来说程序的实现就变得简单多了。由于GDI+中的BitmapData类不提供对图像内部数据的直接访问的方法,我们唯一的办法就是使用指针来获得图像的内部数据,这时我们就得运用unsafe这个关键字来指明函数中访问图像内部数据的代码

3、块了。在程序中,我还运用了打开文件和保存文件等选项,以使我们的辛勤劳动不付之东流.二程序的实现:1打开VisualS,新建一个VisualC#的项目,在模板中选择Windows应用程序”即可,项目名称可自定(这里为ImageProcessor).2为使窗体能显示图像,我们需要重载窗体的OnPaint()事件函数,在该函数中我们将一个图像绘制在程序的主窗体上,为了使窗体能显示不同尺寸大小的图像,我们还将窗体的AutoScroll属性设置为true.这样,根据图像的尺寸,窗体两边就会出现相应的滚动条。该函数的实现如下:privatevoidForm1_Paint(objectsender,Syst

4、em.Windows.Forms.PaintEventArgse)Graphicsg=e.Graphics;g.DrawImage(m_Bitmap,newRectangle(this.AutoScrollPosition。X,this。AutoScrollPosition.Y,(int)(m_Bitmap.Width),(int)(m_Bitmap。Height));3给主窗体添加一个主菜单,该主菜单完成了一些基本的操作,包括”打开文件”、保存文件”、退出、翻转操作”、灰度操作”、”增亮操作”等.前面三个操作完成图像文件的打开和保存以及程序的退出功能,相应的事件处理函数如下:privatev

5、oidmenuItemOpen_Click(objectsender,System。EventArgse) OpenFileDialogopenFileDialog=newOpenFileDialog(); openFileDialog.Filter=Bitmap文件(*。bmp)|.bmpJpeg文件(*。jpg)|*。jpg所有合适文件(*.bmp/*.jpg)|。bmp/.jpg”; openFileDialog.FilterIndex=2; openFileDialog.RestoreDirectory=true; if(DialogResult。OK=openFileDialog。S

6、howDialog() m_Bitmap=(Bitmap)Bitmap.FromFile(openFileDialog.FileName,false); this.AutoScroll=true; this。AutoScrollMinSize=newSize(int)(m_Bitmap。Width),(int)m_Bitmap.Height)); this。Invalidate(); 其中,m_Bitmap为主窗体类的一个数据成员,声明为privateSystem.Drawing.Bitmapm_Bitmap;(注:因为程序中用到了相关的类,所以在程序文件的开始处应添加usingSystem。

7、Drawing。Imaging;)同时,在该类的构造函数中,我们必须先给它new一个Bitmap对象:m_Bitmap=newBitmap(2,2);上述代码中的this.Invalidate();完成主窗体的重绘工作,它调用了主窗体的OnPaint()函数,结果就将打开的图像文件显示在主窗体上。privatevoidmenuItemSave_Click(objectsender,System。EventArgse) SaveFileDialogsaveFileDialog=newSaveFileDialog(); saveFileDialog.Filter=Bitmap文件(*.bmp)*。

8、bmpJpeg文件(*.jpg)|。jpg所有合适文件(。bmp/.jpg)|。bmp/*。jpg”; saveFileDialog.FilterIndex=1; saveFileDialog。RestoreDirectory=true; if(DialogResult.OK=saveFileDialog.ShowDialog()) m_Bitmap.Save(saveFileDialog。FileName); 其中m_Bitmap。Save(saveFileDialog。FileName);一句完成了图像文件的保存,正是运用了GDI+的强大功能,我们只需这么一条简单的语句就完成了以前很大工作

9、量的任务,所以合理运用。NET中的新机制一定会大大简化我们的工作的。privatevoidmenuItemExit_Click(objectsender,System.EventArgse) this。Close(); 接下来,三个主要操作的事件处理函数如下:privatevoidmenuItemInvert_Click(objectsender,System.EventArgse) if(Filters。Invert(m_Bitmap) this.Invalidate(); privatevoidmenuItemGray_Click(objectsender,System.EventArgs

10、e) if(Filters。Gray(m_Bitmap)) this.Invalidate(); privatevoidmenuItemBright_Click(objectsender,System。EventArgse) Parameterdlg=newParameter(); dlg.nValue=0; if(DialogResult。OK=dlg.ShowDialog()) if(Filters.Brightness(m_Bitmap,dlg。nValue)) this。Invalidate(); 三个函数中分别调用了相应的图像处理函数Invert()、Gray()、Brightnes

11、s()等三个函数.这三个函数Filters类中的三个类型为public的静态函数(含有static关键字),它们的返回值类型均是bool型的,根据返回值我们可以决定是否进行主窗体的重绘工作。Invert()、Gray()、Brightness()等三个函数均包含在Filters类里面,Invert()函数的算法如下:publicstaticboolInvert(Bitmapb)BitmapDatabmData=b。LockBits(newRectangle(0,0,b.Width,b。Height),ImageLockMode。ReadWrite,PixelFormat.Format24bpp

12、Rgb);intstride=bmData.Stride;System。IntPtrScan0=bmData.Scan0; unsafe byte*p=(byte)(void)Scan0; intnOffset=stride-b。Width*3; intnWidth=b.Width3; for(inty=0;yb。Height;+y) for(intx=0;xnWidth;+x) p0=(byte)(255-p0); +p; p+=nOffset; b.UnlockBits(bmData); returntrue;该函数以及后面的函数的参数都是Bitmap类型的,它们传值的对象就是程序中所打开

13、的图像文件了。该函数中的BitmapData类型的bmData包含了图像文件的内部信息,bmData的Stride属性指明了一条线的宽度,而它的Scan0属性则是指向图像内部信息的指针.本函数完成的功能是图像颜色的翻转,实现的方法即用255减去图像中的每个象素点的值,并将所得值设置为原象素点处的值,对每个象素点进行如此的操作,只到整幅图像都处理完毕。函数中的unsafe代码块是整个函数的主体部分,首先我们取得图像内部数据的指针,然后设置好偏移量,同时设置nWidth为b。Width3,因为每个象素点包含了三种颜色成分,对每个象素点进行处理时便要进行三次处理。接下来运用两个嵌套的for循环完成对

14、每个象素点的处理,处理的核心便是一句:p0=(byte)(255p0);。在unsafe代码块后,便可运用b.UnlockBits(bmData)进行图像资源的释放。函数执行成功,最后返回true值。注:由于是要编译不安全代码,所以得将项目属性页中的允许不安全代码块”属性设置为true,图示如下:该函数实现的程序效果如下:(处理前)(处理后)Gray()函数的算法如下:publicstaticboolGray(Bitmapb)BitmapDatabmData=b.LockBits(newRectangle(0,0,b。Width,b.Height),ImageLockMode.ReadWrit

15、e,PixelFormat。Format24bppRgb); intstride=bmData。Stride; System。IntPtrScan0=bmData.Scan0; unsafe byte*p=(byte*)(void)Scan0; intnOffset=stride-b。Width3; bytered,green,blue; for(inty=0;yb。Height;+y) for(intx=0;xb.Width;+x) blue=p0; green=p1; red=p2; p0=p1=p2=(byte)(。299*red+。587green+.114blue); p+=3; p

16、+=nOffset; b。UnlockBits(bmData); returntrue;本函数完成的功能是对图像进行灰度处理,我们的基本想法可是将每个象素点的三种颜色成分的值取平均值。然而由于人眼的敏感性,这样完全取平均值的做法的效果并不好,所以在程序中我取了三个效果最好的参数:.299,.587,。114.不过在这里要向读者指明的是,在GDI+中图像存储的格式是BGR而非RGB,即其顺序为:Blue、Green、Red.所以在for循环内部一定要设置好red、green、blue等变量的值,切不可颠倒。函数执行成功后,同样返回true值.该函数实现的程序效果如下:(处理前)(处理后)Brig

17、htness()函数的算法如下:publicstaticboolBrightness(Bitmapb,intnBrightness) if(nBrightness255) returnfalse; BitmapDatabmData=b。LockBits(newRectangle(0,0,b.Width,b.Height),ImageLockMode。ReadWrite,PixelFormat。Format24bppRgb); intstride=bmData。Stride; System。IntPtrScan0=bmData。Scan0; intnVal=0; unsafe bytep=(by

18、te)(void*)Scan0; intnOffset=strideb。Width*3; intnWidth=b.Width*3; for(inty=0;yb.Height;+y) for(intx=0;xnWidth;+x) nVal=(int)(p0+nBrightness); if(nVal0)nVal=0; if(nVal255)nVal=255; p0=(byte)nVal; +p; p+=nOffset; b。UnlockBits(bmData); returntrue; 本函数完成的功能是对图像进行增亮处理,它比上面两个函数多了一个增亮参数nBrightness,该参数由用户输入

19、,范围为255255.在取得了增亮参数后,函数的unsafe代码部分对每个象素点的不同颜色成分进行逐个处理,即在原来值的基础上加上一个增亮参数以获得新的值.同时代码中还有一个防止成分值越界的操作,因为RGB成分值的范围为0255,一旦超过了这个范围就要重新设置。函数最后执行成功后,同样得返回true值。该函数实现的程序效果如下:首先,我们把图像增亮的参数设置为100(其范围为255255),然后执行效果如下,读者也可尝试其他的参数值。(处理前)(处理后)三小结:本文通过一个简单的实例向大家展现了用VisualC以及GDI+完成数字图像处理的基本方法,通过实例,我们不难发现合理运用新技术不仅可以大大简化我们的编程工作,还可以提高编程的效率。不过我们在运用新技术的同时也得明白掌握基本的编程思想才是最主要的,不同的语言、不同的机制只是实现的具体方式不同而已,其内在的思想还是相通的。对于上面的例子,掌握了编写图像处理函数的算法,用其他的方式实现也应该是可行的。同时,在上面的基础上,读者不妨试着举一反三,编写出更多的图像处理的函数来,以充实并完善这个简单的实例.附带的源代码文件为:ImageProcessor。rarPoweredbyDvNews。net

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1