灰度变换
灰度图是指将黑色和白色以对数的关系分为256阶的图像。灰度化处理就是将彩色图片通过处理转化为灰度图的过程。彩色图像一般由三个独立色组成,R、G、B三个分量分别显示出红、绿、蓝。灰度化处理就是使R、G、B三个分量相等。灰度值为255的点就是白色,灰度值为0的就是黑色,其范围为0至255。
由于车牌的颜色不同,所以从拍摄的汽车图像直接提取会有很大的困难,但是汽车车牌与车牌上的字符颜色对比度却很大,并且灰度图像是一种最简单的对比度增强方法。所以将彩色图像转换为灰度图像,可以快速准确得确定车牌的位置。运用该技术不仅可以减少数据上得存储,也可以大大地提升运行速度。
边缘检测
边缘检测是图像处理和计算机视觉中比较常见的问题,也是图像中经常运用的技术。边缘的目的就是将数字图像中亮度明显的点标识出来,或者是我们所需要的的点标识出来。这些点基本上都可以反映出属性的重要事件和变化,其中包括深度上的变化、表面上的变化、物质属性上和场景照明上的变化。边缘检测在图像处理和计算机视觉中特征提取方向具有重要地位,具有很好的发展前景。
图像边缘检测可以确定我们所需要的的区域图像,清除了其中我们不需要的一些图像,保留了图像中重要的结构属性,并在一定程度上减少数据量。目前,边缘检测有许多方法,也有许多算法。这些方法或算法大体上可以分为两种:查找和零穿越。查找的方法就是寻找图像一阶导数中的最大值和最小值来确定图像的边界。零穿越的方法是通过寻找图像二阶导数零穿越来寻找边界,这个方法通常用Laplacian过零点或者非线性差分表示过零点。这两种类别我们也可以认为是按照导数一阶和二阶两类。`
图像增强
因为外界复杂的环境,对车辆图像进行灰度变换后,车辆图像中车牌区域和其他区域图像的对比度并不是很高,若直接进行车牌定位子系统运行,可能会难以准确确定车牌的位置。车牌自动识别系统需要具有实时性、准确性和极速性,对车牌准确定位和运行速度要求十分严格。因此,必须要准确确定图像中车牌的位置,并且不能影响运行速度。所以,为了增强牌照部位图像和其他区域的对比度,需要对图像进行增强。
图像增强的方法大体可以分为两大类:频率域法和空间域法。频率域法是将图像看成一种二维信号,通过二维傅里叶变换对其增强。主要有低通滤波和高通滤波,采用低通滤波是去除噪声,若采用高通滤波则是增强高频信号。空间域法是直接对图像灰度级做运算,主要有局部求平均法和中值滤波法等,它们主要是去除或减弱噪声。
(1)频率域算法
频域增强算法主要是通过图像的傅里叶变换进行增强。频率域算法中比较常用的方法有低通滤波和高通滤波。低通滤波去除其中反映细节和跳变性的高频分量。低频滤波有理想低通滤波器、Butterworth滤波器、指数滤波器等。高通滤波是利用高通滤波器来忽略图像中平缓的部分,突出图像中的高频部分。高通滤波可以使图像的边缘信息更加明显,所以适用于图像中物体的边缘提取。高通滤波器主要有理想高通滤波器、梯形滤波器、指数滤波器等。
(2)空间域算法
空间域算法主要有点运算算法和邻域去噪算法。点运算算法即灰度级校正、灰度变换和直方图修正等,目的或使图像成像均匀,或扩大图像动态范围,扩展对比度。邻域增强算法主要分为图像平滑和锐化两种。平滑一般用于图像去噪,但对边缘的增强不是很好。比较常用算法有均值滤波和中值滤波。锐化则是跟平滑相反,锐化则是增强物体的边缘。常用算法有梯度法、算子、高通滤波、掩模匹配法、统计差值法等。
本文选择中值滤波法对车牌进行图像增强。中值滤波可以很好的在消除噪声的同时,将图像边缘完好的保留。在均值滤波器是通过平均计算,所以噪声会受到影响。但中值滤波器却几乎不会受到影响。所以中值滤波消除噪声的效果更好,但中值滤波耗时比较长。
车牌定位
车牌的定位子系统设计是车牌识别系统的核心系统,车牌是否能准确定位直接影响到后续系统的运行。这个方法定位精确,速度快,并且受噪声影响极小。并且这个方法可以在多个汽车图像中对车牌定位。但如果车牌严重褪色的情况下,会导致定位准确率下降。因为在车牌褪色的情况下,会导致相同区域出现灰度值不一样的情况。
图像二值化处理
图像二值化就是将图像上所有像素点的灰度值设为两个极值(0或255)的灰度图像,将整个彩色图像变成黑白效果,也就是最初的黑白照片。灰度值0和255范围内共有256种颜色,0和255就是前面所述的黑色和白色。即将256个亮度等级的灰度图像通过适当的阀值选取方法而获得仍然可以反映图像整体和局部特征的二值化图像。图像二值化技术在数字图像处理中经常运用,将彩色图像进行二值化处理,可以大量减小在数据上的储存量,也会大大提升程序运行的速度。图像二值化处理的原理其实十分简单,就是将图像上所有的灰度值变成0或255,也就是变成黑和白,将整个图像变成黑白效果。通常为了使二值化处理后的图像效果显著,一般采用封闭、连通的边界定义不交叠的区域。
图像二值化阈值方法主要分为三类:
(1)整体阈值法:整个处理过程中只采用全局阈值的方法。若全局阈值为a,则将原图像每一个像素的灰度值与a比较,大于则为黑色,反之则为白色。
(2)局部阈值法:像素的阈值由当前的像素灰度值与该值附近点的局部灰度值来确定。也就是说,将原有图片分为几部分,每个部分采用整体阈值法。
(3)动态阈值法:阈值选择由该像素及附近的灰度值和像素的坐标位置共同决定。
本文采用整体阈值法,主要是对车牌的二值化处理,车牌字符大小统一,故采用整体阈值法即可。通过对图像二值化处理,使图像只剩0或255两个级值,使处理变得简单,并且很大程度上压缩了数据上的储存量。
字符分割子系统设计
车牌字符分割就是把图像中车牌的每个字符分割出来,使其成为单个的字符图像,方便下一步的字符识别可以精确识别。字符分割前,首先需要将图像进行去噪处理,,然后对字符进行分割[12]。分割出来的每个字符将是字符识别输入数据,输入到字符识别的系统。车牌字符分割的原理是利用车牌字符的特点,如字符规定的大小,之间的间隔等等。根据这些特点,本文主要介绍垂直投影分割法。2007年颁布的我国车牌规范普通中小型汽车规定车牌总长440mm,牌照中的7个字符的实际总长为409mm,宽140mm, 每个字符长45mm, 宽90mm,字符间距为10mm,其中前两个字符为车辆归属地信息,第二个字符与第三个字符的间距较为特殊,为15.5mm,最后一个字符与第一个字符距边界25mm。根据这些特点,车辆自动识别系统字符分割部分采用垂直投影分割法,本文也主要介绍垂直投影分割法。
字符分割前的图像去噪处理
图像依然存在较大的图像噪点,为了消除这些噪点我们可以通过处理图像的低频部分来锐化图像。锐化图像采用均值滤波算法,均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。这种方法的基本原理是用图像中像素点的均值代替原图像中的所有像素值。即针对正在处理的像素点和它周围的8个像素点共9个像素点构成一个滤波模板,除去目标象素本身,求模板中其他8个像素点的平均值,再把该平均值赋予当前像素点,作为处理后图像在该点上的灰度,即为该模板中包含当前像素在内的像素总个数。这样处理过后我们观察滤波后的图像中字符更加清楚,效果十分明显,不但噪声去除了,而且图像也得到了锐化,可谓是一举双得。
3.5.2 垂直投影分割法
因为我国对车牌有着严格的规定,包括车牌的大小,字符的大小、间隔等等都有统一的标准。针对这一特征,对于车牌中字符分割这一环节,可以运用垂直投影分割法对字符准确分割。
垂直投影分割法就是将经过灰度处理的车牌图像,将图像的像素灰度值垂直方向累加,就是“垂直投影”。因为车牌中的字符之间的灰度值一般是0,在字符之间会发生灰度值不同的情况,这会产生近似谷底的形状,或者说整个车牌区域会形成波峰的形状。这个波峰就是字符的间隔处,在这个地方对字符进行分割。
字符识别子系统设计
字符识别是车牌识别系统最后一个环节,也是整个车牌识别系统最重要的部分,也是比较困难的部分。
我国的车牌由汉字,数字,字母组成。和与国外的车牌相比,我国车牌的汉字是独一无二的,也是整个车牌识别系统中最困难的部分。因为无法突破汉字识别这一难题,国外的车牌自动识别系统也无法进入我国的市场。而我认为应对这一难题,最好的方法就是使用模板匹配法,我国车牌的汉字部分基本上都是省名字的缩写,数量有限,所以使用模板匹配法可以大大减少识别错误的发生,提高识别的准确率。
3.6.1 字符归一化
因为图像采集时图像的像素值由拍摄设备所决定,但这个图像中字符的大小和我们模板字符库中的字符会出现大小不同的情况,这将直接影响到后面的字符匹配。所以我们需要提前进行字符归一化处理,使图像中字符的大小跟模板图像大小一致,这样可以提高字符识别准确率。
字符识别方法
目前比较常用的字符识别方法主要有人工神经网络识别和模板匹配法。人工神经网络是一种数学模型,它主要是通过模拟人脑思维功能和组织建立起来的。虽然现在神经网络正在迅速发展,但总体来说其中原理还是比较复杂的。模板匹配法是将从待识别的图像中提取一些特征量与模板库里的模板特征量进行比较,计算他们之间规格化的互相关量,我们可以认为互相关量最大的一个为相似程度最高,认为这两个字符匹配成功。也可以通过计算图像字符与模板字符之间的距离,用最小距离法判定所属类相同。
本文采用字符模板匹配法,模板匹配法虽然识别率低,但实现简单,计算量小,只有矩阵的加减与统计,而且车牌字符只有阿拉伯数字,英文大写字母。虽然我国车牌有汉字,但汉字的数量有限。这种方法对字符图像的缺损、污迹干扰适应力强且识别率相当高。
本文结合所选汽车牌照的特点只制作了部分汉字字符模板,字符模板首先通过截取标准的字符图片,然后对其进行二值化处理,然后在图中查找有效连通区域,然后将其归一化处理,每个字符变成为16x16的网格形状,统计整个字符图像中各个网格黑像素的数量,从而得出字符的特征量,同时统计出该字符水平,垂直和左右轮廓特征,将该字符和特征量存入字符模板库。
其中数字模板1的字符特征量较少,识别难度有所增加。针对这一情况,数字字符1的识别模板采用粗线条增加字符特征量,识别效果更好。
close all;
clc
[fn,pn,fi] = uigetfile(’*.jpg’,‘请选择所要识别的图片’);
I = imread([pn fn]); % 读取图像 参数为图像名称和图像路径
figure,imshow(I);
title(‘原始图像’); %显示原始图像
figure(1),imshow(I);title(‘原图’);%显示原始图像
I1=rgb2gray(I);%将彩图转换位灰度图I1
figure(2),subplot(1,2,1),imshow(I1);title(‘灰度图’);%创建显示I1图像,做图1的坐标轴
figure(2),subplot(1,2,2),imhist(I1);title(‘灰度直方图’);%创建显示I1的柱状图,做图2的坐标轴
I2=edge(I1,‘roberts’,0.16,‘both’);
figure(3),subplot(2,2,1),imshow(I2);title(‘roberts算子边缘检测’)
se=[1;1;1];
I3=imerode(I2,se);
figure(3),subplot(2,2,2),imshow(I3);title(‘腐蚀后图像’);
se=strel(‘rectangle’,[25,25]);
I4=imclose(I3,se);
figure(3),subplot(2,2,3),imshow(I4);title(‘平滑图像的轮廓’);
I5=bwareaopen(I4,2000);
figure(3),subplot(2,2,4),imshow(I5);title(‘从对象中移除小对象’);
%------车牌定位,并得到车牌的上边界PY1、下边界PY2、左边界PX1、右边界 PX2
[PY2,PY1,PX2,PX1] = Dingwei_Chepai(I); % 1.定位车牌边界
%------车牌修正,将车牌轮廓稍微扩张 % 2.修正边界
[PY2,PY1,PX2,PX1,threshold] = Xiuzheng_Chepai(PY2,PY1,PX2,PX1);
%------框选出车牌信息,得到车牌图像
bw = I(PY1:PY2,PX1:PX2,:); % 3.裁剪车牌照
figure,subplot(121),imshow(bw);
title(‘车牌图像’);
%------车牌图像灰度处理 % 4. 灰度处理
bw = rgb2gray(bw); % 车牌灰度图像
subplot(122),imshow(bw); % 显示车牌灰度图像
title(‘灰度图像’); % 图像标题
% I = bw;
% [m n]=size(I); % m n分别为图像的行 列数
%— 进行垂直灰度投影
% for y=1:n
% V(y)=sum(I(1:m,y));
% end
% y=1:n;
% figure
% subplot(211), plot(y,V(y));
% title(‘垂直灰度投影’);
% % 进行水平灰度投影
% for x=1:m
% L(x)=sum(I(x,:));
% end
% x=1:m;
% subplot(212),plot(x,L(x));
% title(‘水平灰度投影’);
%------对车牌倾斜位置矫正
qingxiejiao = rando_bianhuan(bw); % 5. 获得图像倾斜角
bw = imrotate(bw,qingxiejiao,‘bilinear’,‘crop’); % 6.位置矫正
%图像进行位置矫正:取值为负值向右旋转 并选区双线性插值 并输出同样尺寸的图像
figure,subplot(121),imshow(bw); % 显示修正后的图像
title(‘倾斜校正’);
%------转化为二值化图像
bw = imbinarize(bw,graythresh(bw)); % 7.二值化处理
subplot(122), imshow(bw);
title(‘二值图像’);
%------形态学处理
bw = Xingtaixue_Chuli(bw,threshold); % 8.形态学操作
%------裁剪使得字体紧贴边界
bw = touying(bw); % 9. 贴近字符裁剪
%对图像进一步裁剪,保证边框贴近字体
figure,subplot(121),imshow(bw);
title(‘上下边界裁剪’);
bw=~bw;
bw = bwareaopen(bw, threshold);
% 移除小面积对象函数 删除二值图像BW中面积小于threshold的对象
bw=~bw; % 10. 擦除
subplot(122),imshow(bw);
title(‘擦除’);
%------分割车牌字符
[y,x] = size(bw); % 11. 单个字符边界分割,并将边界信息赋值与fenge数组中
fenge = shuzifenge(bw,qingxiejiao);
%----拆分过的车牌字符 % 12. 利用fenge数组显示七个字符
[m,k]=size(fenge);
for s=1:2:k-1
subplot(1,k/2,(s+1)/2);
imshow(bw( 1:y,fenge(s):fenge(s+1)));
end
%------定位 % 13.将读取的字符信息分别赋值给7个数组
han_zi = bw( 1:y,fenge(1):fenge(2));
zi_mu = bw( 1:y,fenge(3):fenge(4));
zm_sz_1 = bw( 1:y,fenge(5):fenge(6));
zm_sz_2 = bw( 1:y,fenge(7):fenge(8));
shuzi_1 = bw( 1:y,fenge(9):fenge(10));
shuzi_2 = bw( 1:y,fenge(11):fenge(12));
shuzi_3 = bw( 1:y,fenge(13):fenge(14));
%------修正各个字符的尺寸大小 % 14.规范七个字符的尺寸
%[110 55]指定目标图像的高度与宽度,bilinear采用双线性插值算法
xiuzhenghanzi = imresize(han_zi, [110 55],‘bilinear’);
xiuzhengzimu = imresize(zi_mu, [110 55],‘bilinear’);
xiuzhengzm_sz_1 = imresize(zm_sz_1,[110 55],‘bilinear’);
xiuzhengzm_sz_2 = imresize(zm_sz_2,[110 55],‘bilinear’);
xiuzhengshuzi_1 = imresize(shuzi_1,[110 55],‘bilinear’);
xiuzhengshuzi_2 = imresize(shuzi_2,[110 55],‘bilinear’);
xiuzhengshuzi_3 = imresize(shuzi_3,[110 55],‘bilinear’);
%字符识别==========
%-------导入汉字模板
Lu = imread(‘汉字模板库\Lu.bmp’); % 1. 读取汉字模板
%-----------------------------
s0 = imread(‘数字模板库\0.bmp’); % 2. 读取字母和数字模板
s1 = imread(‘数字模板库\1.bmp’);
s2 = imread(‘数字模板库\2.bmp’);
s3 = imread(‘数字模板库\3.bmp’);
s4 = imread(‘数字模板库\4.bmp’);
s5 = imread(‘数字模板库\5.bmp’);
s6 = imread(‘数字模板库\6.bmp’);
s7 = imread(‘数字模板库\7.bmp’);
s8 = imread(‘数字模板库\8.bmp’);
s9 = imread(‘数字模板库\9.bmp’);
zA = imread(‘字母模板库\A.bmp’);
zB = imread(‘字母模板库\B.bmp’);
zC = imread(‘字母模板库\C.bmp’);
zD = imread(‘字母模板库\D.bmp’);
zE = imread(‘字母模板库\E.bmp’);
zF = imread(‘字母模板库\F.bmp’);
zG = imread(‘字母模板库\G.bmp’);
zH = imread(‘字母模板库\H.bmp’);
zJ = imread(‘字母模板库\J.bmp’);
zK = imread(‘字母模板库\K.bmp’);
zL = imread(‘字母模板库\L.bmp’);
zM = imread(‘字母模板库\M.bmp’);
zN = imread(‘字母模板库\N.bmp’);
zP = imread(‘字母模板库\P.bmp’);
zQ = imread(‘字母模板库\Q.bmp’);
zR = imread(‘字母模板库\R.bmp’);
zS = imread(‘字母模板库\S.bmp’);
zT = imread(‘字母模板库\T.bmp’);
zU = imread(‘字母模板库\U.bmp’);
zV = imread(‘字母模板库\V.bmp’);
zW = imread(‘字母模板库\W.bmp’);
zX = imread(‘字母模板库\X.bmp’);
zY = imread(‘字母模板库\Y.bmp’);
zZ = imread(‘字母模板库\Z.bmp’);
%-----------------------------
%------录入 % 2. 录入操作:灰度、二值和尺寸规范
Hanzi = Luru_hanzi (Lu); % 汉字
Shuzi_Zimu = Luru_ShuziZimu (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,zA,zB…
,zC,zD,zE,zF,zG,zH,zJ,zK,zL,zM,zN,zP,zQ,zR,zS,zT,zU,zV,zW,zX,zY,zZ); %数字、字母
%-------识别
i=1;
jieguohanzi = shibiehanzi(Hanzi,xiuzhenghanzi);
shibiejieguo(1,i) =jieguohanzi;
i=i+1;
jieguozimu = shibiezm_sz(Shuzi_Zimu,xiuzhengzimu);
shibiejieguo(1,i) =jieguozimu;
i=i+1;
jieguozm_sz_1= shibiezm_sz(Shuzi_Zimu,xiuzhengzm_sz_1);
shibiejieguo(1,i) =jieguozm_sz_1;
i=i+1;
jieguozm_sz_2= shibiezm_sz(Shuzi_Zimu,xiuzhengzm_sz_2);
shibiejieguo(1,i) =jieguozm_sz_2;
i=i+1;
jieguoshuzi_1= shibiezm_sz(Shuzi_Zimu,xiuzhengshuzi_1);
shibiejieguo(1,i) =jieguoshuzi_1;
i=i+1;
jieguoshuzi_2 = shibiezm_sz(Shuzi_Zimu,xiuzhengshuzi_2);
shibiejieguo(1,i) =jieguoshuzi_2;
i=i+1;
jieguoshuzi_3= shibiezm_sz(Shuzi_Zimu,xiuzhengshuzi_3);
shibiejieguo(1,i) =jieguoshuzi_3;
i=i+1;
%对话框显示显示===================
shibiejieguo;
msgbox(shibiejieguo,‘识别结果’);
function bw = Xingtaixue_Chuli(bw,threshold)
bw = bwmorph(bw,‘hbreak’,inf);
% hbreak:断开图像中的H型连接,也就是去除两平行线中间的短小连接
% bw0 = bw;
% figure, subplot(231),imshow(bw);
% title(‘断开H连接’);
bw = bwmorph(bw,‘spur’,inf); %移除刺激像素,细小分支,也叫“毛刺”
% bw1 = bw;
% subplot(232),imshow(bw);
% title(‘移除毛刺’);
bw=bwmorph(bw,‘open’,5); %执行形态学开操作(先腐蚀后膨胀)
%可应用在去除电路板线路,只留元器件
% bw2 = bw;
% subplot(233),imshow(bw);
% title(‘先腐蚀后膨胀’);
bw = bwareaopen(bw, threshold); %删除二值图像BW中面积小于threshold的对象,默认情况下使用8邻域
% bw3 = bw;
% subplot(234),imshow(bw);
% title(‘擦除’);
bw=~bw;
% bw4 = bw;
% subplot(235),imshow(bw);
% title(‘取反’);
end
function [PY2,PY1,PX2,PX1] = Dingwei_Chepai(I)
[y,x,~]=size(I); % 行数/列数/RGB层数
myI=double(I); % 将I数据转换成双精度型
Y_threshlow=5; %提取彩图的质量因子
X_firrectify=5; %干扰因子 transaction
%====================== Y 方向============================
Blue_y=zeros(y,1); % 创建y列向量,统计蓝色像素点
for i=1:y
for j=1:x
if((myI(i,j,1)<=48)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=40))…
&&((myI(i,j,3)<=200)&&(myI(i,j,3)>=80)))
%蓝色像素的判断条件:R<=48; 40<=G<=100; 80<=B<=200
% R:28 G:63 B:138
Blue_y(i,1)= Blue_y(i,1)+1; % 1. 统计每行蓝色像素点数
end
end
end
baisebili=0; % 白色比例
changkuanbi=0; %窗口比例
k=0; % 表示进入次数
while(~((baisebili>=0.12)&&(baisebili<=0.5)&&(changkuanbi>=0.20)&&(changkuanbi<=0.6)))
if (k==0) %第一次进来
[temp, MaxY]=max(Blue_y);
% temp表示最多的点数,MaxY表示最多点数所在的行
if temp<=20
%若蓝色像素小于这个值,不符合
msgbox(‘车牌定位出错’,‘warning’); % 对话框提示
pause;
end
PY1=MaxY; %将有最多蓝色像素点的行赋值给PY1
while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1 % 2.寻找图片上边界
PY1=PY1-1;
end
PY2=MaxY; %将有最多蓝色像素点的行赋值给PY2while ((Blue_y(PY2,1)>=Y_threshlow)&&(PY2<y)% 3.寻找图片下边界PY2=PY2+1;end
%X 方向=================
X_threshhigh=(PY2-PY1)/11; %X方向长度
%决定了提取的彩图的质量,适当提高可抗干扰,但是小图会照成剪裁太多
Blue_x=zeros(1,x); % 创建x行向量,统计蓝色像素点
for j=1:x
for i=PY1:PY2 % 由于已经确定Y方向范围,因此在此处只需要处理PY1:PY2阶段
if((myI(i,j,1)<=65)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=40))…
&&((myI(i,j,3)<=160)&&(myI(i,j,3)>=90))) % ??
%蓝色像素的判断条件:R<=65; 40<=G<=100; 90<=B<=160
% R:28 G:63 B:138
Blue_x(1,j)= Blue_x(1,j)+1; % 1. X方向蓝色象素点统计
end
end
end
[~, MaxX]=max(Blue_x);
% MaxX表示最多点数所在的行
PX1=MaxX-6*(PY2-PY1); % 2. 寻找X方向左边界
if PX1<=1
PX1=1;
end
while ((Blue_x(1,PX1)<=X_threshhigh)&&(PX1<x))
% 阈值: X_threshhigh=(PY2-PY1)/11;
PX1=PX1+1;
end %确定出X方向车牌起点
PX2=MaxX+6*(PY2-PY1); % 3. 寻找X方向右边界
if PX2>=x
PX2=x;
end
while ((Blue_x(1,PX2)<=X_threshhigh)&&(PX2>PX1)) %阈值
PX2=PX2-1;
end %确定出X方向车牌终点
%=========================================================
a=PY2-PY1+1; % 宽度
b=PX2-PX1+1; % 长度
White=0; %存储白色区域色素点
for i=PY1:PY2
for j=PX1:PX2
if (std([myI(i,j,1) myI(i,j,2) myI(i,j,3)],1,2)<=22)…
&&(myI(i,j,1)>=90)&&(myI(i,j,1)<=255)
White= White+1; % 白色像素点统计
else
end
end
end
baisebili=White/(a*b); % 白色像素区域比例
changkuanbi=a/b; % 宽高比
k=k+1;
%===========蓝色区域不是车牌区域=
elseif (k~=0)
Blue_y(PY1:PY2,1)=0;
[temp, MaxY]=max(Blue_y);if temp<=20msgbox('车牌定位出错','warning'); pause;endPY1=MaxY; %PY1:存储车牌上边界值while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1))%找到图片上边界 阈值为5PY1=PY1-1; end PY2=MaxY;while ((Blue_y(PY2,1)>=Y_threshlow)&&(PY2<y))%阈值为5PY2=PY2+1; %PY2:存储车牌上边界值end
%2次寻找X方向=================
X_threshhigh=(PY2-PY1)/15;
Blue_x=zeros(1,x); % 进一步确定X方向的车牌区域
for j=1:x
for i=PY1:PY2
if((myI(i,j,1)<=45)&&((myI(i,j,2)<=90)&&(myI(i,j,2)>=20))…
&&((myI(i,j,3)<=160)&&(myI(i,j,3)>=80)))
Blue_x(1,j)= Blue_x(1,j)+1;
end
end
end
[~, MaxX]=max(Blue_x);
PX1=MaxX-6*(PY2-PY1);
if PX1<=1
PX1=1;
end
while ((Blue_x(1,PX1)<=X_threshhigh)&&(PX1<x))%阈值
PX1=PX1+1;
end %确定出X方向车牌起点
PX2=MaxX+6*(PY2-PY1);
if PX2>=x
PX2=x;
end
while ((Blue_x(1,PX2)<=X_threshhigh)&&(PX2>PX1))%阈值
PX2=PX2-1;
end
%=========================================================
a=PY2-PY1+1;b=PX2-PX1+1;
White=0;
for i=PY1:PY2
for j=PX1:PX2
if (std([myI(i,j,1) myI(i,j,2) myI(i,j,3)],1,2)<=16)…
&&(myI(i,j,1)>=90)&&(myI(i,j,1)<=255)
White= White+1; % 白色象素点统计
end
end
end
baisebili=White/(a*b);
changkuanbi=a/b;
k=k+1;
end
end
%========================================================
Y_firrectify=fix((PY2-PY1)/5); %取整 车牌区域修正系数
PY1=PY1-Y_firrectify;%对车牌区域的修正,向上
PY2=PY2+Y_firrectify;%对车牌区域的修正,向下
PX1=PX1-X_firrectify;% 对车牌区域的修正
PX2=PX2+X_firrectify;% 对车牌区域的修正,
end
function [PY2,PY1,PX2,PX1,threshold] = Xiuzheng_Chepai(PY2,PY1,PX2,PX1)
S = (PY2-PY1)*(PX2-PX1); %% 获得车牌面积
if S <= 25000
threshold = 50;
Y_secrectify = 3;
X_secrectify = 3;
elseif S>25000&&S<=45000
threshold=100;
Y_secrectify=-3;
X_secrectify=3;
elseif S>45000&&S<=80000
threshold=200;
Y_secrectify=-3;
X_secrectify=3;
elseif S>80000&&S<=150000
threshold=300;
Y_secrectify=-10;
X_secrectify=-10;
elseif S>150000&&S<=400000
threshold=600;
Y_secrectify=-10;
X_secrectify=-10;
else
threshold=1800;
Y_secrectify=-10;
X_secrectify=-10;
end
PY1=PY1-Y_secrectify;%对车牌区域的进一步修正
PY2=PY2+Y_secrectify;%对车牌区域的进一步修正
PX1=PX1-X_secrectify;%对车牌区域的进一步修正
PX2=PX2+X_secrectify;%对车牌区域的进一步修正
end
function qingxiejiao=rando_bianhuan(I)
I=edge(I); % edge函数获得灰度图像边界
theta = 1:180;
[R,~] = radon(I,theta); %% 图像在不同方向的投影
[~,J] = find(R>=max(max®));% max®找出每个角度对应的最大投影角度 然在对其取最大值,即为最大的倾斜角即90度
qingxiejiao=90-J;
end
function bw = touying(bw)
X_yuzhi=1;
[y,x]=size(bw);
Y_touying=(sum((~bw)’))’; %1.水平投影统计黑点
X_touying=sum((~bw)); %2.垂直投影统计黑点
%找黑体边缘
Y_up=fix(y/2);
Y_yuzhi=mean(Y_touying((fix(y/2)-10):(fix(y/2)+10),1))/1.6;
while ((Y_touying(Y_up,1)>=Y_yuzhi)&&(Y_up>1))
Y_up=Y_up-1; %3.根据阈值,不断上移获取上边界
end
Y_down=fix(y/2);
while ((Y_touying(Y_down,1)>=Y_yuzhi)&&(Y_down<y))
Y_down=Y_down+1; %4.根据阈值,不断上移获取上边界
end
%去除左边边框干扰
X_right=1;
if (X_touying(1,fix(x/14)))<=X_yuzhi
X_right=fix(x/14);
end
%找黑体边缘
bw=bw(Y_up:Y_down,X_right:x);
end
function fenge = shuzifenge(imfenge,~)
[y,x]=size(imfenge);
SS=x*y;
% 1.设定分割阈值
if SS<=20000
shedingyuzhi=4;
elseif SS>20000&&SS<=30000
shedingyuzhi=4;
elseif SS>30000&&SS<=50000
shedingyuzhi=4;
elseif SS>50000&&SS<=80000
shedingyuzhi=4;
else
shedingyuzhi=4;
end
ganrao=SS/100; % 设置干扰系数
% 2. 统计垂直方向的黑点数(背景点数)
histogram=sum(~imfenge); % 对非图像点进行求和
k=1;
for h=1:x-1
if ((histogram(1,h)<=shedingyuzhi)&&(histogram(1,h+1)>shedingyuzhi))…
||((h1)&&histogram(1,h)>shedingyuzhi)
% 3. 判定并存储单个字符的左边界
fenge(1,k)=h;
k=k+1;
elseif ((histogram(1,h)>shedingyuzhi)&&(histogram(1,h+1)<=shedingyuzhi))…
||((hx-1)&&histogram(1,h)>shedingyuzhi)
% 4. 判定并存储单个字符的右边界
fenge(1,k)=h+1;
k=k+1;
else
end
end
k=k-1; %去掉上步中多产生的1
if k<10
msgbox(‘提取出错’,‘警告’);
else
end
% 5. 字符大小确认
if (sum(histogram(1,fenge(1,1):fenge(1,2)))<ganrao)||((fenge(1,2)-fenge(1,1))<(fenge(1,4)-fenge(1,3))/2)
%不符合字符的条件
for i=3:k
fenge(1,i-2)=fenge(1,i); %将字符边界刷选掉
end
else
end
[~, n]=size(fenge);
if n<14 %因为有7个字符,14个字符边界
msgbox(‘提取出错’,‘警告’); % 6. 字符边界确认
end
fenge=fenge(1,1:14); % 7. 将字符的边界值赋值给fenge
end
function Shibie_hanzi=shibiehanzi(hanzi,xiuzhenghanzi)
[y,x,z]=size(xiuzhenghanzi);
for k=1:1
sum=0;
for i=1:y
for j=1:x
if hanzi(i,j,k)xiuzhenghanzi(i,j)%统计黑白
sum=sum+1;
else
end
end
end
baifenbi(1,k)=sum/(x*y);
end
Shibie_Xuhao = find(baifenbi>=max(baifenbi)); % 寻找最大值max(即最相似的)所在的序号位置
Shibie_hanzi = Shibie_Xuhao;
if Shibie_hanzi1
Shibie_hanzi=‘桂’;
else
end
end
function Shibie_Shuzizimu = shibiezm_sz(shuzizimu,xiuzhengzm_sz)
[y,x,z]=size(xiuzhengzm_sz);
for k=1:34
sum=0;
for i=1:y
for j=1:x
if shuzizimu(i,j,k)==xiuzhengzm_sz(i,j)%统计黑白
sum=sum+1;
end
end
end
baifenbi(1,k)=double(sum/(x*y));
end
chepai= find(baifenbi>=max(baifenbi)); % 寻找最大值max(即最相似的)所在的序号位置
chepai=chepai(1,1);
%=数字直接返回=======
if (chepai>=1)&&(chepai<=10)
zm_sz = chepai-1; %第一个位置是0,序号与数字相差1
zm_sz = num2str(zm_sz);
elseif (chepai>=11)&&(chepai<=34)
%字母对应序号转字母==
%=11-15 ABCDE 16-20FGHIJ 21-25 KLMNP 26-30 QRSTU 31-35 VWXYZ
if chepai11
zm_sz=‘A’;
elseif chepai12
zm_sz=‘B’;
elseif chepai13
zm_sz=‘C’;
elseif chepai14
zm_sz=‘D’;
elseif chepai15
zm_sz=‘E’;
elseif chepai16
zm_sz=‘F’;
elseif chepai17
zm_sz=‘G’;
elseif chepai18
zm_sz=‘H’;
elseif chepai19
zm_sz=‘J’;
elseif chepai20
zm_sz=‘K’;
elseif chepai21
zm_sz=‘L’;
elseif chepai22
zm_sz=‘M’;
elseif chepai23
zm_sz=‘N’;
elseif chepai24
zm_sz=‘P’;
elseif chepai25
zm_sz=‘Q’;
elseif chepai26
zm_sz=‘R’;
elseif chepai27
zm_sz=‘S’;
elseif chepai28
zm_sz=‘T’;
elseif chepai29
zm_sz=‘U’;
elseif chepai30
zm_sz=‘V’;
elseif chepai31
zm_sz=‘W’;
elseif chepai32
zm_sz=‘X’;
elseif chepai33
zm_sz=‘Y’;
elseif chepai34
zm_sz=‘Z’;
end
end
Shibie_Shuzizimu = zm_sz;
end
function Hanzi = Luru_hanzi (Gui_lin)
Hanzi(:,:,1) =imresize(im2bw(Gui_lin,graythresh(rgb2gray(Gui_lin))),[110 55],‘bilinear’);
End
function Shuzi_Zimu = Luru_ShuziZimu (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,zA,zB…
,zC,zD,zE,zF,zG,zH,zJ,zK,zL,zM,zN,zP,zQ,zR,zS,zT,zU,zV,zW,zX,zY,zZ)
Shuzi_Zimu(:,:,1) =imresize(im2bw(s0, graythresh(rgb2gray(s0))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,2) =imresize(im2bw(s1, graythresh(rgb2gray(s1))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,3) =imresize(im2bw(s2, graythresh(rgb2gray(s2))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,4) =imresize(im2bw(s3, graythresh(rgb2gray(s3))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,5) =imresize(im2bw(s4, graythresh(rgb2gray(s4))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,6) =imresize(im2bw(s5, graythresh(rgb2gray(s5))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,7) =imresize(im2bw(s6, graythresh(rgb2gray(s6))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,8) =imresize(im2bw(s7, graythresh(rgb2gray(s7))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,9) =imresize(im2bw(s8, graythresh(rgb2gray(s8))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,10) =imresize(im2bw(s9, graythresh(rgb2gray(s9))), [110 55],‘bilinear’);
Shuzi_Zimu(:,:,11) =imresize(im2bw(zA,graythresh(rgb2gray(zA))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,12) =imresize(im2bw(zB,graythresh(rgb2gray(zB))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,13) =imresize(im2bw(zC,graythresh(rgb2gray(zC))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,14) =imresize(im2bw(zD,graythresh(rgb2gray(zD))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,15) =imresize(im2bw(zE,graythresh(rgb2gray(zE))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,16) =imresize(im2bw(zF,graythresh(rgb2gray(zF))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,17) =imresize(im2bw(zG,graythresh(rgb2gray(zG))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,18) =imresize(im2bw(zH,graythresh(rgb2gray(zH))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,19) =imresize(im2bw(zJ,graythresh(rgb2gray(zJ))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,20) =imresize(im2bw(zK,graythresh(rgb2gray(zK))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,21) =imresize(im2bw(zL,graythresh(rgb2gray(zL))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,22) =imresize(im2bw(zM,graythresh(rgb2gray(zM))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,23) =imresize(im2bw(zN,graythresh(rgb2gray(zN))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,24) =imresize(im2bw(zP,graythresh(rgb2gray(zP))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,25) =imresize(im2bw(zQ,graythresh(rgb2gray(zQ))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,26) =imresize(im2bw(zR,graythresh(rgb2gray(zR))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,27) =imresize(im2bw(zS,graythresh(rgb2gray(zS))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,28) =imresize(im2bw(zT,graythresh(rgb2gray(zT))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,29) =imresize(im2bw(zU,graythresh(rgb2gray(zU))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,30) =imresize(im2bw(zV,graythresh(rgb2gray(zV))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,31) =imresize(im2bw(zW,graythresh(rgb2gray(zW))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,32) =imresize(im2bw(zX,graythresh(rgb2gray(zX))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,33) =imresize(im2bw(zY,graythresh(rgb2gray(zY))),[110 55],‘bilinear’);
Shuzi_Zimu(:,:,34) =imresize(im2bw(zZ,graythresh(rgb2gray(zZ))),[110 55],‘bilinear’);
end