图像处理软件设计实验报告附带源代码_第1页
图像处理软件设计实验报告附带源代码_第2页
图像处理软件设计实验报告附带源代码_第3页
图像处理软件设计实验报告附带源代码_第4页
图像处理软件设计实验报告附带源代码_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

1、网络信息处理课程设计报告题目: 基于C#的图像处理软件 姓名: 杨祥 _班级: 信科09-4班_学号: 08093618_ _指导教师: 李锡渝_ _中国矿业大学计算机学院2012年 6 月11日目 录 摘要 (4)一、 软件设计背景 (4)1、C#语言简介 (4)2、C#与数字图像处理概述 (5)3、C#数字图像像素操作的三种方法 (5)二、软件设计工作分配 (8)三、软件设计详细过程 (8)1、图像灰度化 (8)2、灰度直方图 (10)3、图像二值化 (11)4、图像滤波 (12)5、图像锐化 (13)6、图像边缘检测 (14)7、图像轮廓链码提取 (16)8、图像细化 (18)9、图像腐

2、蚀 (22)10、图像膨胀 (23)四、结论 (24)摘 要数字图像处理是一种通过计算机采用一定的算法对图形图像进行处理的技术。数字图像处理技术已经在各个领域上都有了比较广泛的应用。图像处理的信息量很大,对处理速度的要求也比较高。本文基于C#的图像处理环境,设计并实现了一个图像处理系统,展示如何通过利用C#实现对图形图像的各种处理。描述了利用设计的系统实现图像文件(bmp、 jpg、jpeg、png、 gif等)进行打开、保存等功能操作,图像处理功能(包括彩色图像的灰度化、直方图、一般灰度图像的二值化处理、图像的滤波、锐化等十项功能)。关键字:图像处理;C#;灰度化;直方图;二值化;滤波;锐化

3、;边缘检测;链码提取;细化;腐蚀;膨胀一、 软件设计基础知识1、 C#语言简介C#是C语言的开发利器;而微软公司给出的解释是,C#是C+的升级语言,具有比C+更优越的开发特性。 C#编程语言作为微软公司.NET战略的一部分,是.NET平台应用的首选语言。 相对于其他编程语言,C#的特点概括如下:1. 简洁的语法相对C+语言而言,语法简单,容易入门。使用了有限的、统一的操作符、修饰符和运算符,且很少使用指针,也没有类的多继承。 2. 面向对象的设计 支持面向对象的所有关键特性,如封装、继承和多态等。3. 完备的安全性 代码工作在受托管的环境中,不允许进行类似直接存取内存的不安全操作。编译器自动检

4、查许多常见的编程错误,比如忘记初始化变量和数组越界等,且提供包括类型安全在内严格的安全检查。 4. 版本控制 内置版本控制功能,支持版本管理,使得软件可以不断的进行更新和升级。开发环境Visual Studio集成的发布和部署功能能够确保安装和卸载应用程序时,不会影响其他应用程序的使用。 5. 良好的兼容性 凭借.NET Framework平台对COM+组件、XML Web服务和MSMQ(微软消息队列)服务的支持,能够跨语言、跨平台交互操作,能够实现不同软件技术开发的组件之间的互相调用 。6. 支持快速开发 借助Visual Studio开发工具,可以通过拖放的形式自动添加组件并生成相应的代码

5、。 7. 面向组件的开发 提供生成系统级组件的能力,并能在开发中直接使用组件。数据访问组件是C#语言(或者说是Visual C#)中最具特色的组件。 2、C#与数字图像处理概述在C#中是利用GDI+来实现对图形、图像的处理,GDI+是与.NET Framework中的图形设备接口进行交互的入口,它在GDI的基础上提供了明显的改进,特别是GDI+不再有句柄或上下文的概念,而是以Graphics对象取代之,所以,GDI+使得应用程序开发人员在输出屏幕或打印机信息时,无需考虑具体显示设备的细节,只需调用GDI+库输出的类的相应方法即可完成图形操作,从而使程序的编写更加容易。3、 C#数字图像像素操作

6、的三种方法.直接操作法 方法与过程这种方法处理图像的基本过程如下:(1)直接使用GDI+中的Bitmap.GetPixel方法来读取当前像素的信息(颜色)。(2)直接使用GDI+中的Bitmap.SetPixel方法来设置当前像素的信息(颜色)。 构造函数这两个方法的构造函数如下:public Color GetPixel(int x,int y) 示例代码/获取当前像素点的RGB颜色值crtColor = crtBitmap.GetPixel(5,3);/设置当前像素点的新的RGB颜色值crtBitmap.SetPixel(5,3,Color.FromArgb(crtColor.R, 0,

7、0);.内存法方法与过程这种方法处理图像的基本过程如下:(1)在开始图像处理之前,先利用LockBits方法将Bitmap锁定到系统内存中。(2)再利用Marshal.Copy方法将已锁定到系统内存中的图像数据复制到一个字节数组中。(3)而后在该字节数组中对图像的像素点进行操作,即实施图像处理。(4)再执行(3)的反过程,即利用Marshal.Copy方法字节数组中将图像数据复制到锁定的系统内存中。(5)最后,利用UnlockBits方法解除被锁存的处理图像数据,图像处理结束。由于这种方法的全部操作都在内存中进行,所以可使程序的运行速度得以很多的提高。 示例代码例如,仅保留一幅图像中的红色信息

8、的图像处理,其C#内存法的示例代码如下:/获取被处理图像的大小Rectangle rect = new Rectangle(0, 0, crtBitmap.Width, crtBitmap.Height);/将被处理图像数据锁存System.Drawing.Imaging.BitmapData bmpData = crtBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, crtBitmap.PixelFormat);/获取第一个像素的地址IntPtr ptr = bmpData.Scan0;/计算该被处理的

9、24位位图的字节总数int bytes = crtBitmap.Width * crtBitmap.Height * 3;/根据以上字节总数创建用于保存图像数据的字节数组byte rgbValues = new bytebytes;3.指针法方法与过程该方法与内存法相似,其处理图像的基本过程如下:(1)在开始图像处理之前,先利用LockBits方法将Bitmap锁定到系统内存中。(2)然后直接利用指针对图像的像素点进行操作,即实施图像处理。(3)最后,利用UnlockBits方法解除被锁存的处理图像数据,图像处理结束。为了便于理解C#中利用指针对BitmapData对象的像素进行操作的基本过程

10、,以下给出24位的BitmapData对象的像素描述示意图,如图所示。 24位的BitmapData对象的像素描述 示例代码仅保留一幅图像中的红色信息的图像处理,其C#指针法的示例代码如下:/获取被处理图像的大小Rectangle rect = new Rectangle(0, 0, crtBitmap.Width, crtBitmap.Height);/将被处理图像数据锁存System.Drawing.Imaging.BitmapData bmpData = crtBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadW

11、rite, crtBitmap.PixelFormat);/启动非安全代码,以便使用指针unsafe/得到第一个字节的首地址(指针起点) byte* ptr = (byte*)(bmpData.Scan0); /二维图像循环for (int j = 0; j < bmpData.Width; j+) /处理像素点 ptr0 = 0; ptr1 = 0; /ptr2 = 0; /保留其中的红色信息(不处理) /指向下一个像素 ptr += 3; /指向下一行的首字节(“* 3”表示24位位图) /bmpData.Stride - bmpData.Width * 3为扫描偏移量 ptr +=

12、 bmpData.Stride - bmpData.Width * 3; /解除被处理图像数据的锁存,图像处理结束crtBitmap.UnlockBits(bmpData); 二、软件设计工作分配 所有工作都是由本人独自完成,做的不好的地方请李老师体谅!三、软件设计详细过程1、图像灰度化灰度化原理:为了加快图像处理速度,在图像处理特别是模式识别中通常先要将彩色图像转换为灰度图像。对于24位的彩色图像,其每个像素用3个字节来表示颜色,每个字节分别对应R(红)、G(绿)、B(蓝)3个分量。当R、G、B不同时表现为彩色图像;R、G、B相同时表现为灰度图像。常用的彩色转换为灰度的公式如下: 图像灰度化

13、处理程序流程图 图像灰度化处理效果展示:2、灰度直方图直方图原理:任何一幅图像的直方图都包括了客观的信息,某些类型的图像还可以由其直方图完全描述。简单地说,灰度级的直方图就是反映一幅图像中灰度级与其出现概率之间的关系图形。通常以横坐标表示灰度级,以纵坐标表示出现次数(或相对于次数的频率),则直方图的分布函数可表示如下:灰度直方图生成程序流程图 图像灰度直方图效果展示:3、图像二值化二值化原理:图像的二值化处理的性质类似于图像的灰度化处理,即将原本色彩丰富的图像变得色彩简单或更少,而二值化则使图像的色彩变得更少,只有两种颜色:黑和白。于是,这种图像的像素颜色只需1位二进制数值即可表示,所以,图像

14、存储的数据量急剧减少,而且可使一些图像处理的算法简化或处理的速度提高。二值化过程比较简单,首先需要设定一个阈值,然后使大于该阈值的颜色均修改为黑(或白),小于该阈值的颜色均修改为白(或黑)。 图像二值化效果展示: 阈值为70的图像二值化 4、图像滤波滤波原理:将空间域模板用于图像处理,通常称为空间滤波。空间滤波可分为线性平滑滤波(邻域平均法)和非线性平滑滤波(中值滤波法)两种。邻域平均法的基本原理是用当前图像像素点邻域的几个像素颜色的平均值来代替其像素颜色值。可用公式表示如下:图像滤波处理程序流程图 图像滤波效果展示:5、图像锐化锐化原理:在图像处理中,需要有边缘鲜明的图像,即需对图像进行锐化

15、。因为锐化能够突出图像的边缘信息,加强图像的轮廓特征,使之便于人眼的观察或机器的识别。另外,从处理效果来看,锐化是一种与滤波相反的图像处理。锐化算法常用的有梯度算子、一阶的Sobel算子和Prewitt算子以及二阶的拉普拉斯运算等。实际上,根据锐化的目的,可以采用多种方法来达到其效果,在此采用一种简单的锐化方法,即:原像素+边缘像素平均值*系数。可用公式表示如下:图像锐化处理程序流程图 图像锐化处理效果展示:6、图像边缘检测边缘检测原理:图像边缘是图像的最基本的特征,因为它通常反映了图像属性的重要事件或变化,如深度上的不连续性、表面方向不连续、物质属性变化或场景照明变化等,所以在图像分析中起着

16、重要作用。边缘检测算法常用的有梯度算子、一阶的Roberts算子、Sobel算子、Prewitt算子、二阶的Laplace(拉普拉斯)算子,另外还有算子Canny等。本示例程序采用一阶的Roberts算子,其优点是边缘定位准,缺点是对噪声敏感。 Roberts边缘检测算子是根据梯度法原理,采用对角线方向相邻像素之差得到,其近似计算方法如下:并可由2个2×2的算子模板(卷积算子)共同实现: 图像边缘检测处理程序流程图 图像边缘检测处理效果展示:7、图像轮廓链码提取轮廓链码提取原理:链码在图像处理和模式识别中是常用的一种表示方法,由于链码用一个方向数就可以代替两个坐标值,因此链码大大减少

17、了边界表示所需的数据量。另外,链码还具有旋转不变性的特点,也增强了其应用的灵活性。根据链的斜率不同,常用的有4方向链码和8方向链码两种编码形式。图像轮廓链码提取的程序流程图 图像轮廓的8方向链码提取效果展示:8、图像细化细化原理:图像细化一般用于图像的预处理,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个象素的线条细化成只有一个象素宽,形成“骨架”,形成骨架后能够更容易的分析图像,如提取图像的特征。 细化主要可通过“基于烈火模拟”和“基于最大圆盘”两种方法实现。其基本思想就是“像素的层层剥离”,即从线条边缘开始一层一层向里去除像素,直至线条剩下一个象素宽度为止。本示例程序采用如下模板和

18、方法进行图像细化。首先定义:以0表示当前检测点,以x表示0的相邻点。用1代表黑色点,用0代表白色点,用x代表任意颜色的点。图像处理时,对于满足以下8个基本模板中的点将被删除,因为符合这8个模板的点可以确认为线条边沿上的点。细化原理(模板)模板 布局 模板 布局 模板a(向右扩大) 0x1x01110x1x 模板e(向左扩大) 1x01101x0 模板b(向右下扩大) 00xx0111x11x 模板f(向左下扩大) x00110x1x 模板c(向右上扩大) x11x011100xx 模板g(向左上扩大) x1x110x00 模板d(向上扩大) 111x1x000 模板h(向下扩大) 000x1x

19、111x1x 图像细化处理的程序流程图 图像细化处理效果展示:原图:一次细化后:二次细化后:接着细化几次:9、图像腐蚀腐蚀原理:膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学的算法都是以这两种运算为基础的。设X为图像集合,S为结构元素,则X被S腐蚀记为:其中,是S平移x后仍在集合X内部的参考点集合。 图像腐蚀处理的程序流程图 图像腐蚀处理效果展示:10、图像膨胀膨胀原理:膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学的算法都是以这两种运算为基础的。设X为图像集合,S为结构元素,则X被S膨胀记为:其中,集合S先作关于原点的映射,然后平移x,形成新的集合,该集合与集合X相交不为空集时的结构

20、元素参考点的集合。图像膨胀处理的程序流程图 四、结论本文基于C#的数字图像处理环境,设计并实现了一个图像处理系统,展示如何通过利用C#实现对图形图像的各种处理。论述了利用设计的系统实现图像文件(bmp、 jpg、jpeg、png、 gif等)进行打开、保存等功能操作,图像处理功能(包括彩色图像的灰度化、直方图、二值化、滤波、锐化、边缘检测、链码提取、细化、腐蚀、膨胀等十余种功能)。由于知识有限,时间紧迫,对于图像处理也是初次接触,找了很多资料,仍然觉得力不从心。因此只实现了十余种简单的功能。在以后的学习过程中,会继续深入下去。感谢李老师的悉心教导!源代码:using System;using

21、System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;/添加命名空间using System.Drawing.Imaging;using Microsoft.VisualBasic;namespace ImageProcess public partial class Form1 : Form public Form1() InitializeComponent(); /记

22、录源图文件路径 string currentImageFile; /源图像 Bitmap sourceBitmap; /灰度级计数 int countPixel = new int256; /加载图像 private void btnLoad_Click(object sender, EventArgs e) /打开一个选择文件对话框以便加载要处理的图像 openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "所有图片文件(*.bmp/*.jpg/*.gif)|*.*|Jpeg文件(*.jpg)|*.jpg|

23、Bitmap文件(*.bmp)|*.bmp|gif文件(*.gif)|*.gif" openFileDialog1.FilterIndex = 2; openFileDialog1.RestoreDirectory = true; if (DialogResult.OK = openFileDialog1.ShowDialog() currentImageFile = openFileDialog1.FileName; /显示所加载的源图像以便与处理后的图像对比 pictureBox1.Image = Bitmap.FromFile(currentImageFile, false);

24、 /备份所加载的图像以便快速重新加载 sourceBitmap = (Bitmap)Image.FromFile(currentImageFile); /对窗体进行重新绘制,这将强制执行Paint事件处理程序 Invalidate(); /当重新加载图像时,应重置标示 this.label1.Text = "源图像" this.label2.Text = "源图像(待处理)" /保存处理图 private void btnSave_Click(object sender, EventArgs e) if (sourceBitmap != null) /选

25、择图像保存位置和保存类型 saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "Bitmap文件(*.bmp)|*.bmp|Jpeg文件(*.jpg)|*.jpg|gif文件(*.gif)|*.gif" saveFileDialog1.FilterIndex = 2; saveFileDialog1.RestoreDirectory = true; if (DialogResult.OK = saveFileDialog1.ShowDialog() /保存图像文件 sourceBitmap.Sav

26、e(saveFileDialog1.FileName); else MessageBox.Show("无处理后的图像可保存。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); /灰度化启动 private void btnGray_Click(object sender, EventArgs e) /调用灰度化方法 GrayScale(); this.label2.Text = "灰度图" /灰度化方法 public void GrayScale() if (sourceBitm

27、ap != null) Rectangle rect = new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height); System.Drawing.Imaging.BitmapData bmpData = sourceBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, sourceBitmap.PixelFormat); byte temp = 0; unsafe byte* ptr = (byte*)(bmpData.Scan0); for

28、(int i = 0; i < bmpData.Height; i+) for (int j = 0; j < bmpData.Width; j+) temp = (byte)(0.299 * ptr2 + 0.587 * ptr1 + 0.114 * ptr0); ptr0 = ptr1 = ptr2 = temp; ptr += 3; ptr += bmpData.Stride - bmpData.Width * 3; sourceBitmap.UnlockBits(bmpData); Invalidate(); else MessageBox.Show("无图像可处

29、理。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); /绘制直方图 private void btnHistogram_Click(object sender, EventArgs e) if (sourceBitmap != null) /一、统计各级灰度数量以便绘制直方图 /1.锁存图像数据,以便读取像素信息 Rectangle rect = new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap.Height); System.Drawing.Imag

30、ing.BitmapData bmpData = sourceBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, sourceBitmap.PixelFormat); int stride = bmpData.Stride; System.IntPtr Scan0 = bmpData.Scan0; /灰度级记录 byte grayScale = 0; /灰度级数组清零 Array.Clear(countPixel, 0, 256); /记录灰度级最大数量 int maxPixel = 0; /2.计算各灰度

31、级像素个数 unsafe byte* p = (byte*)(void*)Scan0; /“* 1”以强调图像为8位灰度图 /nOffset:扫描偏移量 int nOffset = stride - sourceBitmap.Width * 1; for (int y = 0; y < sourceBitmap.Height; +y) for (int x = 0; x < sourceBitmap.Width; +x) /灰度级 grayScale = p0; /灰度级像素个数计数 countPixelgrayScale+; if (countPixelgrayScale >

32、; maxPixel) /重置灰度级最大数量 maxPixel = countPixelgrayScale; p += 1; p += nOffset; sourceBitmap.UnlockBits(bmpData); /二、绘制直方图的坐标系 this.label1.Text = "灰度直方图" /1.创建绘制坐标的画笔 Pen curPen = new Pen(Brushes.Black, 1); /2.利用pictureBox1创建Graphics画图对象 Graphics g = pictureBox1.CreateGraphics(); /3.清除picture

33、Box2内容 g.Clear(this.BackColor); /4.绘制横坐标 g.DrawLine(curPen, 50, 240, 320, 240); /5.绘制纵坐标 g.DrawLine(curPen, 50, 240, 50, 30); /6.绘制横坐标的刻度 g.DrawLine(curPen, 100, 240, 100, 243); g.DrawLine(curPen, 150, 240, 150, 243); g.DrawLine(curPen, 200, 240, 200, 243); g.DrawLine(curPen, 250, 240, 250, 243); g.

34、DrawLine(curPen, 300, 240, 300, 243); /7.间隔50个像素绘制横坐标的刻度值 g.DrawString("0", new Font("New Timer", 8), Brushes.Black, new PointF(46, 245); g.DrawString("50", new Font("New Timer", 8), Brushes.Black, new PointF(92, 245); g.DrawString("100", new Font(&q

35、uot;New Timer", 8), Brushes.Black, new PointF(139, 245); g.DrawString("150", new Font("New Timer", 8), Brushes.Black, new PointF(189, 245); g.DrawString("200", new Font("New Timer", 8), Brushes.Black, new PointF(239, 245); g.DrawString("250", ne

36、w Font("New Timer", 8), Brushes.Black, new PointF(289, 245); /8.绘制横坐标的刻度 g.DrawLine(curPen, 47, 40, 50, 40); /9.在纵坐标上绘制灰度统计最大刻度值 g.DrawString(maxPixel.ToString(), new Font("New Timer", 8), Brushes.Black, new PointF(8, 34); /10.绘制各级灰度统计图 double temp2 = 0; Pen curPen2 = new Pen(Bru

37、shes.Blue, 1); for (int i = 0; i < 256; i+) /计算纵坐标相对最大高度 temp2 = 200 * countPixeli / maxPixel; /绘制直方图 g.DrawLine(curPen2, 50 + i, 239, 50 + i, 239 - (int)temp2); /释放画笔资源 curPen.Dispose(); /释放绘图资源 g.Dispose(); else MessageBox.Show("无图像可处理。", "提示", MessageBoxButtons.OK, MessageB

38、oxIcon.Error); /在指定位置以指定尺寸绘图 private void Form1_Paint(object sender, PaintEventArgs e) Graphics g = e.Graphics; if (sourceBitmap != null) g.DrawImage(sourceBitmap, 378, 12, sourceBitmap.Width, sourceBitmap.Height); /二值化启动 private void btnBinarize_Click(object sender, EventArgs e) /调用二值化方法 Binarize()

39、; this.label2.Text = "二值化图" /二值化方法 public void Binarize() if (sourceBitmap != null) String RbrThreshold = Interaction.InputBox("请输入一个 -255255 之间的阈值。nn注:正负值可使图像二值化为不同的“黑白效果”。", "二值化阈值设置", "70", 100, 100); if (RbrThreshold = "" | Convert.ToInt16(RbrThreshold) < -255 | Convert.ToInt16(RbrThreshold) > 255) MessageBox.Show("阈值必须在 -255255 之间。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); else Rectangle rect = new Rectangle(0, 0, sourceBitmap.Width, sourceBitmap

温馨提示

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

最新文档

评论

0/150

提交评论