基于神经网络的车牌识别系统_第1页
基于神经网络的车牌识别系统_第2页
基于神经网络的车牌识别系统_第3页
基于神经网络的车牌识别系统_第4页
基于神经网络的车牌识别系统_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

第一章绪论1.1问题概述随着我国汽车产业的飞速开展,大量在公共场合的汽车需要得到监管,为了更好地进行管理,必须对车辆进行一种确认,而车牌识别就是其中最有效确实认方法,车牌识别LPR是LicensePlateRecognition的简称,他是智能交通系统(IntelligentTransportationSystems,ITS)的一个重要组成局部。车牌识别技术的运用使得“大输入小输出〞成为了可能——输入一幅很大存储量的图像,输出时仅仅是很小存储量的数字,这必然使得其在大量存储和管理数据库相连等方面有无可替代的优越性。车牌识别技术在高速公路收费站、路口监测(电子警察)、大型停车场等场所具有广阔的开展前景。1.1.1问题的来源近几年,我国道路交通迅猛开展,随之也带来了对交通管理自动化的迫切需求。车牌自动识别的研究与开发一直是现代化交通开展中倍受关注的问题,也是制约交通系统智能化、现代化的重要因素。智能交通系统己成为当前交通管理开展的主要方向,而车牌识别技术作为智能交通系统的核心,起着举足轻重的作用。车牌自动识别系统具有广泛的应用范围,主要应用于:(1)高速公路收费、监控管理;(2)小区、停车场管理;(3)城市道路监控、违章管理;(4)车牌登录、验证;(5)车流统计、平安管理等。车牌自动识别系统应用于这些系统,可以解决通缉车辆的自动稽查问题,可以解决车流顶峰期因出入口车流瓶颈造成的路桥卡口、停车场交通堵塞问题,可以解决因工作人员作弊造成的路桥卡口、高速公路、停车场应收款流失的问题,还可以以最简单的方式完成交通部门的车辆信息联网,解决数据统计自动化,模糊查询的问题。车牌自动识别系统可安装于公路收费站、停车场、十字路口等交通关卡处,其具体应用可概括为:(l)交通监控利用车牌识别系统的摄像设备,可以直接监视相应路段的交通状况,获得车辆密度、队长、排队规模等交通信息,防范和观察交通事故。它还可以同雷达测速器或其他的检测器配合使用,以检测违犯限速值的车辆。当发现车辆超速时,摄像机获取该车的图像,并得到该车的牌照号码,然后给该车超速的警告信号。(2)交通流控制指标参量的测量,为到达交通流控制的目标,一些交通流指标的测量相当重要。该系统能够测量和统计很多交通流指标参数,如总的效劳流率,总行程时间,总的流入量流出量,车型及车流组成,日车流量,小时/分钟车流量,车流顶峰时间段,平均车速,车辆密度等。这也为交通诱导系统提供必要的交通流信息。(3)高速公路上的事故自动测报这是由于该系统能够监视道路情况和测量交通流量指标,能及时发现超速、堵车、排队、事故等交通异常现象。(4)对养路费交纳、平安检查、运营管理实行不停车检查根据识别出的车牌号码从数据库中调出该车档案材料,可发现没及时交纳养路费的车辆。另外,该系系统还可发现无车牌的车辆。假设同车型检测器联用,可迅速发现所挂车牌与车型不符的车辆。(5)车辆定位由于能自动识别车牌号码,因而极易发现被盗车辆,以及定位出车辆在道路上的行驶位置。这为防范、发现和追踪涉及车辆的犯罪,保护重要车辆(如运钞车)的平安有重大作用,从而对城市治安及交通平安有重要的保障作用。车牌自动识别系统拥有广阔的应用前景,但假设在每个街口都装配一套全新的车辆探测器的硬件系统那么投资巨大,所以急需一个纯软件实行的车牌自动识别系统来最大限度的减少费用,而纯软件的设计,不仅投资小而且灵活性高,适合我国的国情。1.1.2目的和意义车牌识别LPR是智能交通系统(ITS)的一个重要组成局部。在社会生活,治安管理等方面有很大的作用。车牌识别技术的运用使得“大输入小输出〞成为了可能——输入一幅很大存储量的图像,输出时仅仅是很小存储量的数字,这必然使得其在大量存储和管理数据库相连等方面有无可替代的优越性。1.1.3国内外研究现状从20世纪90年代初,国外就已经开始了对汽车牌照自动识别的研究,其主要途径就是对车牌的图像进行分析,自动提取车牌信息,确定汽车牌号。在各种应用中,有使用模糊数学理论也有用神经元网络的算法来识别车牌中的字符,但由于外界环境光线变化、光路中有灰尘、季节环境变化及车牌本身比拟模糊等条件的影响,给车牌的识别带来较大的困难。国外的相关研究有:(1)JBarroso提出的基于扫描行高频分析的方法;(2)I.T.Lancaster提出的类字符分析方法等.为了解决图像恶化的问题,目前国内外采用主动红外照明摄像或使用特殊的传感器来提高图像的质量,继而提高识别率,但系统的投资本钱过大,不适合普遍的推广.车牌识别系统中的两个关键子系统是车牌定位系统和车牌字符识别系统。关于车牌定位系统的研究,国内外学者已经作了大量的工作,但实际效果并不是很理想,比方车牌图像的倾斜、车牌外表的污秽和磨损、光线的干扰等都是影响定位准确度的潜在因素。为此,近年来不少学者针对车牌本身的特点,车辆拍摄的不良现象及背景的复杂状况,先后提出了许多有针对性的定位方法,使车牌定位在技术和方法上都有了很大的改善.然而现代化交通系统不断提高的快节奏,将对车牌定位的准确率和实时性提出更高的要求。因而进一步加深车牌定位的研究是非常必要的。车牌字符识别是在车牌准确定位的根底上,对车牌上的汉字、字母、数字进行有效确认的过程,其中汉字识别是一个难点,许多国外的LPR系统也往往是因为汉字难以识别而无法打入中国市场,因而探寻好的方法解决字符的识别也是至关重要的.目前己有的方法很多,但其效果与实际的要求相差很远,难以适应现代化交通系统高速度、快节奏的要求。因而对字符识别的进一步研究也同样具有紧迫性和必要性。从实用产品来看,如以色列的Hi-Tech公司研制的多种See/Carsystem,适应于几个不同国家的车牌识别,就针对中国格式车牌的See/Carsyste而言,它不能识别汉字,且识别率有待提高。新加坡Optasia公司的VLPRS产品,适合于新加坡的车牌,另外日本、加拿大、德国、意大利、英国等西方兴旺国家都有适合于本国车牌的识别系统。我国的实际情况有所不同,国外的实际拍摄条件比拟理想,车牌比拟标准统一,而我国车牌标准不够,不同汽车类型有不同的规格、大小和颜色,所以车牌的颜色多,且位数不统一,对处理造成了一定的困难。在待处理的车牌图像中就有小功率汽车使用的蓝底白字牌照,大功率汽车所用的黄底黑字牌照,军车和警车的白底黑字,红字牌照,还有国外驻华机构的黑底白字牌照等。就位数而言,有七位数字的,有武警车九位数字的,有军车、前两位字符上下排列的等,所以也造成了处理的难度。国内做得较好的产品主要是中科院自动化研究所汉王公司的“汉王眼〞,此外国内的亚洲视觉科技、深圳市吉通电子、中智交通电子系统等都有自己的产品,另外西安交通大学的图像处理与识别研究室、上海交通大学的计算机科学与工程系、清华大学、浙江大学等都做过类似的研究。通常处理时为了提高系统的识别率,都采用了一些硬件的探测器和其他的辅助设备如红外照明等,其中“汉王眼〞就是采用主动红外照明和光学滤波器来减弱可见光的不可控制影响,减少恶劣气候和汽车大小灯光的影响,另外还要求在高速公路管理窗口到“汉王眼〞识别点埋设两条线路管道,一条管道铺设220伏50赫兹1安培的交流供电线路:另一条管道铺设触发信号线路和汉王眼与管理计算机的通讯线路,投资巨大,不适合于大面积的推广。另外,还有两种专门的技术被用于车牌的识别中,条形码识别技术和无线射频技术。条形码识别要求预先在车身上印刷条形码,在系统的某一固定位置上安装扫描设备,通过扫描来读取条形码,以到达识别车辆的目的。无线射频技术要求在车内安装标示卡,在系统某一位置安装收发器等装置,通过收发器来接受标示卡的信号,从而识别出经过的车辆。显然,这两种技术更难以推广。从目前一些产品的性能指标可以看出,车牌识别系统的识别率和识别速度有待提高。现代交通的飞速开展以及车牌识别系统应用范围的日益拓宽给车牌识别系统提出了更高的要求。因此,研究高速、准确的定位与识别算法是当前的主要任务,而图像处理技术的开展与摄像设备、计算机性能的提高都会促进车牌识别技术的开展,提高车牌识别系统的性能。1.2问题剖析车牌识别系统是一个比拟复杂的系统,在下面将做详细介绍。1.2.1主要问题由于光照、气候引起的车牌图像上字符光照不均,车牌本身污损造成的字符笔画不清和字符间粘连,汽车行驶速度较快,使拍摄出的车牌字符产生变形、模糊不清,因此图像需要增强。另外又由于拍摄角度及拍摄点的高度、路面的倾斜等情况造成了车牌图像的倾斜,从而需要对车牌进行校正。另外字符的识别也是一个重点问题,我们这里采用基于神经网络的字符识别,提高了车牌字符的识别率。1.2.2难点和关键把彩色的256BMP图进行灰度转换是问题的根底,采用基于空域的图像增强,图像得到增强,在增强的根底上对图像二值化是图像倾斜校正的关键,在二值图像的根底上运用Hough变换求出图像的倾斜角度,图像进行旋转,继而对车牌图像进行边框切除和字符切割,最后利用训练好的神经网络对切割出来的字符图像进行识别。整个系统的难点在于神经网络的识别局部,在这一块需要大量的样本对神经网络进行训练。1.2.3思路和方法借助数字图像处理技术,我们对车牌图像依次进行以下处理:彩色的256色的BMP图进行灰度转换->灰度变换〔图像增强〕->中值滤波->图像二值化->倾斜校正〔Hough变换〕->边框切除->字符切割->神经网络的字符识别,最后得出车牌字符。1.3本文的结构第一章:绪论介绍本系统要解决的问题。第二章:系统运用到的相关知识和工具介绍了开发本系统所用到的根底知识和开发本系统所需要的工具。第三章:系统的总体设计对本系统的总体结构进行概括的描述。第四章:系统的详细设计对本系统的功能模块进行详细的解释说明。第五章:系统模块程序编码对本系统各主要模块代码进行说明。第六章:问题和展望对设计的系统进行整体的评价。第七章:结束语第二章相关的知识和工具2.1解决问题的知识VC开发平台简介VisualC++(简称VC)是微软公司推出的一个面向对象的、功能丰富的可视化重量级开发工具。利用VisualC++提供的高效Windows编程环境,我们可以编写与其它软件开发工具相比,VisualC++的强大功能表现在:第一,它是C和C++混合编译器,使得VisualC++的开发程序具备了C和C++的高效简洁的特点。第二,VisualC++是一个面向对象的语言,使得软件能够在源码级、类级、控件级等多个级别上重用,软件的开发效率大为加快。第三,VisualC++借助于微软公司的MFC类库和应用程序框架,能够轻易开发出Windows标准界面的应用程序。2.1.2数字图像处理数字图像处理一般是指通过数字计算机处理二维图像。更广义地讲,它包括对任何二维数据的数字处理。计算机图像处理按其输入、输出形式可以分为下述几种类型:(1)从图像到图像,输入和输出均为图像。这种处理技术主要有图像增强、图像复原和图像编码。图像增强是增强图像中的某些特征,使处理后的图像更适合于人眼观察和机器分析。例如:对图像的灰度值进行修正,可以增强图像的比照度;对图像进行平滑,可以抑制混入图像的噪声;利用锐化技术可以增强图像的边缘轮廓;利用几何校正技术可以校正遥感图像的几何畸变;将灰度值表示转换为伪彩色表示,可以使人眼分辨出更多的图像细节。图像复原是根据图像退化的原因,建立退化“模型〞,按逆过程进行处理,使处理后的图像更逼近原始真实图像。图像复原与图像增强均能提高图像的质量,但它们有一重要的区别,即图像复原要求提高图像的逼真度,而图像增强只是改善图像的视觉效果,并不要求逼近原始图像。一副原始真实图像不能再复原一次,但可以用锐化技术进一步增强。图像压宿编码是在保持一定图像质量的条件下,以尽可能少的比特来表示图像。(2)从数据到图像其输入为数据、公式、计算结果和曲线,输出为图像。这类图像处理技术包括图像分割、特征提取、图像识别等。人们将这这类处理称为图像分析或图像理解。(3)从图像的数据到图像这种类型的图像处理主要用于图像传输。要求把图像信息压缩成为便于传输的数据而不能丢掉信息,传到远端后再形成保真实度高的图像以供观看。这种类型的处理方法称为图像压缩,以广泛应用于因特网上的传输和遥感图像的传输。2.1.3BP神经网络目前,常用的神经网络主要有BP神经网络、Hopfield网络、Kohonen网络等,由于神经网络自身的复杂性,选用哪种类型的网络并没有最优化的方式,主要是针对神经网络进行分类的样本类型、数量决定.出于对机动车号牌自身特点的考虑,采用BP神经网络对机动车号牌进行训练和识别.BP神经网络采用误差反向传播学习算法,该网络可将一组样本的I/O问题转化为一个非线性优化问题,并可近似实现从输入到输出的任意连续的非线性映射.BP神经网络不仅有输入节点、输出节点,而且有隐含层节点(可以是一层或多层,本文采用含一个隐含层的网络),如下图。该算法分为两个阶段,第一阶段是正向传播,第二阶段是反向传播.在正向传播过程中,对号于输入信,要先向前传播到隐节点,经过作用函数后,再把隐节点的输出信息传播到输出节点,最后给出输出结果,其中每一层神经元的状态只影响下一层神经元的状态。如果在输出层不能得到期望输出,那么转入反向传播,将误差信号沿原来的连接通路返回,通过修改各层神经元的权值,使得误差到达最小。(X1,X2...Xn)输入向量组,(Y1,Y2....Yn)输出向量组。最下面一层为输入层,中间一层为隐含层,最上面一层为输出层。2.2开发平台开发平台包括硬件平台和软件平台。硬件平台指开发与运行所需要的硬件环境,主要包括计算机机型和硬件配置。本系统是一个车牌识别系统,只要配置有P3处理器、64内存、20G硬盘〔或以上〕的普通微机就可以顺利运行。软件平台指开发与运行所需要的软件环境。本系统是在WindowsXP环境下开发,兼容当前主流操作系统Windows95/98/NT/Me/2000/XP,前台开发环境:VisualC++6.0。第三章总体设计3.1总体设计的框架车牌识别系统流程图输入车牌图片图片预处理车牌边框切除字符分割神经网络的字符识别读出识别出的车牌号码图3-1系统流程图基于神经网络的车牌识别系统主要分为三个子模块:1,车牌图片的预处理;2,车牌边框的切除和字符分割;3,神经网络的字符识别。车牌图片的预处理包括图像灰度化,图像增强,二值化,中值滤波和图像的倾斜校正五个局部;车牌边框切除和字符分割包括车牌边框的切除和字符的分割两个局部;神经网络的字符识别包括神经网络的训练和神经网络字符的识别两个过程。其中车牌图片的预处理由我完成,车牌边框的切除和字符分割由肖穴祯完成,最后神经网络的字符识别这个模块由尹维完成。车牌识别系统结构图车牌识别系统字符识别字符分割边框切除倾斜校正中值滤波二值化图像增强图像灰度化字符识别字符分割边框切除倾斜校正中值滤波二值化图像增强图像灰度化图3-2车牌识别结构图从图3-2可以看出,本文的车牌识别系统主要由七个局部组成,即:灰度化、图像增强、二值化、中值滤波、倾斜校正、边框切除、字符分割和字符识别。从总体看,这其中的每一局部是车牌识别过程的一个步骤,但从局部而言,它们其中任何一局部都可以作为一类方法来研究.3.2模块功能概述图像灰度化灰度化是将彩色图像转化为灰度图像。由于彩色图像的信息量很大,有必要将它转化为灰度图,这样有利于后期的特征提取和识别。在实验中,对于所摄取的每一幅汽车图像进行格式转换。3.2.2图像增强图像增强:由于白天和夜晚、晴天和阴天的光线强度有很大差异,在某些情况下拍摄的牌照出现比照度缺乏的现象,使图像的细节分辨不清,严重干扰字符的识别。因此对于这类牌照必须进行图像增强,而这种图像增强处理应尽量防止对正常的牌照产生干扰,为此可采用基于点运算的图像增强方法,即对图像的灰度级进行变换。使图像比照度得到调整,从而到达图像增强的目的。二值化二值化是将灰度图像转换为只有黑和白两种色彩的图像,白色像素点(灰度值255)取1.黑色像素点(灰度值0)取0。由于在后期提取字符图像的特征时,需要进行大量的计算,因此为了减少计算量和便于特征的提取,需要进一步将灰度图转化为二值图像。中值滤波中值滤波,由于牌照受干扰而降低了图像质量,因此需要进行图像滤波去噪,我们采用中值滤波除噪滤波,取得了较明显的效果。3.2.5倾斜校正倾斜校正针对拍摄角度不正等因素所引起的车牌图像倾斜进行校正.车牌图像如果不能校正将严重影响到后面的车牌边框切除和字符的分割,这里我们采用Hough变换求车牌的倾斜角度,然后对车牌图像进行旋转,进而实现对车牌的校正。边框切除由于车牌上下边框的干扰对车牌的分割非常不利,因此,必须去除车牌的上下边框。在这里我们采用首先对车牌图像的所有行点象素灰度值为0的点进行统计,求出其每行黑点数目的分布,再进行排序,让每行黑点个数低于常数C的所有行全部切除。同理对列采用相同的方法进行处理。字符分割字符分割是把车辆的牌照切割成单一字符,这样有利于对每一个字符进行特征的提取和识别。字符识别字符识别对车牌字符进行识别通常采用模板法和神经网络。本系统采用神经网络的车牌字符识别。3.3关键算法3.3.1灰度化处理由彩色转换为灰度的过程叫做灰度化处理。灰度图像就是只有强度信息,而没有颜色信息的图像,存储灰度图像只需要一个数据矩阵,矩阵的每个元素表示对应位置的像素的灰度值。彩色图像的象素色为RGB(R,G,B),灰度图像的象素色为RGB(r,r,r),R,G,B可由彩色图像的颜色分解获得.而R,G,B的取值范围是0-255,所以灰度的级别只有256级。灰度化的处理方法主要有如下三种:(1)最大值法:使R.G,B的值等于三值中最大的一个,即R=G=B=max(R,G,B)(3-1)(2)平均值法:使R,G,B·的值值等于三值和的平均值,即R=G=B=R+G+B(3-2)3(3)加权平均值法:根据重要性或其它指标给R,G,B赋予不同的权值,并使R,G,B等于它们的值的加权和平均,即R=G=B=WrR十WcG十WaB(3-3)3其中WrWc,Wa,分别为R,G,B的权值。由于人眼对绿色的敏感度最高,对红色的敏感度次之,对蓝色的敏感度最低,当Wr=0.30,Wa=0.59,Wc=0.11时,能得到最合理的灰度图像。这里我们采用的是加权平均值法,在程序里面我们取Wr=0.299,Wa=0.587,Wc=0.114来更新调色板信息:bMap[i]=(BYTE)(0.299*lpbmc->bmciColors[i].rgbtRed+0.587*lpbmc->bmciColors[i].rgbtGreen+0.114*lpbmc->bmciColors[i].rgbtBlue+0.5),然后更新每个像素的颜色索引,最后实现对整幅彩色图像的灰度化处理。空域图像增强空域图像增强是直接对图像中的像素进行处理,根本上是以灰度映射为根底的,映射变换的类型取决于增强的目的。空域图像增强的方法主要有:比照度增强、直方图修正、图像平滑、图像锐化等。在这里我们对车牌图像进行处理目的就是突出显示其车牌字符,增大车牌背景与字符的比照度,所以我们采用比照度增强的方法。比照度增强是一种比拟简便但又十分重要的空域法。这种处理只是逐点修改输入图像每一个像素的灰度,图像个像素的位置并不改变,是一种输入与输出像素间一对一的运算。比照度增强又叫点运算。比照度增强一般用来扩大图像的灰度范围。设输入图像的灰度记为f(x,y),输出图像灰度记为g(x,y),那么比照度增强数学上可表达成g(x,y)=T[f(x,y)](3-4)图像输出与输入灰度之间的映射关系完全由函数T确定。本系统采用的是比照度增强中的分段线性变换法。分段线性变换法通常都是分成3段,如图3-3所示。这种变换的数学表示如下:(c/a)f(x,y)0<=f(xy)<=ag(x,y)=[(b-c)/(b-a)][f(x,y)-a]+ca<=f(xy)<=b[(Mg-d)/(Mf-b)][f(x,y)-b]+bb<=f(xy)<=Mf(3-5)g(x,y)Mgdcf(x,y)0abMf图3-3分段线性变换滤波刚获得的图像有很多噪音。这主要由于平时的工作和环境引起的,图像增强是减弱噪音,增强比照度。想得到比拟干净清晰的图像并不是容易的事情。为这个目标而为处理图像所涉及的操作是设计一个适合、匹配的滤波器和恰当的阈值。常用的有高斯滤波、均值滤波、中值滤波、最小均方差滤波、Gabor滤波。由于高斯函数的傅立叶变换仍是高斯函数,因此高斯函数能构成一个在频域具有平滑性能的低通滤波器。可以通过在频域做乘积来实现高斯滤波。均值滤波是对是对信号进行局部平均,以平均值来代表该像素点的灰度值。矩形滤波器(AveragingBoxFilter)对这个二维矢量的每一个分量进行独立的平滑处理。通过计算和转化,得到一幅单位矢量图。这个512×512的矢量图被划分成一个8×8的小区域,再在每一个小区域中,统计这个区域内的主要方向,亦即将对该区域内点方向数进行统计,最多的方向作为区域的主方向。于是就得到了一个新的64×64的矢量图。这个新的矢量图还可以采用一个3×3模板进行进一步的平滑。本系统采用的是中值滤波。中值滤波是常用的非线性滤波方法,也是图像处理技术中最常用的预处理技术。它在平滑脉冲噪声方面非常有效,同时它可以保护图像锋利的边缘。加权中值滤波能够改良中值滤波的边缘信号保持效果。中值滤波步骤如下:1,将模板〔一般含有奇数个点的滑动窗口〕在图像范围内漫游,并将模板中心与图中某个象素位置重合;2,读取模板中各对应象素的灰度值;3,将这些灰度值从小到大排列;4,找到这些值中排在中间的一个值;5,将这个中间值赋给对应模板中心位置的象素。中值滤波器的主要功能就是使与周围象素灰度值相差比拟大的象素取与周围象素灰度值接近的值,从而消除孤立的噪声点。由于这种方法不是简单地取平均值,所以产生的模糊度较小。Hough变换Hough变换是变换域提取直线的方法,将直线上点的坐标变换到过点的直线的系数域,巧妙利用了共线与直线相交的关系,使直线的提取问题变换为计数问题,主要优点是受直线中的间隙和噪音影响较小。使用Hough变换提取出边缘直线后,就可以提取出牌照的倾斜度了。对于Oxy平面上给定的一条直线Y=ux+v,(其中U和V分别为直线的斜率和直线的截距),对应于一个数对(u,v),反之,给定一个数对(u,v)那么对应于一条直线y=ux+v,即:如Oxy平面上有一条直线Y=ux+v,那就和Ouv平面上的一个点(x,y)一一对应,同理,Ouv平面上的一条直线v=-xu+y和Oxy平面上有一个点(x,y)也是一一对应的。如果Oxy平面上有一条直线y=ux+v,那上面的每个点都对应于Ouv平面上的一条直线,这些直线相交于一点,利用这个重要性质可以检测共线点。由于直线的斜率可能会接近无穷大,为了使变换域有意义,需要采用直线方程的法线式表示:p=xcos(θ)+ysin(θ),其中,P为直线到坐标系原点的距离,θ为直线法线与X轴的夹角。于是极坐标上的一点对应了Oxy平面坐标上的一条直线,而Oxy平面坐标上的一点对应于极坐标上的一条曲线,而且易知Oxy平面坐标上的共线点所对应的极坐标上的所有曲线相交于一点,且由于Oxy平面坐标上的一条直线上的各点都对应于极坐标上的一点,如果对过这一点的曲线进行计数,结果会是比拟大的数据。通过这一原理,可以很方便地提取出图像上的直线。Hough变换如图3-4,3-5所示:图3-4图3-5P直线到原点的距离,θ直线法线与X轴的夹角。如图3-4所示图中直线上的三点1,2,3对应于图3-5中的三条曲线,因为1,2,3三点在一条直线上所以在图3-5图中的三条曲线交于一点。3.3.4边框切除将车牌图像像进行二值化后,图像仅黑、白二值。白色像素点(灰度值255)取1,黑色像素点(灰度值0)取0。由于车牌上下边框的干扰对车牌的分割非常不利,因此,必须去除车牌的上下边框。车牌图像中字符上下边沿处像素灰度值是我们首先想到的依据。如果横向扫描牌照图像,理想情况下字符区域的亮暗跳变频繁,而背景区域没有跳变。对于黑底白字且没有其他干扰的牌照图像而言,字符的左右间隔处的竖直投影值应该为零。但实际处理中,由于前面车牌的定位不可能做到恰好卡在牌照的边框上,即使卡在边框上,在牌照的上下边缘处会有许多其它的干扰。在这些干扰中:有的是牌照上本身有与字符的灰度值相同的矩形框;有的那么是牌照上的铆钉;有的那么是牌照本身的污秽,还有的那么是由于汽车行驶速度较快,造成的字符变形和模糊。无论是那种干扰都对分割不利,因为它使原来应该作为分割依据的零值投影点的数值不为零。为了不受上下边框的干扰,我们采用的行扫描方法是由车牌商度的上面1/3处往上扫描,车牌高度的下面1/3处往下扫描。为了更加准确的区分,我们将字符区域在整个牌照中大致的位置(即高度比例信息)作为先验知识,限定由扫描得到的判别点.字符与背景的分割处有明显的从白到黑的跳变,当搜索到字符与背景的分界行时,将这个分界行所界定的字符区域之外局部全部切除。对于下边框,左右边框干扰的去除,除了加上牌照本身的长宽约束之外,方法大致一样。3.3.5字符分割我们采用的方法是:首先进行扫描,由上向下扫描,扫描过程中不断判断该行像素点的灰度值,直到扫描发现第i行某点像素灰度值为0〔黑点〕,停止扫描,把此时高度作为字符大致的最高点;接着由下向上扫描,扫描过程和上面相同,直到扫描发现第j行某点像素灰度值为0〔黑点〕,停止扫描,把此时高度作为字符大致的最低点;然后由左向右列扫描图像,扫描过程和上面相同,不同的是统计的是一列的黑像素点的个数,扫描发现第m列黑色像素个数不为0,把此列作为字符大致的左边界,继续向右扫描发现第n列黑色像素点个数为0,把此列作为字符的右边界,这样就完成了对一个字符的切割,其他剩余字符的切割方法相同。3.3.6BP神经网络算法典型的BP网络是三层,即:输入层、隐含层和输出层。各层之间实行全连接。如图3-6所示。图3-6(X1,X2...Xn)输入向量组,(Y1,Y2....Yn)输出向量组。最下面一层为输入层,中间一层为隐含层,最上面一层为输出层,θj为输入层神经元,θi为中间层神经元,Wij输入层到中间层的权值,Wji中间层到输出层的权值。BP网络的学习,由四个过程组成:输入模式由输入层经中间层向输出层的“模式顺序传播〞过程,网络的希望输出与网络实际输出之差的误差信号由输出层经中间层向输入层逐层修正连接权的“误差逆传播〞过程,由“模式顺序传播〞与“误差逆传播〞的反复交替进行的网络“记忆训练〞过程,网络趋向收敛即网络的全局误差趋向极小值的“学习收敛〞过程。归结起来为,“模式顺序传播〞->“误差逆传播〞->“记忆训练〞->“学习收敛〞过程。3.4关键技术(1)空域图像增强。本文采用的是分段变换线性图像增强,为了突出感兴趣的目标或灰度区间,相对抑制那些不感兴趣的灰度区间,可采用分段线性变换法,本系统采用的是三段线性变换法。(2)中值滤波。中值滤波即可以消除噪声又可以保持图像的细节。(3)Hough变换。通过Hough变换,求出图像中直线的倾斜角度,既而得出图像的倾斜角度,再对图像进行校正。(4)BP神经网络。神经网络能大规模的并行处理和分布式信息存储,良好的自适应性、自组织性,很强的学习功能、联想功能和容错功能,其识别率高,抗干扰能力强,灵活性大,但学习过程较长。第四章详细设计4.1模块流程图输入车牌图片图像灰度化图像增强二值化中值滤波倾斜校正输出可边框切除的二值图像图4-1图像预处理模块流程图4.2模块结构图图像预处理理图像预处理理倾斜校正中值滤波图像灰度化二值化图像增强倾斜校正中值滤波图像灰度化二值化图像增强图4-2图像预处理模块结构图为提高牌照的字符识别率,有必要设计一个高效的预处理算法,对以上各种原因造成的字符畸变进行统一的处理,以便得到较为清晰的待识别的单个字符。从图4.1可以看出,本文的车牌识别系统预处理过程主要由五个局部组成,即:灰度化、图像增强、二值化、中值滤波、倾斜校正,通过以上步骤的处理为以后的边框切除、字符分割和字符识别打下了根底。4.2重要模块详述图像灰度化汽车图像样本,目前大都是通过摄像机、数码相机等设备拍摄获取的,因而预处理前的图像都是彩色图像。真彩色图像又称RGB图像,它是利用R,G,B3个分量表示一个像素的颜色,R,G,B分别代表红、绿、蓝3种不同的颜色,通过三基色可以合成出任意颜色。所以对一个尺寸为m*n的彩色图像来说,存储为一个二m*n*3的多维数组。如果需要知道图像A中(x,y)处的像素RGB值,那么可以使用这样的代码A(x,y,1:3)。彩色图像包含着大量的颜色信息,不但在存储上开销很大,而且在处理上也会降低系统的执行速度。由于图像的每个象素都具有三个不同的颜色分t,存在许多与识别无关的信息,不便于进一步的识别工作,因此在对图像进行识别等处理中经常将彩色图像转变为灰度图像,以加快处理速度。数字图像分为彩色图像和灰度图像。在RGB模型中,如果R=G=B,那么颜色表示一种灰度颜色,其中R=G=B的值叫做灰度值.由彩色转换为灰度的过程叫做灰度化处理。灰度图像就是只有强度信息,而没有颜色信息的图像,存储灰度图像只需要一个数据矩阵,矩阵的每个元素表示对应位置的像素的灰度值。彩色图像的象素色为RGB(R,G,B),灰度图像的象素色为RGB(r,r,r),R,G,B可由彩色图像的颜色分解获得.而R,G,B的取值范围是0-255,所以灰度的级别只有256级。灰度化的处理方法主要有如下三种:(1)最大值法:使R.G,B的值等于三值中最大的一个,即R=G=B=max(R,G,B)(4-1)(2)平均值法:使R,G,B的值值等于三值和的平均值,即R=G=B=R+G+B(4-2)3(3)加权平均值法:根据重要性或其它指标给R,G,B赋予不同的权值,并使R,G,B等于它们的值的加权和平均,即R=G=B=WrR十WcG十WaB(4-3)3其中WrWc,Wa,分别为R,G,B的权值。由于人眼对绿色的敏感度最高,对红色的敏感度次之,对蓝色的敏感度最低,当Wr=0.30,Wa=0.59,Wc=0.11时,能得到最合理的灰度图像。这里我们采用的是加权平均值法,在程序里面我们取Wr=0.299,Wa=0.587,Wc=0.114来更新调色板信息:bMap[i]=(BYTE)(0.299*lpbmc->bmciColors[i].rgbtRed+0.587*lpbmc->bmciColors[i].rgbtGreen+0.114*lpbmc->bmciColors[i].rgbtBlue+0.5),然后更新每个像素的颜色索引,最后实现对整幅彩色图像的灰度化处理。图像增强图像增强。图像增强技术经常用于改善图像中某种特征的可探测性。从而使计算机更容易识别和分析。图像增强技术主要包括直方图修正、图像平滑化处理、图像锋利化处理以及伪彩色技术等。在实用中可以采用单一方法处理,也可以采用多种方法联合处理,以便到达预期的增强效果。图像增强技术根据其处理空间不同,可分为基于空间域的方法和基于变换域的方法。本文采用的是基于空域变换的图像增强法。直接修改图像象素点的灰度级是空域增强中的一种简单而有效的方法。通常根据图像降质现象的不同而采取不同的修正方法。通常的方法有三种:一种是灰度级的修正,它是修改个别图像象素点的灰度级以补偿原来记录图像时的不均匀曝光;第二种形式为灰度级映射变换,其目的在于统一的方法改变整个图像的灰度或改变图像的一些区域的灰度,以便能增加比照度,从而能使图像细节更容易看清;第三种方法就是直方图修正,它能使图像具有期望的灰度分布,从而能有选择地突出所需要地图像特征。本系统采用的是灰度变换法中的分段线性变换。和直方图均衡相比分段线性变换更能突出感兴趣的目标或灰度区间,相对抑制那些不感兴趣的灰度区间。采用分段线性变换法,如图4-3所示。其图像表达式为:(c/a)f(x,y)0<=f(xy)<=ag(x,y)=[(b-c)/(b-a)][f(x,y)-a]+ca<=f(xy)<=b[(Mg-d)/(Mf-b)][f(x,y)-b]+bb<=f(xy)<=Mf(4-4)g(x,y)Mg-----------------------------d--------------------c-------------f(x,y)0abMf图4-3分段线性变换函数进过图像增强处理的车牌图片处理前与处理后比照方图4-4,4-5所示:图4-4图4-5二值化图像二值化是指整幅图像画面内仅黑、白二值的图像。在数字图像处理中二值图像占有很重要的地位。这是因为,一方面,有些需要处理的如文字图像、指纹图像、工程图纸等图像本身是二值的;另一方面,在某些情况下即使图像本身是有灰度的,我们也设法使它变成二值图像再进行处理〔即灰度图像的二值化〕。这是考虑到在实用系统中,要求处理的速度高、本钱低、信息量大的浓淡图像处理的花销大。此外二值化的图像能够用几何学中的概念进行分析和特征描述,比灰度图像优势大得多。在实际的车牌处理系统中,进行图像二值化的关键使确定适宜的阈值,使得字符与背景能够分割开来,而且二值变换的结果图像必须要具备良好的保形性,不丢掉有用的形状信息,不会产生额外的空缺等。同时车牌识别系统要求处理的速度高、本钱低、信息量大,采用二值图像进行处理,能大大提高处理效率。二值化的关键是找到适宜的阈值t来区分对象和背景。设原灰度图像为f(x,y),二值化后的图像为g(x,y),二值化的过程表示如下:0f(x,y)<tg(x,y)=(4-5)255f(x,y)>t二值化,基于实时性的要求,我力求寻找一种快速而且效果较好的方法,能够更有针对性的解决在不同条件下牌照图像的二值化问题。求解阈值的方法很多,微分直方图法、最大方差法、基于灰度的数学期望的方法、可变阈值法等。我们采用最简单的方法,当象素灰度级低于常数C时,[0-C]象素灰度为0,[C-255]象素灰度为255。进过二值化处理的车牌图像处理前与处理后比照方图4-6,4-7所示:图4-6图4-7中值滤波中值滤波,由于牌照受干扰而降低了图像质量,因此需要进行图像滤波去噪。因为低通滤波器在消除噪声的同时会将图像中的一些细节模糊掉,如果竟要消除噪声又要保持图像的细节所以我们采用使用中值滤波,这是一种非线性平滑滤波。中值滤波步骤如下:1,将模板〔一般含有奇数个点的滑动窗口〕在图像范围内漫游,并将模板中心与图中某个像素位置重合;2,读取模板中各对应像素的灰度值;3,将这些灰度值从小到大排列;4,找到这些值中排在中间的一个值;5,将这个中间值赋给对应模板中心位置的象素。中值滤波器的主要功能就是使与周围象素灰度值相差比拟大的象素取与周围象素灰度值接近的值,从而消除孤立的噪声点。由于这种方法不是简单地取平均值,所以产生的模糊度较小。在系统中我们采用的是3*1模板,也就是说模板长度为3,宽度为1,将此模板在图像范围内漫游,并将模板中心与图像中某个像素位置重合,并读取模板中3个像素的灰度值,然后对模板中3个像素的灰度值调用GetMedianNum()函数进行冒泡排序,并返回其中值,把中值作为模板中心像素的灰度值,当模板漫游完整幅图像,也就完成了整幅图像的中值滤波处理。中值滤波处理的车牌图像处理前与处理后比照方图4-8,4-9所示:图4-8图4-9倾斜校正倾斜校正,由于拍摄角度等原因造成了车牌图像的倾斜,那么必须给予校正,否那么将无法进行单个字符的正确分割,字符识别的误差率会上升。但假设以某个固定的经验值对所有牌照统一进行旋转处理,又会使原本正常的牌照倾斜,导致新的错误。因此有必要针对特定的牌照图像,提取其倾斜角度,再加以相应的旋转处理。如何从牌照中自动提取其倾斜度,是预处理过程中的一个难点。采用Hough变换的方法,实验室校正的准确率到达了99%,证明此方案是可行的。Hough变换是变换域提取直线的方法,将直线上点的坐标变换到过点的直线的系数域,巧妙利用了共线与直线相交的关系,使直线的提取问题变换为计数问题,主要优点是受直线中的间隙和噪音影响较小。使用Hough变换提取出边缘直线后,就可以提取出牌照的倾斜度了。对于Oxy平面上给定的一条直线Y=ux+v,(其中U和V分别为直线的斜率和直线的截距),对应于一个数对(u,v),反之,给定一个数对(u,v)那么对应于一条直线y=ux+v,即:如Oxy平面上有一条直线Y=ux+v,那就和Ouv平面上的一个点(x,y)一一对应,同理,Ouv平面上的一条直线v=-xu+y和Oxy平面上有一个点(x,y)也是一一对应的。如果Oxy平面上有一条直线y=ux+v,那上面的每个点都对应于Ouv平面上的一条直线,这些直线相交于一点,利用这个重要性质可以检测共线点。由于直线的斜率可能会接近无穷大,为了使变换域有意义,需要采用直线方程的法线式表示:p=xcos(θ)+ysin(θ),其中,P为直线到坐标系原点的距离,θ为直线法线与X轴的夹角。于是极坐标上的一点对应了Oxy平面坐标上的一条直线,而Oxy平面坐标上的一点对应于极坐标上的一条曲线,而且易知Oxy平面坐标上的共线点所对应的极坐标上的所有曲线相交于一点,且由于Oxy平面坐标上的一条直线上的各点都对应于极坐标上的一点,如果对过这一点的曲线进行计数,结果会是比拟大的数据。通过这一原理,可以很方便地提取出图像上的直线。在提取车牌倾斜度时,先对所有列进行扫描,提取出所有第一次从O一1的可能边界点,再进行Hough变换,得到的直线的倾斜度即为所求。在求得图像的倾斜角度后在把整个图像进行倾斜校正,即可得校正后的图像。在实现车牌图像的倾斜校正过程中,遇到的一些困难,主要是求出的倾斜角度精确度不高,最后在图像的倾斜校正中出现很大的误差,分析其原因主要是由于Hough变换中角度的步长太大,如果我们把步长变小,却又会造成处理时间过长,后来查了些资料,终于找到一种适宜的方法,图的编号等处理前图像处理后图像Hough变换提的取直线Hough变换提的取直线第五章程序编码5.1数据结构CRectLinkcharRect1,charRect2;//用来保存每个字符区域的链表doubleout[][6]//神经网络理想输出结果constBYTEColorsTable[COLOR_SCALE_COUNT][256][4]//编码表RGB数组 double*input_unites; //指向输入层数据的指针 double*hidden_unites;//指向隐层数据的指针 double*output_unites;//指向输出层数据的指针 double*hidden_deltas;//指向隐层误差数据的指针 double*output_deltas;//指向输出层误差数剧的指针 double*target;//指向理想目标输出的指针 double**input_weights;//指向输入层于隐层之间权值的指针 double**hidden_weights;//指向隐层与输出层之间的权值的指针 double**input_prev_weights;//指向上一此输入层于隐层之间权值的指针 double**hidden_prev_weights;//指向上一此隐层与输出层之间的权值的指针5.2主要界面系统主界面如图5-1图5-1系统主窗口分段线性灰度变换如图5-2图5-2分段线性灰度变换窗口图像二值化如图5-3图5-3图像二值化窗口5.3重要模块程序实现图像灰度化车牌图片首先经过灰度化处理。图像灰度化流程图如图5-4所示:输入车牌图片获得指向图像的句柄获得指向图像的句柄更新DIB调色板更新DIB调色板更新像素的颜色索引更新像素的颜色索引输出车牌图像的灰度图图5-4图像灰度化灰度化处理函数:OnFILE256ToGray()该函数实现对256色彩色BMP图像的灰度化处理函数首先计算每个颜色所对应的灰度值,更新DIB调色板。然后实现图像每个像素点到新调色板的映射,继而实现图像的灰度化。//更新DIB调色板的主要代码如下: if(bWinStyleDIB) { ap[i]=(BYTE)(0.299*lpbmi->bmiColors[i].rgbRed+ 0.587*lpbmi->bmiColors[i].rgbGreen+ 0.114*lpbmi->bmiColors[i].rgbBlue+0.5); lpbmi->bmiColors[i].rgbRed=i; lpbmi->bmiColors[i].rgbGreen=i; lpbmi->bmiColors[i].rgbBlue=i; bmi->bmiColors[i].rgbReserved=0; }//实现图像像素颜色到新调色板映射的主要代码如下:for(i=0;i<lHeight;i++) { for(j=0;j<lWidth;j++) { //指向DIB第i行,第j个象素的指针 lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i)+j; *lpSrc=bMap[*lpSrc]; } }for(i=0;i<256;i++) {5.3.2图像增强车牌图片经过图像增强处理,使得计算机更容易识别和处理。该模块程序流程图如图5-5所示:输入灰度图像获得指向图像的句柄获得指向图像的句柄输入线性变换参数输入线性变换参数计算灰度映射表计算灰度映射表更新像素的颜色索引更新像素的颜色索引输出增强的车牌灰度图图5-5图像增强图像增强函数:GrayStretch(),该函数实现对车牌灰度图像分段灰度拉伸〔即分段线性变换,也就是分段图像增强〕函数说明如下://计算灰度映射表代码如下:bMap[i]=(BYTE)bY1*i/bX1;bMap[i]=bY1+(BYTE)((bY2-bY1)*(i-bX1)/(bX2-bX1));bMap[i]=bY2+(BYTE)((255-bY2)*(i-bX2)/(255-bX2));//更新像素索引代码如下://每行 for(i=0;i<lHeight;i++) { //每列 for(j=0;j<lWidth;j++) { //指向DIB第i行,第j个象素的指针 lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i)+j; //计算新的灰度值 *lpSrc=bMap[*lpSrc]; } }5.3.3二值化图像二值化是指整幅图像画面内仅黑、白二值的图像。在数字图像处理中二值图像占有很重要的地位。二值化处理程序流程图如图5-6所示:输入增强后的灰度图像获得指向图像的句柄获得指向图像的句柄获得指向图像的句柄获得指向图像的句柄设定二值变换参数设定二值变换参数指向图像像素指针指向图像像素指针像素灰度值低于参数值像素灰度值低于参数值NY设像素灰度值为255设像素灰度值为255设像素灰度值为0整幅图像扫描完整幅图像扫描完整幅图像扫描完整幅图像扫描完N NYY输出车牌图像的二值图像图5-6二值化二值化函数:BOOLWINAPIThresholdTrans(LPSTRlpDIBBits,LONGlWidth,LONGlHeight,BYTEbThre),lpDIBBits指向图像的起始指针,lWidth图像的宽度,lHeight图像的高度,bThre设定的阈值。在二值化过程中扫描5.3.4中值滤波通过中值滤波的处理能消除图像留下的噪声,消除噪声对图像的干扰。中值滤波函数说明如下:*MedianFilter()**参数:*LPSTRlpDIBBits -指向源DIB图像指针*LONGlWidth -源图像宽度〔象素数〕*LONGlHeight -源图像高度〔象素数〕*intiFilterH -滤波器的高度*intiFilterW -滤波器的宽度*intiFilterMX -滤波器的中心元素X坐标*intiFilterMY -滤波器的中心元素Y坐标**返回值:*BOOL -成功返回TRUE,否那么返回FALSE。**说明:*该函数对DIB图像进行中值滤波。*************************************************************************/BOOLWINAPIMedianFilter(LPSTRlpDIBBits,LONGlWidth,LONGlHeight, intiFilterH,intiFilterW, intiFilterMX,intiFilterMY){ //指向源图像的指针 unsignedchar* lpSrc; //指向要复制区域的指针 unsignedchar* lpDst; //指向复制图像的指针 LPSTR lpNewDIBBits; HLOCAL hNewDIBBits; //指向滤波器数组的指针 unsignedchar *aValue; HLOCAL hArray; //循环变量 LONG i; LONG j; LONG k; LONG l; //图像每行的字节数 LONG lLineBytes; //计算图像每行的字节数 lLineBytes=WIDTHBYTES(lWidth*8); //暂时分配内存,以保存新图像 hNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight); //判断是否内存分配失败 if(hNewDIBBits==NULL) { //分配内存失败 returnFALSE; } //锁定内存 lpNewDIBBits=(char*)LocalLock(hNewDIBBits); //初始化图像为原始图像 memcpy(lpNewDIBBits,lpDIBBits,lLineBytes*lHeight); //暂时分配内存,以保存滤波器数组 hArray=LocalAlloc(LHND,iFilterH*iFilterW); //判断是否内存分配失败 if(hArray==NULL) { //释放内存 LocalUnlock(hNewDIBBits); LocalFree(hNewDIBBits); //分配内存失败 returnFALSE; } //锁定内存 aValue=(unsignedchar*)LocalLock(hArray); //开始中值滤波 //行(除去边缘几行) for(i=iFilterMY;i<lHeight-iFilterH+iFilterMY+1;i++) { //列(除去边缘几列) for(j=iFilterMX;j<lWidth-iFilterW+iFilterMX+1;j++) { //指向新DIB第i行,第j个象素的指针 lpDst=(unsignedchar*)lpNewDIBBits+lLineBytes*(lHeight-1-i)+j; //读取滤波器数组 for(k=0;k<iFilterH;k++) { for(l=0;l<iFilterW;l++) { //指向DIB第i-iFilterMY+k行,第j-iFilterMX+l个象素的指针 lpSrc=(unsignedchar*)lpDIBBits+lLineBytes*(lHeight-1-i+iFilterMY-k)+j-iFilterMX+l; //保存象素值 aValue[k*iFilterW+l]=*lpSrc; } } //获取中值 *lpDst=GetMedianNum(aValue,iFilterH*iFilterW); } } //复制变换后的图像 memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight); //释放内存 LocalUnlock(hNewDIBBits); LocalFree(hNewDIBBits); LocalUnlock(hArray); LocalFree(hArray); //返回 returnTRUE;}5.3.5图像倾斜校正车牌图片有一拍摄的角度不同,图像会存在或多或少的倾斜,如不对图像进行校正,将会影响到后来的字符分割。图像倾斜校正首先要获得图像的倾斜角度,我们采用Hough变换求得图像的倾斜角度。//Hough变换求图像倾斜角度/***************************************************************************函数名称:*HoughDIB()**参数:*LPSTRlpDIBBits-指向源DIB图像指针*LONGlWidth-源图像宽度〔象素数,必须是4的倍数〕*LONGlHeight-源图像高度〔象素数〕*返回值:*BOOL-运算成功返回TRUE,否那么返回FALSE。**说明:*该函数用于对检测图像中的直线*要求目标图像为只有0和255两个灰度值的灰度图像。************************************************************************/floatHoughDIB(LPSTRlpDIBBits,LONGlWidth,LONGlHeight){ intAnglenumber; #definepi3.1415926 //指向源图像的指针 LPSTR lpSrc; //指向缓存图像的指针 LPSTR lpDst; //指向变换域的指针 LPSTRlpTrans; //图像每行的字节数 LONGlLineBytes; //指向缓存DIB图像的指针 LPSTR lpNewDIBBits; HLOCAL hNewDIBBits; //指向变换域的指针 LPSTR lpTransArea; HLOCAL hTransArea; //变换域的尺寸 intiMaxDist; intiMaxAngleNumber; //变换域的坐标 intiDist; intiAngleNumber; //循环变量 longi; longj; //像素值 unsignedcharpixel; //存储变换域中的两个最大值 MaxValueMaxValue1; MaxValueMaxValue2; //暂时分配内存,以保存新图像 hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight); if(hNewDIBBits==NULL) { //分配内存失败 returnFALSE; } //锁定内存 lpNewDIBBits=(char*)LocalLock(hNewDIBBits); //初始化新分配的内存,设定初始值为255 lpDst=(char*)lpNewDIBBits; memset(lpDst,(BYTE)255,lWidth*lHeight); //计算变换域的尺寸 //最大距离 iMaxDist=(int)sqrt(lWidth*lWidth+lHeight*lHeight); //角度从0-180,每格2度 iMaxAngleNumber=180; //为变换域分配内存 hTransArea=LocalAlloc(LHND,lWidth*lHeight*sizeof(int)); if(hNewDIBBits==NULL) { //分配内存失败 returnFALSE; } //锁定内存 lpTransArea=(char*)LocalLock(hTransArea); //初始化新分配的内存,设定初始值为0 lpTrans=(char*)lpTransArea; memset(lpTrans,0,lWidth*lHeight*sizeof(int)); //计算图像每行的字节数 lLineBytes=WIDTHBYTES(lWidth*8); for(j=0;j<lHeight;j++) { for(i=0;i<lWidth;i++) { //指向源图像倒数第j行,第i个象素的指针 lpSrc=(char*)lpDIBBits+lLineBytes*j+i; //取得当前指针处的像素值,注意要转换为unsignedchar型 pixel=(unsignedchar)*lpSrc; //目标图像中含有0和255外的其它灰度值 if(pixel!=255&&*lpSrc!=0) returnFALSE; //如果是黑点,那么在变换域的对应各点上加1 if(pixel==0) { //注意步长是2度 for(iAngleNumber=0;iAngleNumber<iMaxAngleNumber;iAngleNumber++) { iDist=(int)fabs(i*cos(iAngleNumber*pi/180.0)+\ j*sin(iAngleNumber*pi/180.0)); //变换域的对应点上加1 *(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber)=\ *(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber)+1; } } } } //找到变换域中的两个最大值点 MaxValue1.Value=0; MaxValue2.Value=0; //找到第一个最大值点 for(iDist=0;iDist<iMaxDist;iDist++) { for(iAngleNumber=0;iAngleNumber<iMaxAngleNumber;iAngleNumber++) { if((int)*(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber)>MaxValue1.Value) { MaxValue1.Value=(int)*(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber); MaxValue1.Dist=iDist; MaxValue1.AngleNumber=iAngleNumber; } } } //将第一个最大值点附近清零 for(iDist=-9;iDist<10;iDist++) { for(iAngleNumber=-1;iAngleNumber<2;iAngleNumber++) { if(iDist+MaxValue1.Dist>=0&&iDist+MaxValue1.Dist<iMaxDist\ &&iAngleNumber+MaxValue1.AngleNumber>=0&&iAngleNumber+MaxValue1.AngleNumber<=iMaxAngleNumber) { *(lpTransArea+(iDist+MaxValue1.Dist)*iMaxAngleNumber+\ (iAngleNumber+MaxValue1.AngleNumber))=0; } } } Anglenumber=MaxValue1.AngleNumber;// } //释放内存 LocalUnlock(hNewDIBBits); LocalFree(hNewDIBBits); //释放内存 LocalUnlock(hTransArea); LocalFree(hTransArea);if(Anglenumber>0){ //返回 //MessageBox("ok",0,0); returnAnglenumber+90;}else{ return90-abs(Anglenumber);}}//图像倾斜校正voidCPhotodealView::Rectinication(HDIBhDIB,floatfAngel){#definePI3.1415926 //循环变量longi0;longj0;longi1;longj1;floatffAngle;LONGlWidth;LONGlHeight;LONGlLineBytes;CPhotodealDoc*pDoc=GetDocument();//指向DIB的指针 LPSTRlpDIB; //指向DIB象素指针 LPSTRlpDIBBits;//锁定DIB lpDIB=(LPSTR)::GlobalLock((HGLOBAL)pDoc->GetHDIB());//找到DIB图像象素起始位置lpDIBBits=::FindDIBBits(lpDIB);//判断是否是8-bpp位图〔这里为了方便,只处理8-bpp位图,其它的可以类推〕 if(::DIBNumColors(lpDIB)!=256) { //提示用户 MessageBox("目前只支持查看256色位图灰度直方图!","系统提示",MB_ICONINFORMATION|MB_OK); //解除锁定 ::GlobalUnlock((HGLOBAL)pDoc->GetHDIB()); //返回 return; }//更改光标形状 BeginWaitCursor();//DIB的宽度 lWidth=::DIBWidth(lpDIB);//DIB的高度lHeight=::DIBHeight(lpDIB);//计算图像每行的字节数 lLineBytes=WIDTHBYTES(lWidth*8); if(fAngel>90) { fAngel=180-fAngel; }//旋转角度的弧度 ffAngle=(fAngel*PI/180);//角的正余旋 floatfSinAngle=(float)sin(ffAngle);floatfCosAngle=(float)cos(ffAngle); floatfTgAngle=fSinAngle/fCosAngle; unsignedchar*m_temp; m_temp=newunsignedchar[lLineBytes*lHeight];//复制空白数据到中间缓存 for(i0=0;i0<lLineBytes*lHeight;i0++) m_temp[i0]=255;//先对X方向进行校正处理for(i0=0;i0<lHeight;i0++) { for(j0=0;j0<lWidth;j0++) {//计算校正后的坐标位置 //MessageBox("ok"); j1=(LONG)((j0-lWidth/2)*fCosAngle+(lHeight/2-i0)*fSinAngle+lWidth/2+0.5f); i1=(LONG)(-(j0-lWidth/2)*fSinAngle-(lHeight/2-i0)*fCosAngle+lHeight/2+0.5f);//将原始象素复

温馨提示

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

评论

0/150

提交评论