(完整版)数字图像处理车牌识别课程设计matlab实现附源代码.docx

上传人:scccc 文档编号:12318204 上传时间:2021-12-03 格式:DOCX 页数:28 大小:641.83KB
返回 下载 相关 举报
(完整版)数字图像处理车牌识别课程设计matlab实现附源代码.docx_第1页
第1页 / 共28页
(完整版)数字图像处理车牌识别课程设计matlab实现附源代码.docx_第2页
第2页 / 共28页
(完整版)数字图像处理车牌识别课程设计matlab实现附源代码.docx_第3页
第3页 / 共28页
(完整版)数字图像处理车牌识别课程设计matlab实现附源代码.docx_第4页
第4页 / 共28页
(完整版)数字图像处理车牌识别课程设计matlab实现附源代码.docx_第5页
第5页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《(完整版)数字图像处理车牌识别课程设计matlab实现附源代码.docx》由会员分享,可在线阅读,更多相关《(完整版)数字图像处理车牌识别课程设计matlab实现附源代码.docx(28页珍藏版)》请在三一文库上搜索。

1、精品实验项目字符识别预处理的设计与实现专 业:电子信息工程姓 名: 高 勇学 号: 2010021204 指导老师:郑蕊蕊目录一、实验类型 :设计性实验 3二、实验目的 3三、实验设备 : 扫描仪、安装有 MATLAB软件的计算机 3四、实验内容及原理 3( 1)字符图像的获取 3( 2)字符图像预处理 3( 3)字符图像分割 3( 4)函数的作用 4五、实验步骤 81. 载入车牌图像: 82. 将彩图转换为灰度图并绘制直方图: 93. 用 roberts 算子进行边缘检测: 104. 图像实施腐蚀操作: 105. 平滑图像 116. 删除二值图像的小对象 127. 车牌定位 128. 字符分

2、割与识别 149. 车牌识别: 20六、思考题 271实验类型 : 设计性实验实验目的1. 掌握图像的获取、预处理和分割的原理及 MATLAB 实现方法。2. 掌握使用扫描仪和计算机获取数字图像的方法,理解扫描仪的原理。3. 自学一种字符图像的分割算法并用 MA TLAB 编程实现该算法。三、 实验设备 : 扫描仪、安装有 MATLAB软件的计算机四、实验内容及原理1)字符图像的获取用扫描仪获取图像是字符图像处理常用的数字化过程的方法之一。 以办公设备中常用的 台式扫描仪为例,其主要性能指标有x、y 方向的分辨率、色彩分辨率(色彩位数) 、扫描幅面和接口方式等, 这些指标都可以从扫描仪的说明手

3、册中获得。 分辨率的单位是 dp(i Dot Per Inch),意思是每英寸的像素点数。扫描仪工作时, 首先由可移动带状光源将光线照在欲输入的图稿上, 并沿 y 方向扫描稿 件,产生表示图像特征的反射光或透射光。 照射到原稿上的光线经反射后穿过一个很窄的缝 隙,形成沿 x 方向的光带,经光学系统采集和过滤成 RGB 三色光带分别照射到 RGB 分量 的 CCD 上, CCD 将光信号转换为模拟电信号。内部电路的 A/D 变换器将模拟电信号转变 为数字电子信号输送给计算机。 将稿件全部扫描一遍, 一幅完整的图像就输入到计算机中去 了。(2)字符图像预处理根据扫描仪扫描的文档实际情况,有选择地用

4、MA TLAB 编程实现字符图像倾斜校正、滤波、灰度化、二值化和归一化等图像预处理。根据具体需要,还可进行图像的正交变换、 边缘提取、形态学和图像细化等操作。(3)字符图像分割车辆图像采集通过查找资料, 自学字符图像分割的常用算法, 根据原始扫描图像的实际情况, 设计 种字符图像分割的方法并用 MA TLAB 编程实现,并绘制流程图。字符分割字符识别图像预处理输出车牌号码车牌的定位图1 流程图4)函数的作用1.Imerode功能 :对图像实现腐蚀操作,即膨胀操作的反操作。用法 :IM2 = imerode(IM,SE)IM2 = imerode(IM,NHOOD)IM2 = imerode(I

5、M,SE,PACKOPT,M)IM2 = imerode(.,PADOPT)IM2 = imerode(IM,SE) 腐蚀灰度,二值,压缩二值图像IM,返回 IM2。参数 SE为由 strel函数返回的结构元素或者结构元素对象组。IM2 = imerode(IM,NHOOD) 腐蚀图像 IM,这里 NHOOD是定义结构元素邻域 0和 1的矩阵。IM2 = imerode(.,PADOPT) 指出输出图像的大小(是否与输入图像大小一致)。2.imdilate 功能:对图像实现膨胀操作。用法 :IM2 = imdilate(IM,SE)IM2 = imdilate(IM,NHOOD)IM2 = i

6、mdilate(IM,SE,PACKOPT)IM2 = imdilate(.,PADOPT)IM2 = imdilate(IM,SE) 膨胀灰度,二值,压缩二值图像 IM,返回 IM2 。参数 SE为由 strel 函数返回的结构元素或者结构元素对象组。IM2 = imdilate(IM,NHOOD) 膨胀图像 IM,这里 NHOOD是定义结构元素邻域 0和 1 的矩阵。IM2 = imdilate(IM,SE,PACKOPT) 定义 IM 是否是一个压缩的二值图像。IM2 = imdilate(.,PADOPT)指出输出图像的大小。3.strel功能:用于膨胀腐蚀及开闭运算等操作的结构元素对

7、象( 本论坛随即对膨胀腐蚀等操作进行讲解)。用法: SE = strel(shape,parameters)创建由指定形状 shape 对应的结构元素。其中 shape 的种类有arbitrary' , 'pair' , 'diamond' ,'periodicline', 'disk' , 'rectangle''line' , 'square' ,'octagon参数 parameters 一般控制 SE的大小。4. edgeBW = edge(I)采用灰度或一个

8、二值化图像 I 作为它的输入,并返回一个与 I 相同大小的二值化图像 BW, 在函数检测到边缘的地方为 1,其他地方为 0。BW = edge(I,'sobel') 自动选择阈值用 Sobel 算子进行边缘检测。BW = edge(I,'sobel',thresh) 根据所指定的敏感度阈值 thresh ,用 Sobel 算子进行边缘 检测,它忽略了所有小于阈值的边缘。当 thresh 为空时,自动选择阈值。BW = edge(I,'sobel',thresh,direction) 根据所指定的敏感度阈值 thresh ,在所指定的 方 向 di

9、rection 上 , 用 Sobel 算 子 进 行 边 缘 检 测 。 Direction 可 取 的 字 符 串 值 为 horizontal( 水平方向 ) 、 vertical( 垂直方向 )或 both( 两个方向 ) 。BW,thresh = edge(I,'sobel',.)返回阈值BW = edge(I,'prewitt') 自动选择阈值用 prewitt 算子进行边缘检测。BW = edge(I,'prewitt',thresh) 根据所指定的敏感度阈值 thresh ,用 prewitt 算子进行 边缘检测,它忽略了所有小于

10、阈值的边缘。当thresh 为空时,自动选择阈值。BW = edge(I,'prewitt',thresh,direction)根据所指定的敏感度阈值 thresh ,在所指定的方向 direction 上,用 prewitt 算子进行边缘检测。 Direction 可取的字符串值为 horizontal( 水平方向 ) 、vertical( 垂直方向 )或 both( 两个方向 )默认方向为 both 。BW = edge(I,'roberts') 自动选择阈值用 roberts 算子进行边缘检测。BW = edge(I,'roberts',t

11、hresh) 根据所指定的敏感度阈值 thresh ,用 Roberts 算子进行 边缘检测,它忽略了所有小于阈值的边缘。当 thresh 为空时,自动选择阈值。5.Imclose功能: 对图像实现闭运算,闭运算也能平滑图像的轮廓,但与开运算相反, 它一般融合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙。用法: IM2 = imclose(IM,SE)IM2 = imclose(IM,NHOOD)用法和 imopen 相同。6.imopen功能 :对图像实现开运算, 开运算一般能平滑图像的轮廓, 消弱狭窄的部分, 去掉细的突出。 用法 :IM2 = imopen(IM,SE)IM2 = i

12、mopen(IM,NHOOD)IM2 = imopen(IM,SE) 用 结构元素 SE实现灰度图像或二值图像的 IM 的形态开运算。 SE可 以是单个结构元素对象或者结构元素对象数组。IM2 = imopen(IM,NHOOD) 用结构元素 strel ( NHOO)D执行开运算。7. bwareaopen功能:删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像 BW中面积小于 P的对象,默认情况下 conn 使用 8邻域。8. tic 和 toc 函数这两个函数一般配合使用, tic 表示计时的开始, toc 表示计时的结束。格式如:tic任意表达

13、式toct=toc9. fspecial功能:用于建立预定义的滤波算子,其语法格式为: h = fspecial(type)h = fspecial(type, para)其中 type 指定算子的类型, para 指定相应的参数;type 的类型有:1、 'average'averaging filter 为均值滤波,参数为 hsize 代表模板尺寸,默认值为【 3, 3】。'disk'circular averaging filter 为圆形区域均值滤波,参数为 radius 代表区域半径,默认值为 5.'gaussian'Gaussian

14、lowpass filter为高斯低通滤波,有两个参数, hsize 表示模板尺寸,默认值为【 3 3 】, sigma 为滤波器的 标准值,单位为像素,默认值为 0.5.'prewitt'Prewitt horizontal edge-emphasizing filter 用于边缘增强,大小为【 3 3 】,无参数 'sobel'Sobel horizontal edge-emphasizing filter 用于边缘提取,无参数9. filter2J = filter2(h,I);使用指定的滤波器 h 对 I 进行滤波,结果保存在 J 中10. bwarea

15、 函数功能:计算二值图像中对象的总面积。调用格式:total = bwarea(BW)度量标准不同, 因此结果可能并不十分精估算二值图像 BW中对象的总面积。 返回的 total 是一个标量, 它的值大致地反映了和图 像中 on 像素的个数。由于对于不同像素类型,确。 BW可以是数值类型(整型、浮点型)或者逻辑类型。对于数值类型,像素值不为 0 被视为 on。返回值 total 是 double 类型的。11. sum功能:函数求和sum(x,2) 表示矩阵 x 的横向相加,求每行的和,结果是列向量。 而缺省的 sum(x) 就是竖向相加,求每列的和,结果是行向量。A>0 的结果是得到一

16、个逻辑矩阵,大小跟原来的A 一致,A 中大于零的元素的位置置为 1,小于等于零的位置置为 0。 所以横向求和以后,就是求 A 中每行大于零的元素个数。12. round 功能:四舍五入 调用格式: Y = round(X) 在 matlab 中 round 也是一个四舍五入函数。五、实验步骤1. 载入车牌图像:I=imread('car1.jpg');figure(1),imshow(I);title('original image'); %将车牌的原图显示出来,结果如下 :232. 将彩图转换为灰度图并绘制直方图:I1=rgb2gray(I);% 将彩图转换为

17、灰度图 figure(2),subplot(1,2,1),imshow(I1);title('gray image');figure(2),subplot(1,2,2),imhist(I1);title(' 灰度图直方图 ');% 绘制灰度图的直方图 结果如下所示:3. 用 roberts 算子进行边缘检测:I2=edge(I1,'roberts',0.18,'both');% 选择阈值 0.18,用 roberts 算子进行边缘检测 figure(3),imshow(I2);title('roberts operator

18、 edge detection image') ; 结果如下:4. 图像实施腐蚀操作:se=1;1;1;I3=imerode(I2,se);% 对图像实施腐蚀操作,即膨胀的反操作 figure(4),imshow(I3);title('corrosion image');5. 平滑图像se=strel('rectangle',25,25);% 构造结构元素以正方形构造一个 seI4=imclose(I3,se);% 图像聚类、填充图像 figure(5),imshow(I4);title('smothing image'); 结果如下所示

19、:6. 删除二值图像的小对象I5=bwareaopen(I4,2000);% 去除聚团灰度值小于 2000 的部分 figure(6),imshow(I5);title('remove the small objects'); %用 imshow 函数显示滤波后图像 结果如下所示 :7. 车牌定位y,x,z=size(I5);% 返回 I5 各维的尺寸,存储在 x,y,z 中myI=double(I5);% 将 I5 转换成双精度tic %tic 表示计时的开始, toc 表示计时的结束Blue_y=zeros(y,1);% 产生一个 y*1 的零阵for i=1:yfor j

20、=1:x if(myI(i,j,1)=1)% 如果 myI(i,j,1) 即 myI 的图像中坐标为 (i,j) 的点值为 1,即该点为车牌背景颜色蓝色%则 Blue_y(i,1) 的值加 1Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计endend endtemp MaxY=max(Blue_y);%Y 方向车牌区域确定%temp 为向量 yellow_y 的元素中的最大值, MaxY为该值的索引 PY1=MaxY;while (Blue_y(PY1,1)>=5)&&(PY1>1)PY1=PY1-1;endPY2=MaxY;while (B

21、lue_y(PY2,1)>=5)&&(PY2<y)PY2=PY2+1;endIY=I(PY1:PY2,:,:);%行方向车牌区域确定%方 X向 %Blue_x=zeros(1,x);% 进一步确定 x 方向的车牌区域for j=1:xfor i=PY1:PY2if(myI(i,j,1)=1)Blue_x(1,j)= Blue_x(1,j)+1;endendendPX1=1;while (Blue_x(1,PX1)<3)&&(PX1<x)PX1=PX1+1;endPX2=x;while (Blue_x(1,PX2)<3)&&a

22、mp;(PX2>PX1)PX2=PX2-1;endPX1=PX1-1;% 对车牌区域的校正PX2=PX2+1;dw=I(PY1:PY2-8,PX1:PX2,:);t=toc;figure(7),subplot(1,2,1),imshow(IY),title('Line direction areas');%行方向车牌区域确定figure(7),subplot(1,2,2),imshow(dw),title('positioning color images');% 定位后 的车牌区域如下所示:8. 字符分割与识别1) 车牌的进一步处理对分割出的彩色车牌图像

23、进行灰度转换、 二值化、 均值滤波、 腐蚀膨胀以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像, 对分割出来的字符进行预处理 (二值化、 归一化),然后分析提取,对分割出的字符图像进行识别给出文本形式的车牌号码。 代码如下:imwrite(dw,'dw.jpg');%将彩色车牌写入 dw 文件中a=imread('dw.jpg');% 读取车牌文件中的数据b=rgb2gray(a);% 将车牌图像转换为灰度图imwrite(b,'gray licence plate.jpg');%将灰度图像写入文件中figure(8);subplot(

24、3,2,1),imshow(b),title('车牌灰度图像 ')g_max=double(max(max(b); g_min=double(min(min(b);T=round(g_max-(g_max-g_min)/3); % T为二值化的阈值m,n=size(b); d=(double(b)>=T); % d: 二值图像 imwrite(d,'binary licence plate.jpg'); subplot(3,2,2),imshow(d),title('before filtering binary licence plate'

25、;) %均值滤波前% 滤波 h=fspecial('average',3);%建立预定义的滤波算子, average 为均值滤波,模板的尺寸为 3*3 d=im2bw(round(filter2(h,d);% 使用指定的滤波器 h 对 h 进行 d 即均值滤波 imwrite(d,'after average licence plate.jpg');subplot(3,2,3),imshow(d),title('after average licence plate')% 某些图像进行操作% 膨胀或腐蚀% se=strel('square

26、',3); % 使用一个 3X3 的正方形结果元素对象对创建的图像进行膨胀% 'line'/'diamond'/'ball'.se=eye(2); % eye(n) returns the n-by-n identity matrix单位矩阵m,n=size(d);% 返回矩阵 b 的尺寸信息, 并存储在 m,n 中 if bwarea(d)/m/n>=0.365 % 计算二值图像中对象的总面积与整个面积的比是否大于 0.365 d=imerode(d,se);% 如果大于 0.365 则图像进行腐蚀elseif bwarea(d)

27、/m/n<=0.235 % 计算二值图像中对象的总面积与整个面积的比是否小于0.235d=imdilate(d,se);% 如果小于则实现膨胀操作end imwrite(d,'expansion or corrosion the licence plate.jpg');subplot(3,2,4),imshow(d),title('expansion or corrosion the licence plate')运行结果如下所示:2) 字符分割在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础 上进行字符的分割,然后再利用分割的结

28、果进行字符识别。字符识别的算法很多,因为车 牌字符间间隔较大, 不会出现字符粘连情况, 所以此处采用的方法为寻找连续有文字的块, 若长度大于某阈值,则认为该块有两个字符组成,需要分割。一般分割出来的字符要进行 进一步的处理,以满足下一步字符识别的需要。但是对于车牌的识别,并不需要太多的处 理就已经可以达到正确识别的目的。在此只进行了归一化处理,然后进行后期处理。% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割 %首先创建子函数 qiege 与 getword ,而后调用子程序,将车牌的字符分割开并且进行归一 化处理d=qiege(d);m,n=size(d);sub

29、plot(3,2,5),imshow(d),title(n) k1=1;k2=1;s=sum(d);j=1;while j=nwhile s(j)=0j=j+1;endk1=j;while s(j)=0 && j<=n-1j=j+1;endk2=j-1;if k2-k1>=round(n/6.5)val,num=min(sum(d(:,k1+5:k2-5);d(:,k1+num+5)=0; % 分割endend% 再切割d=qiege(d);% 切割出 7 个字符y1=10;y2=0.25;flag=0;word1=;while flag=0m,n=size(d);

30、left=1;wide=0;while sum(d(:,wide+1)=0wide=wide+1;endif wide<y1 % 认为是左侧干扰d(:,1:wide)=0;d=qiege(d);elsetemp=qiege(imcrop(d,1 1 wide m);m,n=size(temp);all=sum(sum(temp);two_thirds=sum(sum(temp(round(m/3):2*round(m/3),:);if two_thirds/all>y2flag=1;word1=temp; % WORD 1endd(:,1:wide)=0;d=qiege(d);en

31、dend% 分割出第二个字符word2,d=getword(d);% 分割出第三个字符word3,d=getword(d);% 分割出第四个字符word4,d=getword(d);% 分割出第五个字符word5,d=getword(d);% 分割出第六个字符word6,d=getword(d);% 分割出第七个字符word7,d=getword(d);figure(9);subplot(2,7,1),imshow(word1),title('1');subplot(2,7,2),imshow(word2),title('2');subplot(2,7,3),i

32、mshow(word3),title('3');subplot(2,7,4),imshow(word4),title('4');subplot(2,7,5),imshow(word5),title('5');subplot(2,7,6),imshow(word6),title('6');subplot(2,7,7),imshow(word7),title('7');m,n=size(word1);% 商用系统程序中归一化大小为 40*20, 此处演示 word1=imresize(word1,40 20); wor

33、d2=imresize(word2,40 20); word3=imresize(word3,40 20); word4=imresize(word4,40 20); word5=imresize(word5,40 20); word6=imresize(word6,40 20); word7=imresize(word7,40 20);subplot(2,7,8),imshow(word1),title('1');subplot(2,7,9),imshow(word2),title('2');subplot(2,7,10),imshow(word3),titl

34、e('3');subplot(2,7,11),imshow(word4),title('4');subplot(2,7,12),imshow(word5),title('5');subplot(2,7,13),imshow(word6),title('6');subplot(2,7,14),imshow(word7),title('7');imwrite(word1,'1.jpg');imwrite(word2,'2.jpg');imwrite(word3,'3.jpg

35、9;);imwrite(word4,'4.jpg');imwrite(word5,'5.jpg');imwrite(word6,'6.jpg');imwrite(word7,'7.jpg');运行结果如下:9. 车牌识别:模板匹配是图象识别方法中最具代表性的基本方法之一,它是将从待识别的图象或图 象区域 f(i,j) 中提取的若干特征量与模板 T(i,j) 相应的特征量逐个进行比较,计算它们 之间规格化的互相关量,其中互相关量最大的一个就表示期间相似程度最高,可将图象 归于相应的类。也可以计算图象与模板特征量之间的距离,用最小距离

36、法判定所属类。此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度最大的输出。汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省 份,紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它的字符数有限,汉 字共约 50 多个,大写英文字母 26 个,数字 10 个。为了实验方便,结合本次设计所选汽 车牌照的特点,只建立了 7 个数字 26 个字母与 10 个数字的模板。其他模板设计的方法 与此相同。首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的 0 越多那么就越匹配。把每一幅相减后的图的0 值个数保存,即为识别出来的结果。识别

37、的流程图如下所示:源代码如下:liccode=char('0':'9' 'A':'Z' '苏豫陕鲁京辽浙 '); % 建立自动识别字符代码表SubBw2=zeros(40,20);l=1;for I=1:7ii=int2str(I);t=imread(ii,'.jpg');SegBw2=imresize(t,40 20,'nearest');第一位汉字识别SegBw2=double(SegBw2)>20;if l=1 %kmin=37;第二位 AZ 字母识别kmax=43;el

38、seif l=2 %kmin=11;kmax=36;else l>=3第三位以后是字母或数字识别kmin=1; kmax=36;endfor k2=kmin:kmaxfname=strcat(' 字符模板 ',liccode(k2),'.jpg');SamBw2 = imread(fname);SamBw2=double(SamBw2)>1;for i=1:40for j=1:20SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);endend% 以上相当于两幅图相减得到第三幅图Dmax=0;for k1=1:40for l1=1

39、:20if ( SubBw2(k1,l1) > 0 | SubBw2(k1,l1) <0 )Dmax=Dmax+1;endendendError(k2)=Dmax;endError1=Error(kmin:kmax);MinError=min(Error1);findc=find(Error1=MinError);Code(l*2-1)=liccode(findc(1)+kmin-1);Code(l*2)=' 'endl=l+1;figure(10),imshow(dw),title (' 车牌号码 :', Code,'Color',

40、'b');通过以上的方法, 我对另外一幅图像进行了检测, 也有较好的识别效果。 下面是对另一幅车 牌照的检测,结果如下所示:93trw4M9 IPWa 财 frUMJWCaQalvlr*9¼l IvbdgTFiH*P HW *taR*0lF*lIM 屮1 Eyl m IM K* f0 *F *»* - * «r£>4 六、思考题1. 扫描仪是图像信号输入设备。它对原稿进行光学扫描,然后将光学图像传送到光电转换器 中变为模拟电信号,又将模拟电信号变换成为数字电信号,最后通过计算机接口送至 计算机中。在扫描仪获取图像的过程中,有两个元件起到关键作用。一个是 CCD ,它光 信号转换成为电信号;另一个是 A/D 变换器,它将模拟电信号变为数字电信号。2. 在字符图像预处理中采用了字符图像倾斜校正、滤波、灰度化、二值化和归一化等图像预 处理方法。3. 字符分割的方法有 python 、 vb 、 javascript 、asp :split php 是 explode 。27

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1