数字图像处理课程设计报告车牌分割及识别Word文件下载.docx
《数字图像处理课程设计报告车牌分割及识别Word文件下载.docx》由会员分享,可在线阅读,更多相关《数字图像处理课程设计报告车牌分割及识别Word文件下载.docx(43页珍藏版)》请在冰点文库上搜索。
(6)高速公路收费管理系统。
在高速公路收费入、出口分别完成车牌识别和车牌匹配工作,实现不停车收费;
还可以根据识别出的车牌从数据库中调出该车档案,可发现没有及时交纳养路费的车辆。
随着车牌识别技术的不断成熟,高效、识别率高的车牌识别技术还将应用于一些对性能要求比较高的单片机上。
还提供一个可以对车辆信息实时采集的公共平台,使各管理部门间能够协调统一的对车辆及道路情况进行监控管理,从根木上解决了目前全国交通及公安系统信息采集的多渠道、事件信息收集的单一性以及互不沟通、互不兼容的信息管理方式,车牌识别技术具有广泛的应用前景。
1.2车牌识别系统的工作原理及组成
车牌识别(LPR)系统是智能交通系统(ITS)的一个重要组成部分,该系统能从一幅车辆图像中自动提取车牌图像,自动分割字符,进而对字符进行识别,得到车牌的。
基于PC的车牌识别系统是利用PC机及摄像机等电子设备采集某一路段的汽车图像,对图像进行处理,获取车牌的位置及字符信息,完成车牌目标的自动定位与识别。
图1为车牌识别系统流程:
图1车牌识别系统流程
其工作流程是:
当系统发现有车辆通过时,触发图像采集部分工作,通过对车辆进行抓拍,获取车辆的前视或后视图。
然后将所采集的车辆数字图像送入计算机系统,通过车牌定位、字符分割三个环节的处理,最终得到车牌。
其中的计算机处理系统主要涉及了两个关键技术:
车牌区域定位技术、车牌字符分割技术。
2设计容
2.1宝马汽车“鲁A88888”车牌定位与分割
2.1.1读入汽车图像并直方图均衡化
直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度围的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度围的像素数量大致相同。
直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
读入需要处理的汽车图像并直方图均衡化:
clear;
clc;
closeall
I=imread('
E:
\数字图像处理课程设计\car1.jpg'
);
figure
(1),imshow(I);
title('
汽车原图'
I=rgb2gray(I);
imwrite(I,'
汽车灰度图.jpg'
figure
(2),imshow(I);
汽车灰度图'
figure(3),subplot(2,1,1),imhist(I);
汽车灰度图直方图'
[J,T]=histeq(I,256);
%有256个灰度级
subplot(2,1,2),imhist(J);
%均衡化后的直方图
直方图均衡化'
读入的图像为:
将它转换为灰度图:
汽车图像直方图均衡化前后的直方图:
2.1.2边缘提取
边缘是图像中亮度突然变化的区域,是图像灰度构成的曲面上的陡峭区域,是像素灰度存在阶跃变化或屋脊状变化的像素的集合。
灰度图像边缘提取,主要的思想是:
抑制噪声(低通滤波、平滑、去噪、模糊),边缘特征增强(高通滤波、锐化),边缘定位。
常用的算子如Prewitt算子:
Sobel算子(四邻域的权重更大):
tic%计时开始
[height,width]=size(J);
%灰度图长宽
%求梯度
I_edge=zeros(height,width);
%创建height*width的矩阵
fori=2:
width-1%对每一列开始遍历
I_edge(:
i)=abs(J(:
i+1)-J(:
i-1));
%每列的值赋为原图像中左右两列相减的绝对值第十章图像分割P456Prewitt算子
end
I_edge=(255/(max(max(I_edge))-min(min(I_edge))))*(I_edge-min(min(I_edge)));
%归一化处理(0~255)
figure(4),imshow(I_edge);
梯度算子检测边缘'
2.1.3选取最佳阈值二值化图像
取得最佳阈值,将图像二值化。
二值图像是指整幅图像画面仅黑、白二值的图像。
在实际的车牌处理系统中,进行图像二值变换的关键是要确定合适的阀值,使得字符与背景能够分割开来,二值变换的结果图像必须要具备良好的保形性,不丢掉有用的形状信息,不会产生额外的空缺等等。
车牌识别系统要求处理的速度高、成本低、信息量大,采用二值图像进行处理,能大提高处理效率。
阈值处理的操作过程是先由用户指定或通过算法生成一个阈值,如果图像中某中像素的灰度值小于该阈值,则将该像素的灰度值设置为0或255,否则灰度值设置为255或0。
function[y,y1]=select(ImageData,h,w)
thr=0.5;
delta=0.05;
y=(ImageData>
=thr*mean(max(ImageData)));
%max(a)找出矩阵a每一列的最大值
BW2=bwareaopen(y,10);
%删除面积小于10的对象
SE=strel('
square'
15);
%创建一个15*15正方形结构元素
IM2=imdilate(BW2,SE);
%腐蚀
IM3=imerode(IM2,SE);
%膨胀
%等效于开运算,消除小物体,在纤细点处分离物体,平滑较大物体边界,但同时并不明显改变原来物体的面积
average=sum(sum(IM3))/(h*w);
%sum(a),对a矩阵每一列求和
while(average<
0.03||average>
0.08)
if(average<
0.03)
thr=thr-delta;
else
thr=thr+delta;
end
y=(ImageData>
%求向量元素平均值
BW2=bwareaopen(y,10);
IM2=imdilate(BW2,SE);
IM3=imerode(IM2,SE);
%等效于开运算
average=sum(sum(IM3))/(h*w);
%求灰度平均值
y1=y;
y=IM3;
2.1.4形态学操作
数学形态学(MathematicalMorphology)诞生于1964年,是由法国巴黎矿业学院博士生赛拉(J.Serra)和导师马瑟荣,在从事铁矿核的定量岩石学分析及预测其开采价值的研究中提出“击中/击不中变换”,并在理论层面上第一次引入了形态学的表达式,建立了颗粒分析方法。
他们的工作奠定了这门学科的理论基础,如击中/击不中变换、开闭运算、布尔模型及纹理分析器的原型等。
数学形态学的基本思想是用具有一定形态的结构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。
数学形态学是由一组形态学的代数运算子组成的,它的基本运算有4个:
膨胀、腐蚀、开启和闭合,它们在二值图像和灰度图像中各有特点。
基于这些基本运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析及处理,包括图像分割、特征抽取、边界检测、图像滤波、图像增强和恢复等。
数学形态学方法利用一个称作结构元素的“探针”收集图像的信息,当探针在图像中不断移动时,便可考察图像各个部分之间的相互关系,从而了解图像的结构特征。
数学形态学基于探测的思想,与人的FOA(FocusOfAttention)的视觉特点有类似之处。
作为探针的结构元素,可直接携带知识(形态、大小、甚至加入灰度和色度信息)来探测、研究图像的结构特点。
[I_edge,y1]=select(I_edge,height,width);
%调用select函数减小车牌围
BW2=I_edge;
figure(5),subplot(2,2,1),imshow(BW2);
二值化图像'
%开操作(腐蚀+膨胀)消除小物体
rectangle'
[10,10]);
%创建10*10的矩形结构元素
%SE=strel(shape,parameters),根据shape指定的类型创建一个结构元素SE。
IM2=imerode(BW2,SE);
subplot(2,2,2),imshow(IM2);
汽车腐蚀后图像'
IM2=bwareaopen(IM2,50);
%BW2=bwareaopen(BW,P)删除二值图像BW中面积小于P的对象,默认情况下conn使用8邻域
%川APK110将P改为100以上效果较好
subplot(2,2,3),imshow(IM2);
删除小面积图像'
IM3=imdilate(IM2,SE);
subplot(2,2,4),imshow(IM3);
汽车膨胀后图像'
2.1.5确定车牌位置并保存车牌图像
为了确定车牌的位置,首先通过水平方向以及垂直方向的扫描粗略地估测车牌的位置,然后根据长宽比例确定车牌位置。
投影子函数:
functiony=projection(I,s)
if(s=='
h'
)%水平投影
y=sum(I'
%I'
I转置
v'
)%垂直投影
y=sum(I);
%投影以粗略估计车牌位置
p_h=projection(double(IM3),'
%调用projection函数,水平方向,输出IM3的转置
if(p_h
(1)>
0)
p_h=[0,p_h];
p_v=projection(double(IM3),'
%调用projection函数,垂直方向
if(p_v
(1)>
p_v=[0,p_v];
p_h=double((p_h>
5));
%水平方向
p_h=find(((p_h(1:
end-1)-p_h(2:
end))~=0));
%a(i)~=0,逻辑判断,a(i)不为0则为真
(1),find返回不为0的位置
len_h=length(p_h)/2;
p_v=double((p_v>
%垂直方向
p_v=find(((p_v(1:
end-1)-p_v(2:
len_v=length(p_v)/2;
%粗略计算车牌候选区
k=1;
fori=1:
len_h
forj=1:
len_v
s=IM3(p_h(2*i-1):
p_h(2*i),p_v(2*j-1):
p_v(2*j));
if(mean(mean(s))>
0.1)%求每一列的均值
p{k}=[p_h(2*i-1),p_h(2*i)+1,p_v(2*j-1),p_v(2*j)+1];
k=k+1;
k=k-1;
%进一步缩小车牌候选区
k
edge_IM3=double(edge(double(IM3(p{i}
(1):
p{i}
(2),p{i}(3):
p{i}(4))),'
canny'
));
[x,y]=find(edge_IM3==1);
p{i}=[p{i}
(1)+min(x),p{i}
(2)-(p{i}
(2)-p{i}
(1)+1-max(x)),...
p{i}(3)+min(y),p{i}(4)-(p{i}(4)-p{i}(3)+1-max(y))];
p_center{i}=[fix((p{i}
(1)+p{i}
(2))/2),fix((p{i}(3)+p{i}(4))/2)];
p_ratio(i)=(p{i}(4)-p{i}(3))/(p{i}
(2)-p{i}
(1));
%对上面参数和变量的说明:
p为一胞元,用于存放每个图像块的左上和右下两个点的坐标;
%存放格式为:
p{k}=[x1,x2,y1,y2];
x1,x2分别为行坐标,y1,y2为列坐标
%p_center为一胞元,用于存放每个图像块的中心坐标,p_center{k}=[x,y];
x,y分别为行,列坐标
%p_ratio为一矩阵,用来存放图像块的长宽比例
%合并临近区域
%如果有多个区域则执行合并
ifk>
1
n=0;
ncount=zeros(1,k);
fori=1:
k-1
if(abs(p{i}
(1)+p{i}
(2)-p{i+1}
(1)-p{i+1}
(2))<
=height/30&
&
abs(p{i+1}(3)-p{i}(4))<
=width/15)
p{i+1}
(1)=min(p{i}
(1),p{i+1}
(1));
p{i+1}
(2)=max(p{i}
(2),p{i+1}
(2));
p{i+1}(3)=min(p{i}(3),p{i+1}(3));
p{i+1}(4)=max(p{i}(4),p{i+1}(4));
%向后合并
n=n+1;
ncount(n)=i+1;
%如果有合并,求出合并后最终区域
if(n>
d_ncount=ncount(2:
n+1)-ncount(1:
n);
%避免重复记录临近的多个区域。
index=find(d_ncount~=1);
m=length(index);
m
pp{i}=p{ncount(index(i))};
%重新记录合并区域的比例
pp_ratio(i)=(pp{i}(4)-pp{i}(3))/(pp{i}
(2)-pp{i}
(1));
p=pp;
%更新区域记录
p_ratio=pp_ratio;
%更新区域比例记录
clearpp;
clearpp_ratio;
%清除部分变量
k=length(p);
%更新区域个数
%根据区域比例判断是否为车牌区域
m=1;
T=0.6*max(p_ratio);
if(p_ratio(i)>
=T&
p_ratio(i)<
20)
p1{m}=p{i};
m=m+1;
p=p1;
clearp1;
k=m-1;
%更新区域数
toc%计时结束
clearedge_IM3;
clearx;
cleary;
%清空部分变量
figure(6);
subplot(1,k,i);
index=p{i};
imshow(I(index
(1)-2:
index
(2),index(3):
index(4)));
if(k==1)
imwrite(I(index
(1)-2:
index(4)),'
11.jpg'
end%存储车牌图像
2.1.6读入车牌图像并二值化车牌
由于前面已经定位到车牌的位置,下一步要做的是将存储的车牌照片的七个符号分割,首先读入车牌的灰度图。
J=imread('
\数字图像处理课程设计cardetec\11.jpg'
figure(7);
subplot(2,1,1),imshow(J),title('
车牌灰度图像'
)
g_max=double(max(max(J)));
g_min=double(min(min(J)));
T=round(g_max-(g_max-g_min)/3);
%T为二值化的阈值,round四舍五入
[m,n]=size(J);
d=(double(J)>
=T);
%二值化
imwrite(d,'
车牌二值化图像.jpg'
subplot(2,1,2),imshow(d),title('
车牌二值化图像'
2.1.7对车牌字符进行分割
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。
它是由图像处理到图像分析的关键步骤。
现有的图像分割方法主要分以下几类:
基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。
阈值分割
灰度阈值分割法是一种最常用的并行区域技术,它是图像分割中应用数量最多的一类。
阈值分割方法实际上是输入图像f到输出图像g的如下变换:
其中,T为阈值,对于物体的图像元素g(i,j)=1,对于背景的图像元素g(i,j)=0。
由此可见,阈值分割算法的关键是确定阈值,如果能确定一个合适的阈值就可准确地将图像分割开来。
阈值确定后,将阈值与像素点的灰度值逐个进行比较,而且像素分割可对各像素并行地进行,分割的结果直接给出图像区域。
阈值分割的优点是计算简单、运算效率较高、速度快。
在重视运算效率的应用场合(如用于硬件实现),它得到了广泛应用。
人们发展了各种各样的阈值处理技术,包括全局阈值、自适应阈值、最佳阈值等等。
全局阈值是指整幅图像使用同一个阈值做分割处理,适用于背景和前景有明显对比的图像。
它是根据整幅图像确定的:
T=T(f)。
但是这种方法只考虑像素本身的灰度值,一般不考虑空间特征,因而对噪声很敏感。
常用的全局阈值选取方法有利用图像灰度直方图的峰谷法、最小误差法、最大类间方差法、最大熵自动阈值法以及其它一些方法。
在许多情况下,物体和背景的对比度在图像中的各处不是一样的,这时很难用一个统一的阈值将物体与背景分开。
这时可以根据图像的局部特征分别采用不同的阈值进行分割。
实际处理时,需要按照具体问题将图像分成若干子区域分别选择阈值,或者动态地根据一定的邻域围选择每点处的阈值,进行图像分割。
这时的阈值为自适应阈值。
在本次课程设计中,分割的主要思想是若某处两个部分之间的长度大于阈值,则认为该块有两个字符组成,需要分割;
反之,如果两个部分之间的长度小于阈值,则认为这两个部分是属于同一字符的,不应该分割。
分割子函数:
functione=fenge(d)
[m,n]=size(d);
top=1;
bottom=m;
left=1;
right=n;
%init
whilesum(d(top,:
))==0&
top<
=m%切割出白色区域(横切)
top=top+1;
whilesum(d(bottom,:
bottom>
1%同上
bottom=bottom-1;
whilesum(d(:
left))==0&
left<
n%切割出白区域(纵切)
left=left+1;
right))==0&
right>
=1
right=right-1;
dd=right-left;
hh=bottom-top;
e=imcrop(d,[lefttopddhh]);
%在一个数字窗口显示图像d
调用fenge函数:
%