图像处理系统的设计与实现
2015-12-10杨祥郝泳涛
杨祥 郝泳涛
摘要:图像处理技术已经在各个领域上都有了比较广泛的应用。本文基于C#设计并实现了一个图像处理系统,论述了怎么利用C#语言实现对图像的处理,实现了对图像(bmp、gif等)进行打开、保存等功能和图像处理功能(包括灰度化、膨胀等十项功能)。
关键字:灰度化;二值化;边缘检测;链码提取;细化;腐蚀
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)26-0158-03
Design and implementation of image processing system
YANG Xiang,HAO Yong-tao
(College of Electronics and Information Engineering, Tongji University, Shanghai 201804, China)
Abstract: The image processing technology has had a relatively wide range of applications in various fields. This paper designs and implements an image processing system based on C#, discusses how to use C# to achieve a variety of graphics image processing and realizes the use of a system designed for image files (bmp, png, gif, etc.) to open and save operations and other functions, image processing functions (including graying, expansion, etc. ten functions).
Key words: graying; binarization; detection of edge; extraction of chain code; refinement; corrosion
1 概述
21世纪是一个信息科技的时代,图形图像包围着我们,它们作为我们认知客观世界的基础,对我们的生活有着重大影响,是我们获取、表达、传递信息的手段。图像处理,也就是用计算机对图形图像进行一系列处理,它的发展时间并不是很长。随着信息技术的蓬勃发展,尤其是计算机技术的日新月异,为数字图像处理的发展提供了更加广阔的空间。我们知道,图像处理技术可以帮助我们更客观、精确地认识客观世界,而视觉信息的载体是各种各样的图形图像,在很多情况下,人的眼睛看图像是模糊不清的,我们想要看到看清这些图像就需要通过图像的增强技术,使它们变成可见的而且甚至是高清的。
本文基于C#开发了一个集数十种功能于一体,较为成熟的图像处理系统,使用起来方便简单。
2 系统设计基础知识
2.1 C#简介
C#语言相对于其他高级语言,如C、C++等,C#学习和使用起来更加简单,有如下特点:
1) 语法简单易学——相对高级程序设计语言C、C++来讲,C#的语法相对来说比较简单,C#中没有C中晦涩难懂的指针,也没有C++中庞大繁杂的类的多重继承及封装、多态性等,而且统一使用标准的运算符、操作符等,所以入门比较容易。
2) 面向对象程序设计——C#跟C++类似,也是面向对象的程序设计语言,支持面向对象程序设计的所有关键特性,这些又是面向过程的程序设计语言所不支持的,比如类的封装、继承等特性。
3) 安全性——C#的代码的工作环境是托管的,这就比其他程序设计语言要安全一些。
2.2 C#与图像处理简介
在C#语言中,对图像的处理是利用GDI+来完成的,这要比GDI性能各方面优秀一些,进一步讲GDI+其实是在GDI的基础上做出了比较明显的进步,尤其是句柄和上下文等概念不会出现在GDI+中,这样一来,就可以使程序员没必要再去关注具体的设备信息等等很多细节性的问题,只需要简单地调用相应的库函数即可完成需要的操作,从而可以更加简单快捷地编写程序,这是一个很大的优势。
2.3 C#语言中三种对像素操作的方法
2.3.1 直接操作法
所谓的直接法也就是说直接调用GDI+中的函数来实现相应操作,调用GetPixel()函数我们可以得到当前像素点的信息,然后又调用函数SetPixel()可以重置当前像素点的信息等。
2.3.2 内存法
内存法处理图像的基本流程大致如下:
1)在图像处理开始之前,先将操作对象放到内存中,这是利用函数LockBits来完成的。
2)再调用库函数把系统内存中的图像数据等信息拷贝到一个数组中去。
3)对数组中的像素点进行操作。
4)调用库函数做与(2)相反的操作,即把数组中的像素信息拷贝到内存去。
5)调用UnlockBits()函数释放上述过程中被锁存的图像数据。
内存发的程序的运行速度可以提高很多,得益于内存法的全部操作都在内存中进行。
2.3.3 指针法
指针法与上面的内存法很相似,它的图像处理的过程如下:
1)在处理开始之前,先调用LockBits()函数将图像放到内存中去。
2)接下来图像处理,在指针法中对图像的像素点的处理是利用指针完成的。
3)上述处理之后,是调用函数UnlockBits()释放被锁存的处理过的图像的数据,图像处理结束。
在C#中,利用指针对像素进行操作的流程,如图1所示:
3 系统功能的详细设计
3.1 图像的灰度化简介
度化处理很关键也很重要,在图像处理,尤其是模式识别中尤其重要。对于常见的一般的24位的彩色图像来说,它都是用3个字节来表示每个像素的颜色,也就是R、G、B。彩色图像的三个分量红、绿、蓝的数值不同;否则就表现为灰度图像。转换公式如图 2。
3.2 灰度直方图简介
[H(rk)=nk (k=0,1,2,…,2b-1)]图像的灰度直方图的原理:反映一幅图中的各个灰度级与它们出现的概率之间关系的图形就是灰度直方图。通常我们把灰度级当作横坐标,把频率看作纵坐标,我们就得到了它的分布函数:
3.3 图像的二值化简介
图像的二值化原理:类似于灰度化处理,都是让原来图像的色彩种类减少,但是二值化要比灰度化要求更高,顾名思义,二值化会让图像的色彩减少到只有黑色和白色。所以,只需1位二进制数就可以表示这种图像的像素的颜色,进而需要存储的数据量也大大减少,最终可以使得图像处理的算法得到精简,处理的速度也就自然而然地得到了提高。
3.4 图像的滤波简介
图像的滤波原理:顾名思义就是把空间域模板用于图像处理的这种方法。具体可以分为两种,分别是:线性平滑滤波和非线性平滑滤波,也叫邻域平均法和中值滤波法。线性平滑滤波的原理很简单,找到当前图像的像素点邻域内的几个像素点,然后求取平均值,也就是数学中的算术平均数,即颜色的算术平均值,然后用这个值去代替原来像素点的颜色值。
3.5 图像的锐化简介
图像的锐化原理:我们在图像处理中,有时候需要对图像进行锐化处理,也就是让图像的边缘更加突出鲜明。其实,我们都知道锐化和滤波是两种完全互逆的处理方法。常用的锐化算法有梯度算子、Prewitt算子和一阶的Sobel算子等等。
3.6 图像的边缘检测简介
图像的边缘检测原理:我们都知道图像的边缘对于一个图像的重要性,也是一个图像的最基本的特征,因为边缘通常包含了很多重要信息,有时候这些信息又不是连续的,而且还是不断变化的,所以图像的边缘检测对于图像的分析来说起着不可忽视的作用。在这里列举几个边缘检测算子:Sobel算子、梯度算子、Prewitt算子、一阶的Roberts算子等等。
[R(x,y)=|f(x,y)-f(x+1,y+1)|+|f(x+1,y)-f(x,y+1)|]Roberts算子是采用对角线方向相邻像素之差得到,它的近似计算方法如下:
具体是由2个2×2的卷积算子共同来完成:
[Δxf(x,y): 100-1 Δyf(x,y): 01-10]
3.7 图像轮廓的链码提取简介
图像轮廓的链码提取原理:在图像处理中最常用的一种表示方法就是链码,甚至在模式识别中也有很大用处,这是因为链码可以大大减少了表示边界所需的数据量,得益于链码用一个方向数来代替两个坐标值。此外链码还有旋转不变性,更加增强了链码应用的灵活性。
3.8 图像的细化简介
图像的细化原理:细化也就是说让宽的线条变成细的线条,可以简单这样理解一下,多用于对图像进行预处理,其实也就是提取出源图像的大致框架,进一步讲就是将原图像中宽度大于1个象素的线条都挑选出来,然后一步一步细化操作,最终成为只有一个象素宽的线条,形成分析起来比较容易的图像。
基于烈火模拟是细化的一种方法用的也比较多,此外还有基于最大圆盘方法也是不错的细化方法。它的基本思想就是从线条边缘开始向里层层去除像素,直到线条宽度只剩下一个象素才停止。
3.9 图像的腐蚀简介
[XΘS={x|(S)x?X}]图像的腐蚀原理:形态学处理的基础是膨胀和腐蚀,大多说的形态学算法都是以这两种运算为基础的。
把X设为图像集合,把S设为结构元素,则S把X腐蚀记为:
3.10 图像的膨胀简介
图像的膨胀原理:形态学处理的基础是膨胀和腐蚀,大多说的形态学算法都是以这两种运算为基础的。
把X设为图像集合,把S设为结构元素,则S把X膨胀记为:
[X⊕S= x|[(S)x?X]≠Φ ]
4 系统的实现
经过上述系统功能设计,然后详细的编码,最终开发了本系统,成功实现了本系统的所有功能,截取部分功能验证图片:
5 结束语
本文基于C#语言,开发了一个小型的相对简单的图像处理系统。本系统实现了图形图像的打开、保存等基本操作,还有简单的图像处理功能(包括灰度化、锐化、链码提取、滤波、边缘检测、腐蚀、二值化、膨胀等)。此次系统开发过程中深有体会,学习是无止境的,要活到老学到老,要不断丰富自己的专业知识,遇到不懂不会的一定要勤学好问,还要善于动手查找资料,最后感谢所有在生活和学习中帮助过我的人。
参考文献:
[1] 潘云鹤.计算机图形学[M].北京:高等教育出版社,2001.
[2] 何东健,耿楠,张义宽等.数字图像处理[M].西安:西安电子科技大学出版社,2003.
[3] 范立南,韩晓微,张广渊.图像处理与模式识别[M].北京:科学出版社,2007.
[4] 秦婧.21天学通C#[M]. 2版.北京:电子工业出版社,2011.
[5] 许海柱.图象中眼睛和嘴巴的检测与定位[D].长沙:中南大学,2008.
[6] 刘光明.基于图像识别的奶牛计量瓶自动计量系统的研究与设计[D].银川:北方民族大学,2013.