公路路面自动检测系统设计毕业设计论文

上传人:痛*** 文档编号:78006408 上传时间:2022-04-21 格式:DOC 页数:32 大小:1.32MB
收藏 版权申诉 举报 下载
公路路面自动检测系统设计毕业设计论文_第1页
第1页 / 共32页
公路路面自动检测系统设计毕业设计论文_第2页
第2页 / 共32页
公路路面自动检测系统设计毕业设计论文_第3页
第3页 / 共32页
资源描述:

《公路路面自动检测系统设计毕业设计论文》由会员分享,可在线阅读,更多相关《公路路面自动检测系统设计毕业设计论文(32页珍藏版)》请在装配图网上搜索。

1、装订线毕业设计(论文)报告纸目 录摘 要2ABSTRACT2ABSTRACT3第1章 绪论41.1 课题背景与实际意义41.2 国内外公路发展现状41.3 本毕业设计的主要内容51.4 本毕业设计的技术路线61.4.1 系统中用到的关键技术61.4.2 系统的硬件平台61.4.3 系统的软件平台61.4.4 程序实现6第2章 图像的预处理62.1 图像格式的识别62.2 相关函数介绍92.3 转化成灰度图162.4 灰度图像二值化162.5 图像的梯度锐化162.6去除离散的杂点噪声172.7 整体倾斜度调整172.8 字符分割182.9图像的归一化处理192.10图像的紧缩重排192.11特

2、征提取19第3章进行数字识别233.1 BP神经网络简介233.2 BP网络的设计及其编程实现27第4章 “路面里程桩号识别系统”介绍294.1 总体逻辑结构304.2 整体运行界面及功能30 摘 要本文的研究是公路路面自动检测系统的一部分,最终完成的任务是提取并识别出采集到的路面里程标图片上的号码数字,研究了计算机图像处理技术在公路路面自动检测中的应用。本研究分析了对于公路路面图像处理所需解决的主要问题,提出了提取公路路面图像特征的技术方案;尝试综合多种图像处理技术对里程桩图片进行适当的预处理,包括灰度图转化,二值化,梯度锐化,去离散噪声,整体倾斜调整,字符分割,尺寸标准归一化和紧缩重排,最

3、后对处理后的图片中所含号码进行识别。整个软件系统采用面向对象的编程技术,用VC+6.0语言编写而成,且界面简明,易于操作。本系统可望应用于公路自动检测系统中对路标号码进行识别,为公路管理和养护部门的决策提供依据,同时对于类似的图像处理任务有借鉴意义。关键词 公路路面,识别,图像处理,图像分割 ABSTRACTThe objectives of this thesis are to recognize the number on road-surface-mileport. In this paper,the main problems of digital image processing f

4、or highway surface are analyzed particularly,and the efficient and integrated preprocessing algorithm of highway surface image is described,finally recognize the number on the image.In this software system,which is compiled by VC+6.0,the Object Oriented Program Technique was adopted. The interface i

5、s so laconic and easy to operate .In addition,these algorithms in this research can be applied to analyze the road surface distress automatically,also be used for reference in other similar image processing cases.KEY WORDS:highway surface,recognize,image processing,image segmentation第1章 绪论1.1 课题背景与实

6、际意义改革开放的产物许多人对十几年前的“出行难”仍记忆犹新。交通部1990年的有关统计数字显示,因路况不好,车辆通行不畅,我国每年有上百亿元的财富被白白地浪费在汽车缓慢的行进中。80年代统计,全国公路汽车平均时速只有30多公里。交通滞后成为制约各地经济发展和对外开放的“瓶颈”。自1988年我国高速公路实现零的突破后,一条条以高速公路为轴线的各具特色的产业带迅速出现在各地。便捷通达的高速公路给人们的生活和工作带来了快节奏和高效率,加快了我国向现代文明社会发展的步伐。目前已建成的高速公路仅为需求里程的四分之一,我国高速公路建设仍处于滞后交通需求状态。去年以来,我国实施积极的财政政策,加强基础设施建

7、设,对公路的投资超过了历史上任何时期。从高速公路上流过的不仅仅是人流物流,而且是商业流、金融流、信息流、文化流,高速公路促进了沿线产业和经济带的发展。综上,公路的作用如此之大 ,因此后期的保养和维护工作也尤为重要,可应用公路路面状况自动检测系统来分析,路面里程桩号是公路位置的标志,把采集到包含里程号的图片信息输入到该系统中经自动识别获得所要的路段位置。1.2 国内外公路发展现状欧盟及欧共体各国为了发展区域性经济,更好地发挥高速公路的优势,加强国际间的联系,欧洲一些国家正在把高速公路连接起来,而构成国际高速公路网。如横贯全欧,东自奥地利的维也纳,经荷兰、法国、西至西班牙的瓦伦西亚全长3200km

8、的高速公路;纵贯全欧,北至丹麦的哥本哈根,经过德国和奥地利,南至意大利的罗马全长共有2100km的高速公路。可以说,每条高速公路都给欧洲乃至世界带来了巨大的社会效益和经济效益。美国的大规模建设开始于20世纪40年代,特别是二战后随着美国汽车工业和交通运输业的迅猛发展,美国高速公路建设得到了长足的发展,到今天为止,美国已经成为世界上高速高路最多、路网最发达、设备最完善的国家。纽约至洛杉矶高速公路全长4556km,堪称世界之冠。美国的高速公路服务配套设施极为完善,通过开发和应用交通监控和信息系统,可以对高速路上的车流量和车速等路况信息进行连续的检测,并通过中心计算机系统对这些信息进行处理,向公众发

9、布实时的交通信息和根据交通状况对公路出入口的时间参数和路面交通信号灯作出相应得调节,控制车流量、缓解交通压力避免塞车现象的发生,并在发生交通事故时,该系统凭借先进的通讯手段在极短的时间内协调医疗救助、消防和警察等有关部门的工作,将损失降低到最低的限度。随着已建成高速公路的投入使用和一些再建高速公路项目的陆续完工及投入使用,我国高速公路的运输规模正处于快速膨胀之中。如已经建成的世界银行批准列为第三批公路贷款项目的济青高速公路其路面汽车行驶速度可达120km/h,昼夜通行能力可达45万车次,取得了显著的经济效益和社会效益。近年来,交通部门在提高社会经济效益的同时,使公路网规划和设计工作步入了程序化

10、、规范化及科学化的轨道。对解决我国公路混合交通的问题,提高道路通行能力,改善投资环境,促进经济发展起到了积极的作用。1.3 本毕业设计的主要内容路面里程桩号识别系统从功能上可分为图像采集、图片预处理和数字识别三个子系统。系统总流程结构如图0-1所示: 进行识别 图片预处理图像采集 图0-1系统总流程图其中图像预处理的流程如图0-2所示:图像输入 灰度转化 图像二值化 倾斜调整 去离散噪声梯度锐化紧缩重排 归一化调整图像分割 特征提取图0-2图像预处理流程图 数字识别的具体流程如图0-3所示:字符特征输入识别并给出结果 该毕业设计主要是为了辨认识别路标图像中的数字而设计的,它通过对图片的一系列处

11、理,最后识别得出图片中显示的数字。1.4 本毕业设计的技术路线 1.4.1 系统中用到的关键技术本设计的理论基础是数字图像处理技术,实现平台是Visual C+6.0。1.4.2 系统的硬件平台 因为系统运行的过程当中,主要进行的都是图像处理,在这个过程当中要进大量的数据处理,所以处理器和内存要求比较高,CPU 要求主频在600hz 以(含600Hz),内存在128 兆以上(含128 兆)。1.4.3 系统的软件平台 系统可以运行于任何一台装有Windows98 、Windows2000 或者Windows XP 的机子上。程序调试时,需要使用Microsoft Visual C+ 6.0(S

12、P6)。1.4.4 程序实现 整个系统的程序实现分为图像预处理和数字识别两大模块。在图像预处理的过程当中,我们采用了许多图像处理的技术,最后把每个数字的特征提取出来。这些技术包括图像数据读取、图像的灰度化、二值化、图像的调整、离散噪声点的去除、字符的切分、图像的缩放、字符的细化、字符的平滑、图像的求梯度等图像处理技术,最后是数字字符特征的提取。其结果再利用神经网络(这里我们选用BP网络)进行字符识别。利用神经网络进行字符识别的过程主要包括网络的训练、数据的读取、字符的判定、结果的输出。第2章 图像的预处理2.1 图像格式的识别 要进行图像分析和处理首先就要得到图像的数据,这些数据包括图像的宽、

13、高、每个象素点的颜色值。因为每种文件都有它自己的存放格式,本程序采用的输入图像即为bmp位图。BMP(bitmap 的缩写)文件格式的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各个像素进行相应的处理,而未压缩的BMP图像中的像素数值正好与实际要处理的数字图像相对应,是Windows 本身可以直接提供读取支持的位图文件格式。BMP 文件可用每象素1、4、8、16 或24 位来编码颜色信息,这个位数称作图像的颜色深度,它决定了图像所含的最大颜色数。一幅1-bpp(位每象素,bit per pixel)的图像只能有两种颜色。而一幅24-bpp 的图像可以有超过16 兆种不同的颜色。 一

14、个典型BMP 文件的结构。以256 色也就是8-bpp 为例,文件被分成四个主要的部分:一个位图文件头BITMAPFILEHEADER,一个位图信息头BITMAPINFOHEADER,一个调色板Palette和实际的位图数据ImageDate。第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:typedef struct tagBITMAPFILEHEADER WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; BITMAPFILEHEADER; 这个结构的长

15、度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下:bfType:指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”。bfSize:指定文件大小,包括这14个字节。bfReserved1,bfReserved2:为保留字,不用考虑bfOffBits:为从文件头到实际的位图数据的偏移字节数,即图1.3中前三个部分的长度之和。第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,其定义如下:typedef struct tagBITMAPINFOHEADERDWORD biSize;

16、 LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER; 这个结构的长度是固定的,为40个字节(LONG为32位整数),各个域的说明如下:biSize:指定这个结构的长度,为40。biWidth:指定图象的宽度,单位是象素。biHeight:指定图象的高

17、度,单位是象素。biPlanes:必须是1,不用考虑。biBitCount:指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色), 24(真彩色图)。biCompression:指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况。biSizeImage:指定实际的位图数据占用的字节数,其实也可以从以下的公式

18、中计算出来:biSizeImage=biWidth biHeight要注意的是:上述公式中的biWidth必须是4的整倍数(所以不是biWidth,而是biWidth,表示大于或等于biWidth的,最接近4的整倍数。举个例子,如果biWidth=240,则biWidth=240;如果biWidth=241,biWidth=244)。如果biCompression为BI_RGB,则该项可能为零biXPelsPerMeter:指定目标设备的水平分辨率,单位是每米的象素个数。biYPelsPerMeter:指定目标设备的垂直分辨率,单位同上。biClrUsed:指定本图象实际用到的颜色数,如果该值

19、为零,则用到的颜色数为2biBitCount。biClrImportant:指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。第三部分为调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,是不需要调色板的,BITMAPINFOHEADER后直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2biBitCount个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:typedef struct tagRGBQUAD BYTE rgbBlue; /该颜色的蓝色分量BYTE rgb

20、Green; /该颜色的绿色分量BYTE rgbRed; /该颜色的红色分量BYTE rgbReserved; /保留值 RGBQUAD; 第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的R、G、B值。下面针对2色、16色、256色位图和真彩色位图分别介绍。对于2色位图,用1位就可以表示该象素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个象素。对于16色位图,用4位可以表示一个象素的颜色,所以一个字节可以表示2个象素。对于256色位图,一个字节刚好可以表示1个象素。对于真彩色图,三个字节才能表示1个象素。要

21、注意两点:(1)每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage时已经提到了。(2)一般来说,.bMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素接下来是倒数第二行左边第一个象素,左边第二个象素依次类推 ,最后得到的是最上面一行的最右一个象素。 在图像预处理部分的图像数据读取部分,使用了微软提供的一个图像函数库dibapi.h和dibapi.cpp,里面已经含有一些基本的图像处理函数,在此就不再列举源代码,而紧紧将其接口加以描述,以使读者清晰每个函数的作用。同时对该库又加以扩充以满足本

22、程序的需要。2.2 相关函数介绍 所有的函数定义及声明位于dibapi.h、dibapi.cpp、mydiblib.h中。首先来看7个图像数据读取/存储/创建以及图像基本信息获取函数。图像数据读取/保存由函数ReadDIBFile、SaveDIB、FindDIBBits、DIBWidth、DIBHeight、DIBNumColors完成,其调用接口如下: (1)ReadDIBFile函数 函数原型: HDIB WINAPI ReadDIBFile(CFile& file); 参数: CFile& file - 要读取得文件文件CFile 返回值: HDIB - 成功返回DIB的句柄,否则返回N

23、ULL。 说明: 该函数将指定的文件中的DIB对象读到指定的内存区域中。除文件头之外的内容都将被读入内存。HDIB即此内存区域的指针 (2)SaveDIB函数函数原型: BOOL WINAPI SaveDIB (HDIB hDib, CFile& file);参数: HDIB hDib - 要保存的DIB CFile& file - 保存文件CFile返回值: BOOL - 成功返回TRUE,否则返回FALSE或者CFileException说明: 该函数将指定的DIB对象保存到指定的CFile中。该CFile由调用程序打开和关闭。(3)FindDIBBits函数 函数原型: LPSTR WI

24、NAPI FindDIBBits (LPSTR lpbi);参数: LPSTR lpbi - 指向DIB对象的指针返回值: LPSTR - 指向DIB图像象素起始位置说明: 该函数计算DIB中图像象素数据区的起始位置,并返回指向它的指针。注 LPSTR指针为指向字符串的32位的指针。在对256色图像进行象素操作时,可以用(BYTE*)或(unsigned char*)强制将其转换为8位的指针(4)DIBWidth函数 函数原型: DWORD WINAPI DIBWidth(LPSTR lpDIB) 参数: LPSTR lpbi - 指向DIB对象的指针 返回值: DWORD - DIB中图像的

25、宽度 说明: 该函数返回DIB中图像的宽度。对于Windows 3.0 DIB,返回BITMAPINFOHEADER 中的biWidth值;对于其他返回BITMAPCOREHEADER中的bcWidth值。(5)DIBHeight函数函数原型: DWORD WINAPI DIBHeight(LPSTR lpDIB)参数: LPSTR lpDIB - 指向DIB对象的指针返回值: DWORD - DIB中图像的高度说明: 该函数返回DIB中图像的高度。对于Windows 3.0 DIB,返回BITMAPINFOHEADER中的biHeight值;对于其他返回BITMAPCOREHEADER中的b

26、cHeight值。(6)DIBNumColors函数函数原型: WORD WINAPI DIBNumColors(LPSTR lpbi)参数: LPSTR lpbi - 指向DIB对象的指针返回值: WORD - 返回调色板中颜色的种数 说明: 该函数返回DIB中调色板的颜色的种数。对于单色位图,返回2,对于16色位图,返回16,对于256色位图,返回256;对于真彩色位图(24位),没有调色板,返回0。以上6个函数是在图像处理过程中读取/保存图像以及获取图像基本信息的6个最基本的函数。还有一个NewDIB函数是作者自己编写的,用来建立一个新的DIB。此函数非常有用,可以十分便利的根据所提供的

27、要创建的位图的基本信息(高度、宽度、颜色位数)来开辟内存,并自动完成位图信息头的填充工作。 (7)NewDIB函数其完整程序代码及注释介绍如下:/*函数名称: NewDIB()* 参数:* width - 将要创建DIB的宽* height- 将要创建DIB的高* biBitCount- 将要创建DIB的位数。比如,如果要创建256色DIB,则此值为8*返回值:* HDIB - 成功返回DIB的句柄,否则返回NULL。*说明:* 该函数指定宽、高、颜色位数来创建一个新的DIB,并返回其句柄*/HDIB WINAPI NewDIB(long width, long height,unsigned

28、 short biBitCount) /计算新建的DIB每行所占的字节数 long dwindth = (width*biBitCount/8+3)/4*4; /新建的DIB调色板中表项的数目 WORD color_num; /通过输入的biBitCount值来确定调色板的表项数目 switch(biBitCount) /如果用1 bit来表示一个象素那么调色板中有两个表项 case 1: color_num=2;break; /如果用4 bit来表示一个象素那么调色板中有16个表项case 4:color_num=16;break; /如果用8bit来表示一个象素,那么调色板中得表项有256

29、中(本程序大多采用这种形式)case 8:color_num=256;break; /其他的情况调色扳中没有表项,即真彩位图default:color_num=0;break; /计算位图数据所占的空间 /dwindth *height为象素数据所占的空间 /40为位图信息头占的空间 /color_num*4为调色板的表项所占的空间(调色板每个表项占4各个字节) dwBitsSize = dwindth *height + 40 + color_num*4; /建立指向位图文件的指针 LPSTR pDIB; /申请存储空间,并建立指向位图的句柄 HDIB hDIB=(HDIB) :Global

30、Alloc(GMEM_MOVEABLE|GMEM_ZEROINIT, dwBitsSize); /如果申请空间不成功返回错误信息if (hDIB = 0)return NULL; /如果申请空间成功锁定内存,并将内存的指针传给pDIBpDIB = (LPSTR) :GlobalLock(HGLOBAL) hDIB); /建立指向位图信息头结构的指针LPBITMAPINFO lpmf = (LPBITMAPINFO)pDIB; /给位图信息头内的各个参量赋值 /指定位图信息头结构的大小为40字节lpmf-bmiHeader.biSize = 40; /指定新建位图的宽度lpmf-bmiHeade

31、r.biWidth = width; /指定新建位图的高度 lpmf-bmiHeader.biHeight = height; /位平面数必须为1 lpmf-bmiHeader.biPlanes = 1; /确定新建位图表示颜色是要用到的bit数 lpmf-bmiHeader.biBitCount = biBitCount; /是否进行压缩lpmf-bmiHeader.biCompression = 0; /新建的位图中实际的位图数据所占的字节数 lpmf-bmiHeader.biSizeImage = dwindth *height; /指定目标设备的水平分辨率lpmf-bmiHeader.

32、biXPelsPerMeter = 2925; /指定目标设备的垂直分辨率 lpmf-bmiHeader.biYPelsPerMeter = 2925; /新建图像实际用到的颜色数 如果为0则用到的颜色数为2的biBitCount次 lpmf-bmiHeader.biClrUsed = 0; /指定新建图像中重要的颜色数,如果为0则所有的颜色都重要lpmf-bmiHeader.biClrImportant= 0; /如果新建的图像中含有调色板,则接下来对调色板的各种颜色分量赋初始值if(color_num!=0)for(int i=0;ibmiColorsi.rgbRed =(BYTE)i;l

33、pmf-bmiColorsi.rgbGreen =(BYTE)i;lpmf-bmiColorsi.rgbBlue =(BYTE)i; /解除锁定 :GlobalUnlock(HGLOBAL) hDIB); /返回新建位图的句柄 return hDIB;以上的7个函数是打开、保存、创建位图以及获取位图基本信息的常用函数下面的4个函数是显示位图、清除屏幕、以及画框的函数。其中PaintDIB函数是微软函数库提供的,由DisplayDIB函数调用,在此不再列举源代码,只是提供调用接口的讲解。其他的3个编写的函数列出详细的源代码。(8)PaintDIB函数调用接口:函数原型BOOL WINAPI Pa

34、intDIB (HDC, LPRECT, HDIB, LPRECT, CPalette* pPal);参数: HDC hDC - 输出设备DC LPRECT lpDCRect - 绘制矩形区域 HDIB hDIB - 指向DIB对象的指针 LPRECT lpDIBRect - 要输出的DIB区域 CPalette* pPal - 指向DIB对象调色板的指针返回值: BOOL - 绘制成功返回TRUE,否则返回FALSE。说明:该函数主要用来绘制DIB对象。其中调用了StretchDIBits()或者SetDIBitsToDevice()来绘制DIB对象。输出的设备由由参数hDC指定;绘制的矩形

35、区域由参数lpDCRect指定;输出DIB的区域由参数* lpDIBRect指定。(9)在屏幕上显示位图的DisplayDIB函数其完整源代码及注释介绍如下:/*函数名称:DisplayDIB参数:CDC* pDC-指向当前设备上下文(Divice Context)的指针HDIB hDIB-要显示的位图的句柄*/void DisplayDIB(CDC* pDC,HDIB hDIB)/锁定位图并获取指向位图的指针BYTE* lpDIB=(BYTE*):GlobalLock(hDIB);/ 获取DIB宽度和高度int cxDIB = :DIBWidth(char*) lpDIB);int cyDI

36、B = :DIBHeight(char*)lpDIB);/设置位图的尺寸CRect rcDIB,rcDest;rcDIB.top = rcDIB.left = 0;rcDIB.right = cxDIB;rcDIB.bottom = cyDIB;/设置目标客户区输出大小尺寸(在这里直接令其为位图的尺寸)rcDest = rcDIB;/清除屏幕ClearAll(pDC);/在客户区显示图像:PaintDIB(pDC-m_hDC,rcDest,hDIB,rcDIB,NULL);/解除锁定:GlobalUnlock(HGLOBAL)hDIB);(10)清除当前屏幕客户区内容的ClearAll函数其完

37、整源代码及注释介绍如下:void ClearAll(CDC *pDC)/设置清除区域CRect rect;rect.left =0;rect.top =0;rect.right =2000;rect.bottom =1000;/创建一白色画笔CPen pen;pen.CreatePen (PS_SOLID,1,RGB(255,255,255);pDC-SelectObject (&pen);/绘制一白色矩形以清除客户区pDC-Rectangle (&rect);/清除画笔:DeleteObject (pen);(11)画框函数DrawFrame其完整源代码及注释介绍如下:/*函数名称:Draw

38、Frame参数:CDC* pDC-指向当前设备上下文的指针HDIB hDIB-指向位图的句柄CRectLink charRect-一个元素为Crect类对象的链表unsigned int linewidth-指出框的宽度COLORREF color-指出框的颜色说明:调用此函数之前要先完成分割操作,否则无法在分割出来的字符外画框。进行分割、标准化操作之后会自动生成一个Crect链表。关于此链表的使用涉及到STL(Standard Template Library)技术,在后面字符分割一节有个简要的介绍。*/void DrawFrame(CDC* pDC,HDIB hDIB, CRectLink

39、 charRect,unsigned int linewidth,COLORREF color)/创建画笔CPen pen;pen.CreatePen (PS_SOLID,linewidth,color);pDC-SelectObject (&pen);/创建一个NULL画刷:SelectObject (*pDC,GetStockObject(NULL_BRUSH);CRect rect,rect2;/锁定位图句柄并获取其指针BYTE* lpDIB=(BYTE*):GlobalLock (HGLOBAL)hDIB);while(!charRect.empty()/从表头上得到一个矩形rect2

40、=rect= charRect.front();/从链表头上面删掉一个charRect.pop_front();/坐标转换/注意,这里原先的rect是相对于图像原点(左下角)的,/而在屏幕上绘图时,要转换以客户区为原点的坐标rect.top =:DIBHeight (char*)lpDIB)-rect2.bottom;rect.bottom =:DIBHeight (char*)lpDIB)-rect2.top ;pDC-Rectangle (&rect);/解除锁定:GlobalUnlock (HGLOBAL)hDIB);至此,图像读取/保存/创建/显示/清除屏幕/画框等11个函数已介绍完毕

41、。再提一下本程序自动刷新的实现。所谓自动刷新,即每当屏幕内容被遮挡或者说客户区需要重画的时候,根据OnPaint消息来自动的刷新客户区。这里我们使用OnPaint和OnDraw一起来实现自动刷新。代码如下:void CChildView:OnPaint() CPaintDC dc(this); OnDraw(&dc);/OnDraw函数void CChildView:OnDraw(CDC *pDC)/如果m_hDIB不为NULL,即表示已经加载了图像文件,那么重画客户区if(m_hDIB!=NULL) DisplayDIB(pDC,m_hDIB);2.3 转化成灰度图灰度图像是指只含亮度信息,

42、不含色彩信息的图像。要表示灰度图像,需要把亮度值进行量化。通常划分为0到255共256个级别,0表示最暗(黑), 255表示最亮(白)。它可以表示为物体的二维光强度函数f (x , y),其中x,y是图像空间点的坐标,任意点(x,y)处的函数值f (x , y)正比于图像在该点的亮度。可以把灰度图像考虑为一个矩阵,其行和列表示为图像的一个点,而相应的矩阵中元素值表示该点的灰度值。一幅彩色图像可表示为:f(x,y)=(R, G, B)其中 R , G ,B 分别为图像坐标(x,y)处的红色、绿色、蓝色分量值。将一幅彩色图像变换为灰度图,根据色度学原理和国际照明委员会(CIE)的RGB颜色表示系统

43、,本研究得到亮度信息,采用如下公式:f (x,y)=(0.299*r+0.587*g+0. 114*b)图像的灰度处理由Convert256toGray 函数完成。2.4 灰度图像二值化 在进行了灰度化处理之后,图像中的每个象素只有一个值,那就是象素的灰度值。它的大小决定了象素的亮暗程度。为了更加便利的开展下面的图像处理操作,还需要对已经得到的灰度图像做一个二值化处理。图像的二值化就是把图像中的象素根据一定的标准分化成两种颜色。在系统中是根据象素的灰度值处理成黑白两种颜色。和灰度化相似的,图像的二值化也有很多成熟的算法。它可以采用自适应阀值法,也可以采用给定阀值法。系统中采用的是给定阀值的方法

44、。因为考虑到所要进行处理的图像大多是从印刷出版物上扫描得来的底色大多为白色所以我们将这个阈值固定为220,读者也可以根据实际的情况来自己进行阈值的设定。图像二值化的函数由ConvertGrayToWhiteBlack实现,源代码如下:2.5 图像的梯度锐化 由于需要处理的图像大多有印刷出版物上扫描而来所以在很多的情况下字体模糊,对识别造成了一定的困难,所以有时我们要对图像进行锐化处理使模糊的图像变得清晰起来,同时可以对噪声起到一定的去除作用。图像锐化的方法有很多,有一种是微分法 ,有一种是高通滤波法,我们在这里所采用的梯度锐化的方法就属于微分法的一种。在这里我们采用Roberts梯度算子对图像

45、进行锐化。定义如下 :设原始图像上的点为。定义在处的梯度矢量为:设一个判定阈值为,变化后的图像定义为: 通过公式可以看出梯度锐化可以让模糊的边缘变得清楚 同时选择合适的阈值还可以减弱和消除一些细小的噪声。本程序中给出了梯度锐化的完整代码,读者也可以根据实际需求、读入图片的质量来选择决定是否使用梯度锐化。事实证明,梯度锐化具备一定的去噪声能力,但同时会对字符的边缘有所损伤。所以笔者建议在图片中字符较为细小的时候不要使用梯度锐化。图像的梯度锐化可以通过函数GradientSharp来实现:2.6去除离散的杂点噪声 图像可能在扫描或者传输过程中夹带了噪声,去噪声是图像处理中常用的手法。通常去噪声用滤

46、波的方法,比如中值滤波、均值滤波。但是那样的算法不适合用在处理字符这样目标狭长的图像中,因为在滤波的过程中很有可能会去掉字符本身的象素。系统采用的是去除杂点的方法来进行去噪声处理的。具体算法如下:扫描整个图像,当发现一个黑色点的时候,就考察和该黑色点间接或者直接相连接的黑色点的个数有多少,如果大于一定的值,那就说明该点不是离散点,否则就是离散点,把它去掉。在考察相连的黑色点的时候用的是递归的方法。去杂点的功能由RemoveScatterNoise、DeleteScaterJudge 两个函数完成。2.7 整体倾斜度调整 因为读进来的图像可能存在倾斜,所以必须对它进行调整,使得字符都处于同一水平

47、位置,那样即便利字符的分割也可以提高字符识别的准确率。调整的算法主要是根据图像上左右两边的黑色象素的平均高度来的。一般来说,众多的字符组成的图像它的左右两边的字符象素的高度应该是处于水平位置附近的,如果两边字符象素的平均位置有比较大的起落,那就说明图像存在倾斜,需要进行调整。具体来说,首先要分别计算图像左半边和右半边的象素的平均高度,然后求的斜率,根据斜率重新组织图像,里面包含了一个从新图像到旧图像的象素的映射。如果新图像中的象素映射到旧图像中时超出了旧图像的范围,则把新图像中的该象素置白色。图像的调整由SlopeAdjust 函数完成。2.8 字符分割 系统在读进来的图像中一般会含有多个数字

48、,识别的时候只能根据每个字符的特征来进行判断,所以还要进行字符分割的工作。这一步工作就是把图像中的字符独立的分割出来。具体的算法如下:第一步,先自下向上对图像进行逐行扫描直至遇到第一个黑色的象素点。记录下来。然后再由上向下对图像进行逐行扫描直至找到第一个黑色象素,这样就找到图像大致的高度范围。第二步,在这个高度范围之内在自左向右逐列进行扫描,遇到第一个黑色象素时认为是字符分割的起始位置,然后继续扫描,直至遇到有一列中没有黑色象素,则认为这个字符分割结束,然后继续扫描,按照上述的方法一直扫描直至图像的最右端。这样就得到了每个字符的比较精确宽度范围。第三步,在已知的每个字符比较精确的宽度范围内,按

49、照第一步的方法,分别进行自上而下和自下而上的逐行扫描来获取每个字符精确的高度范围。字符的分割用CharSegment函数来实现。为了能够清楚的看出图像分割的结果作者在这里设计了一个函数DrawFrame用来在每个已经分割完毕的字符周围画边框,这个画框函数只会起到标识图像的作用,并不会对位图本身的内容造成改变。这里,简要介绍一下STL模板中队列链表deque库的使用。要使用该库,首先要作如下声明:#include #include using namespace std;typedef deque CRectLink;typedef deque HDIBLink;这样,以后用CRectLink就

50、可以定义一个元素为Crect的链表了。HDIBLink也是一个链表,不过其中的元素为位图句柄HDIB。假如用CrectLink定义了一个链表a,那么:a. push_back(rect) 可以将一个矩形区域对象插入到链表后部a. front() 可以读取链表头部的一个矩形对象(只是读取,不删除)a. pop_front() 可以删除链表头部的一个矩形对象a. empty() 如果链表为空,则返回1;否则,为0至此相信对STL模板类中的deque已经有了一个基本的认识。该链表的使用十分方便。2.9图像的归一化处理 因为扫描进来的图像中字符大小存在较大的差异,而相对来说,统一尺寸的字符识别的标准性

51、更强,准确率自然也更高,标准化图像就是要把原来各不相同的字符统一到同一尺寸,在系统实现中是统一到同一高度,然后根据高度来调整字符的宽度。具体算法如下:先得到原来字符的高度,跟系统要求的高度做比较,得出要变换的系数,然后根据得到的系数求得变换后应有得宽度。再得到宽度高度之后,把新图像里面得点按照插值得方法映射到原图像中。图像的标准归一化处理由函数StdDIBbyRect来实现。图像标准归一化的高度和宽度信息可以通过一个对话框由读者自行输入,但是为了以后特征提取的时候处理方便,进行BP网络训练的时候缩短训练的时间,标准化的宽度和高度不要设置的过大。建议去归一化宽度为24,高度为48。2.10图像的

52、紧缩重排 经过标准归一化处理后的各个字符在图像中的位置不定,要它进行特征提取时处理起来比较麻烦,所以要把归一化后的字符进行紧缩重排,以形成新的位图句柄,以方便下一步的特征提取的操作。紧缩重排由函数AutoAlign()来实现,2.11特征提取 经过上面一系列的变换,原来,大小不同,分布不规律的各个字符变成了一个个大小相同,排列整齐的字符。下面就要从被分割归一处理完毕的字符中,提取最能体现这个字符特点的特征向量。将提取出训练样本中的特征向量代入BP网络之中就可以对网络进行训练,提取出待识别的样本中的特征相量代入到训练好的BP网络中,就可以对字符进行识别。特征向量的提取方法多种多样,有逐象素特征提

53、取法,骨架特征提取法,垂直方向数据统计特征提取法,13点特征提取法,弧度梯度特征提取法等很多种方法,根据具体情况的不同我们可以来选择不同的方法。下面几种简单的特征提取方法:A. 逐象素特征提取法这是一种最简单的特征提取方法,对图像进行逐行逐列的扫描当遇到黑色象素时取其特征值为1,遇到白色象素时取其特征值为0,这样当扫描结束以后就形成了一个维数与图像中象素点的个数相同的特征向量矩阵。这种算法可以由函数code实现:* 函数名称: code()* 参量:* BYTE* lpDIBBits 指向输入图像的象素其实位置的指针 * int num 图片中样本的个数* LONG lLineByte 输入图

54、片每行的字节数* LONG lSwidth 预处理时归一化的宽度* LONG lSheight 预处理时归一化的长度* 返回值: double* 特征向量矩阵(二维的)* 函数功能 :* 对于输入样本提取特征向量,在这里把归一化样本的* 每一个象素都作为特征提取出来double* code (BYTE* lpDIBBits,int num, LONG lLineByte,LONG lSwidth,LONG lSheight) /循环变量int i,j,k;BYTE* lpSrc; / 建立保存特征向量的二维数组double *data;/ 为这个数组申请二维存储空间data = alloc_2

55、d_dbl(num,lSwidth*lSheight);/ 将归一化的样本的每个象素作为一个特征点提取出来/逐个数据扫描for(k=0;knum;k+) /对每个数据逐行扫描for(i=0;ilSheight;i+) /对每个数据逐列扫描for(j=k*lSwidth;j(k+1)*lSwidth;j+)/ 指向图像第i行第j列个象素的指针lpSrc = lpDIBBits + i*lLineByte + j;/如果这个象素是黑色的if(*(lpSrc)=0)/将特征向量的相应位置填1dataki*lSwidth+j-k*lSwidth=1;/如果这个象素是其他的颜色 if(*(lpSrc)!=0)/将特征向量的相应位置填0dataki*lSwidth+j-k*lSwidth=0;/返回特征向量矩阵return(data); 这种特征提取方法的特点是算法简单,运算速度快,可以使BP网络很快的收敛,训练效果好,缺点是适应性不强。但可

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!