重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
目录
在路南等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站制作、成都网站建设 网站设计制作按需求定制网站,公司网站建设,企业网站建设,品牌网站制作,成都全网营销,外贸网站制作,路南网站建设费用合理。一、导入图片
1. 从文件导入
1.1 原理:
1.2 代码:
2. 摄像头拍照识别
2.1 了解
2.1 代码:
二、预处理
1. 预处理—— 原图—>灰度图
2. 预处理—— 边缘检测
2.1 概述
2.2 方法一:权值加重法
2.3 方法二:函数edge()
2.4 常见边缘检测算子
编辑
2.5 边缘检测算子各自的优缺点:
3.预处理—— 腐蚀
3.1 原理:
3.2 代码:
3.3 结果:
4. 预处理——闭运算
4.1 原理:
4.2 代码:
4.3 结果:
5.预处理——去除小对象
5.1 原理:
5.2 代码:
5.3 结果:
二、车牌定位
1. 车牌定位—— 粗定位(确定行、列的起始和终止位置)
1.1 原理:
1.2 代码:
1.3 结果
2. 车牌定位——倾斜矫正
2.1 原理
2.2 代码
2.3 结果
3. 车牌定位——精定位之预处理——对定位后的车牌进行灰度处理、直方图均衡化
4. 车牌定位——精定位之二值化
4.1 原理
4.2 代码
4.3 结果
5. 车牌定位——精定位之均值滤波
6. 车牌定位——精定位之去点处理
7. 车牌定位——精定位之去除上下边框和铆钉
三、车牌字符分割
1. 垂直投影法
2. 归一化
四、车牌字符识别
五、改进
简介:
进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发,具体涉及到的有以下五部分:导入图片、图像预处理、车牌定位、车牌字符分割、车牌字符识别。采用GUI完成车牌识别,传参进行交互。
车牌了解:
1. 我国汽车牌照的底色和字符颜色多样,蓝底白字、黄底黑字、黑底白字、红底黑字、绿底白字、黄底黑字多种
2. 我国标准车牌照是由汉字、英文字母和阿拉伯数字组成的,汉字的识别与字母和数字的识别有很大的不同,增加了识别的难度。
3. 目前我国有普通地方车牌号、武警车牌号、军队车牌号三种类型,普通地方车牌号又叫自选号牌车牌,自选号牌车牌尺寸是520 ×122.5MM,即车牌长宽比为4.5:1,一共7个字符,每个字符的高宽比为2:1。首个字符为中文字符,为各个省或直辖市的简称,第二个字符为英文大写字符,前两个字符确定该车牌所在地,后五个字符由阿拉伯数字及英文大写字符组合而成,并且后五个字符间距相同,七个字符大小也相同。
一、导入图片 1. 从文件导入 1.1 原理:uigetfile函数的调用格式为:[filename,filepath]=uigetfile(…),执行此函数可得到供用户选择图片文件的对话框,用户选择要识别的图片并点击“打开”按钮后,会返回此图片的文件名和路径名,分别保存到filename和pathname两个变量中,然后通过imread函数将图像数据读出,赋值给变量I,从而实现图像数据的读入。
1.2 代码:function pushbutton1_Callback(hObject, eventdata, handles)
[filename pathname]=uigetfile({'.jpg'}, '选择需要识别的车牌图像');
Origin=imread([pathname '\' filename]);
handles.Origin=Origin;
guidata(hObject, handles);
axes(handles.axes1);
imshow(Origin);title('原图');
2. 摄像头拍照识别
2.1 了解写的挺详细的一篇,可以参考下相关内容
Matlab摄像头基本操作https://zhuanlan.zhihu.com/p/488540327
2.1 代码:function openCamera_Callback(hObject, eventdata, handles)
vid = videoinput('winvideo',1,'RGB24_1280x720');
vidRes1=get(vid,'VideoResolution');%获取视频的尺寸
nBands1=get(vid,'NumberOfBands');%采集视频的颜色通道
set(vid,'ReturnedColorSpace','rgb');
himage1=imshow(zeros(vidRes1(2),vidRes1(1),nBands1));
preview(vid,himage1);
handles.vid=vid;
guidata(hObject, handles);
function btnTakePhoto_Callback(hObject, eventdata, handles)
vid=handles.vid;
frame = getsnapshot(vid);
axes(handles.axes1);
imwrite(frame,'I.png');
I=imread('I.png');
axes(handles.axes1);
imshow(I,[]);
title('拍摄完成');
handles.Origin=I; %更新原图
guidata(hObject, handles);
二、预处理
1. 预处理—— 原图—>灰度图 不管哪种底色的车牌,其底色与上面的字符颜色的对比度大,将RGB图像转化成灰度图像时,车牌底色跟字符的灰度值会相差很大。例如蓝色(255,0,0)与白色(255,255,255)在R通道中并无区分,而在G、R通道或是灰度图象中数值相差很大。同理对白底黑字的牌照可用R通道,绿底白字的牌照可以用G通道就可以明显呈现出牌照区域的位置,便于后续处理。原图、灰度对于将彩色图象转换成灰度图象时,图象灰度值可由下面的公式计算:
G = 0.299R+0.587G+0.114B,使用了权值加重法,可以突出某个通道,Matlab内的RGB转灰度图函数rgb2gray()使用的是(1)式权值比例公式,这样就可以利用边缘检测方法。
通过检测图像中不同区域的边缘来实现对图像的分割。边缘检测的实质就是检测图像特性发生变化的位置。汽车牌照最主要的特点就是其边界。汽车牌照底色、牌照边缘颜色以及牌照以外的颜色都是不相同的,表现在汽车原始图像中,即灰度级互不相同,这样就在牌照的边缘形成了灰度突变边界。边缘检测3.4是大多数图像处理必不可少的一步,也是所有基于边界的图像分割的第一步,它的任务就是精确定位边缘和抑制噪声。图像的边缘是指图像局部亮度变化最显著的部分,即在灰度级上发生急剧变化的区域。
2.2 方法一:权值加重法 2.3 方法二:函数edge()(1)说明:
函数edge()说明https://ww2.mathworks.cn/help/images/ref/edge.html?searchHighlight=edge&s_tid=srchtitle_edge_1#buo5g3w-1-BW
(2)method——边缘检测方法
2.4 常见边缘检测算子2.4.1 梯度算子
%边缘检测
%梯度算子
Image=im2double(rgb2gray(imread('room.jpg')));
subplot(1,2,1),imshow(Image),title('原图像');
[h,w]=size(Image);
edgelmage=zeros(h,w);
for x=1:w-1
for y=1:h-1
edgeImage(y,x) = abs(Image(y,x+1)-Image(y,x)) + abs(Image(y+1,x)-Image(y,x));
end
end
subplot(1,2,2),imshow(edgeImage),title('梯度图像');
2.4.2 Robert算子
Image=im2double(rgb2gray(imread('room.jpg')));
subplot(2,2,1),imshow(Image),title('原图');
% edge查找二维灰度图像中的边缘
BW = edge(Image,'roberts');
subplot(2,2,2),imshow(BW),title('边缘检测');
H1=[1 0;0 -1];
H2=[0 1;-1 0];
% B=imfilter(A,h),使用多维滤波器h对多维数组A进行滤波,并在B中返回结果。
R1=imfilter(Image,H1);
R2=imfilter(Image,H2);
edgeImage=abs(R1)+abs(R2);
subplot(2,2,3),imshow(edgeImage),title('Robert梯度图像');
sharpImage=Image+edgeImage;
subplot(2,2,4),imshow(sharpImage),title('Robert锐化图像');
2.4.3 Sobel算子
%边缘检测
%Sobel算子
Image=im2double(rgb2gray(imread('room.jpg')));
subplot(2,2,1),imshow(Image),title('原图');
BW= edge(Image,'sobel');
subplot(2,2,2),imshow(BW),title('边缘检测');
H1=[-1 -2 -1;0 0 0;1 2 1];
H2=[-1 0 1;-2 0 2;-1 0 1];
R1=imfilter(Image,H1);
R2=imfilter(Image,H2);
edgeImage=abs(R1)+abs(R2);
subplot(2,2,3),imshow(edgeImage),title('Sobel梯度图像');
sharpImage=Image+edgeImage;
subplot(2,2,4),imshow(sharpImage),title('Sobel锐化图像');
2.4.4 Prewitt算子
%边缘检测
%Prewitt算子
Image=im2double(rgb2gray(imread('room.jpg')));
subplot(1,3,1),imshow(Image),title('原图');
H1=[-1 -1 -1;0 0 0;1 1 1];
H2=[-1 0 1;-1 0 1;-1 0 1];
R1=imfilter(Image,H1);
R2=imfilter(Image,H2);
edgeImage1=abs(R1)+abs(R2);
sharpImage1=edgeImage1+Image;
subplot(1,3,2),imshow(edgeImage1),title('两个模板梯度图像');
subplot(1,3,3),imshow(sharpImage1),title('两个模板锐化图像');
2.4.5 Canny算子
特点:分别采用了两个不同的阈值对图像中的强边缘和弱边缘进行检测,并且当且仅当弱边缘和强边缘有连接时,才在最后的检测结果中将弱边缘显示出来。
%边缘检测
%Canny算子
Image=im2double(rgb2gray(imread('room.jpg')));
subplot(1,2,1),imshow(Image),title('原图像');
BW = edge(Image,'canny');
subplot(1,2,2),imshow(BW),title('Canny边缘检测');
2.5 边缘检测算子各自的优缺点:梯度算子计算简单,但精度不高,只能检测出图像大致的轮廓,而对于比较细的边缘可能会忽略。Roberts算子利用局部差分算子寻找边缘,边缘定位精度较高,但容易丢失部分边缘,由于没有经过平滑处理,因此不具备抑制噪声能力。Sobel算子和 Prewitt算子都是先对图像先做加权平滑滤波处理,然后再做微分运算,对噪声有一定抑制能力但不能完全排除检测结果出现虚假边缘。Canny 算子有抑制噪声能力,但会将一些高频边缘平滑掉。Prewitt 和 Sobel 算子比Roberts效果要好一些。Canny算子的检测效果优于梯度算子,能够检测出图像较细的边缘部分。
使用 imerode 函数进行图像腐蚀。J = imerode(I,SE)侵蚀灰度,二进制或压缩的二进制图像I,返回侵蚀的图像J。 SE是结构元素对象或结构元素对象数组,由strel或offsetstrel函数返回。腐蚀是一种消除边界点,使边界向内部收缩的过程,可以用来消除小且无意义的物体。用结构元素扫描图像的每一个像素,用结构元素与图像做“与”操作,如果都为1,结果图像的该像素为1,否则为0。即图像中背景与结构元素重合的像素点输出值为1,不完全重合的和不重合的像素点输出值为0,以此实现削减无关结构的目的。
3.2 代码:function pushbutton4_Callback(hObject, eventdata, handles)
I=handles.BianYuan;
%se1=[1;1;1];
edit3=get (handles.edit3,'string');
edit3_1=round(str2double(edit3)) ;
se=strel('rectangle',[edit3_1,1]);
FuShi = imerode(I,se);
handles.Fushi=FuShi;
guidata(hObject, handles);
axes(handles.axes4)
imshow(FuShi,[]),title('图像腐蚀');
3.3 结果:4. 预处理——闭运算
4.1 原理:先膨胀图像,然后对图像进行腐蚀。其功能是来填充物体内的细小空洞,连接邻近的物体,平滑边界,同时不明显改变面积。
4.2 代码:function pushbutton5_Callback(hObject, eventdata, handles)
I=handles.Fushi;
edit4=get(handles.edit4,'string');
edit4_1=round(str2double(edit4)) ;
se2 = strel('rectangle', [edit4_1,edit4_1]);
TianChong = imclose(I,se2) ;%使用闭运算进行平滑处理
handles.TianChong = TianChong;
guidata(hObject, handles);
axes(handles.axes5);
imshow(TianChong,[]),title('平滑处理后的图像');
4.3 结果:5.预处理——去除小对象
5.1 原理:利用bwareaopen函数对小于车牌区域面积的连通对象进行剔除,防止其他连通对象干扰后面车牌区域的分割。去掉了不相关的区域,保留了感兴趣的区域。bwareaopen函数:删除二值图像BW中相互连接的像素个数小于P的对象,默认情况下conn使用8邻域。
5.2 代码:function pushbutton6_Callback(hObject, eventdata, handles)
I=handles.TianChong;
edit5=get (handles.edit5,'string');
edit5_1=double(str2double(edit5));
morphological = bwareaopen(I,edit5_1) ;
handles.morphological = morphological;
guidata(hObject, handles);
axes(handles.axes6);
imshow(morphological,[]),title('移除小对象');
5.3 结果:二、车牌定位
1. 车牌定位—— 粗定位(确定行、列的起始和终止位置)
1.1 原理:通过比较累计行像素灰度值和列像素灰度值确定车牌的真实位置。首先使用size函数得到该图像矩阵的行数y和列数x,用zero函数建立一个y行1列的零矩阵blue_Y,然后使用嵌套循环结构遍历该二值图像的每一个像素点,把每行值为1的像素点(也就是蓝色像素点)的数量分别记录在先前创建的矩阵blue_y中。遍历完之后,找出blue_y矩阵中值大的元素,它所对应的行即为该二值图像中蓝色像素点最多的行。然后我们以这一行为起点,分别向上向下逐行扫描,当被扫描到的蓝中白色像素点多于某个值时,继续扫描,直到扫描到某行中的蓝色像素点数量小于估计值时,停止扫描,并记录这一行的行数,该行数即为车牌的上边界(或下边界)。同理,我们可以用相同的方法确定出车牌的左边界和右边界。然后将原图按照上述方法确定的坐标进行裁剪,即可得到仅有车牌的图像。
1.2 代码:function pushbutton7_Callback(hObject, eventdata, handles)
%Origin=handles.Origin;
[y, x, z] = size(handles.morphological); %返回预处理后各维的尺寸,存储在x,y,z中
img = double(handles.morphological); %转成双精度浮点型
% 车牌的蓝色区域
% Y方向
blue_Y = zeros(y, 1);%产生一个y*1的零阵
for i = 1:y
for j = 1:x
if(img(i, j) == 1) % 判断车牌位置区域,如果img图像坐标(i,j)点值为1,即背景颜色为蓝色,blue加一
blue_Y(i, 1) = blue_Y(i, 1) + 1; % 蓝色像素点统计
end
end
end
% 找到Y坐标的最小值
img_Y1 = 1;
while (blue_Y(img_Y1)< 5) && (img_Y1< y)
img_Y1 = img_Y1 + 1;
end
% 找到Y坐标的大值
img_Y2 = y;
while (blue_Y(img_Y2)< 5) && (img_Y2 >img_Y1)
img_Y2 = img_Y2 - 1;
end
% x方向
blue_X = zeros(1, x);
for j = 1:x
for i = 1:y
if(img(i, j) == 1) % 判断车牌位置区域
blue_X(1, j) = blue_X(1, j) + 1;
end
end
end
% 找到x坐标的最小值
img_X1 = 1;
while (blue_X(1, img_X1)< 5) && (img_X1< x)
img_X1 = img_X1 + 1;
end
% 找到x坐标的大值
img_X2 = x;
while (blue_X(1, img_X2)< 5) && (img_X2 >img_X1)
img_X2 = img_X2 - 1;
end
% 对图像进行裁剪
DingWei = handles.Origin(img_Y1:img_Y2, img_X1:img_X2, :);
handles.DingWei = DingWei;
guidata(hObject, handles);
axes(handles.axes7);
imshow(DingWei);title('定位剪切后的彩色车牌图像');
1.3 结果2. 车牌定位——倾斜矫正
2.1 原理基于Radon变换的车牌图像倾斜校正算法的实现,将车牌图像朝各个方向投影,进而通过分析各方向的投影特性确定车牌的倾斜角度。
2.2 代码pictureGray1 = rgb2gray(DingWei);
%水平方向调整
T=affine2d([0 1 0;1 0 0;0 0 1]);
pictureTr=imwarp(pictureGray1,T); % 图像转置,顺时针旋转90°调整水平方向
theta = -20 : 20; %设置倾斜角度的范围
r1 = radon(pictureTr, theta); %radon变换确定倾斜角
result1 = sum(abs(diff(r1)), 1); %求出行倒数绝对值的累加和,大的对应倾斜角
rot1 = find(result1==max(result1))-21;
pictureRo = imrotate(DingWei, rot1);
%竖直方向调整
pictureGray2 = rgb2gray(pictureRo);
r2 = radon(pictureGray2, theta);
result2 = sum(abs(diff(r2)), 1);
rot2 = (find(result2==max(result2))-21)/57.3; %将数值转为角度
if rot2>0
T1 = affine2d([1 0 0 ; -tan(rot2) 1 0 ; size(pictureGray2, 1) * tan(rot2) 0 1]);
else
T1 = affine2d([1 0 0 ; tan(-rot2) 1 0 ; size(pictureGray2, 1) * tan(-rot2) 0 1]);
end
fx = imwarp(pictureRo, T1);
handles.fx = fx;
guidata(hObject, handles);
axes(handles.axes8);
imshow(fx);title('倾斜校正后的图像');
2.3 结果 3. 车牌定位——精定位之预处理——对定位后的车牌进行灰度处理、直方图均衡化直方图均衡是一种利用灰度变换自动调节图像对比度的方法,通过灰度级的概率密度函数求出灰度变换函数,它是一种以累积分布函数变换法为基础的直方图修正法。把原始图像的灰度分布直方图变换为均匀分布的形式,扩大像素灰度值的动态范围,从而增强图像对比度。histeq使用直方图均衡增强对比度。
4. 车牌定位——精定位之二值化 4.1 原理最常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群,即对图像二值化。所谓二值化实际上就是把原图中的每个像素点的分别设置为0或255两个值,简单来说就是把整副原图转换成黑白图像。若当图中的哪点的灰度值大于这个值时就将该点设为大255,反之如果图像中的某点的灰度值小于这个值的时候就将该点值设为最小0。查找资料得知图像大灰度值减去图像大灰度值与最小灰度值之差的三分之一可获得令人满意的阈值,二值化的效果较好。
也可用matlab自带函数: imbinarize函数进行二值化 ,通过阈值化将二维灰度图像或三维进行二值化 ,将所有高于全局阈值的值替换为 1 ,并将所有其他值设置为 0。 在默认情况下,imbinarize 使用 Otsu 方法,该方法选择特定阈值来最小化阈值化的黑白像素的类内方差。
4.2 代码H_max = double(max(max(balance)));
H_min = double(min(min(balance)));
T=round(H_max-(H_max-H_min)/3); %T为二值化的阈值
[m,n]=size(balance);
BW=(double(balance)>=T);%d:二值图像
%BW=im2bw(balance,T/256);
handles.BW = BW;
guidata(hObject, handles);
axes(handles.axes11);
imshow(BW),title("二值化车牌图片");
4.3 结果 5. 车牌定位——精定位之均值滤波均值滤波主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度,本质对领域内的矩阵求均值。它通常用于去除图像中高斯噪声。有效抑制加性噪声。
均值滤波效果分析:
fspecial:创建预定义的二维滤波器
补充:
1. 高斯滤波
原理:
特点:
2. 中值滤波
原理:噪声的出现,使被处理点像素比周围像素亮(暗)许多。以被处理点为中心,选取一个邻域窗口,窗口内所有点值排序,取中值代替该点值。
均值、中值滤波效果分析:
去除车牌字符间的点,防止后面分割时将点误以为字符被分割,导致最后一个数字未能成功分割。
[m,n]=size(avg);
avg(:,round(n*122/430):round(n*137/430))=0;%去除中间的点
d=bwareaopen(avg,40);%用于删除二值图像中面积小于一个定值(此处为65)的对象,默认情况下使用8邻域
handles.d=d; %更新原图
guidata(hObject, handles);
axes(handles.axes13);
imshow(d),title('去点处理');
7. 车牌定位——精定位之去除上下边框和铆钉去边界化是指删除车牌的上下边界,为字符分割及识别做准备;而左右边界不需删除,因为将在字符分割步骤中做处理。经过分析,图像中字母和数字的上下边界像素所在的行会出现多次黑白交替。计算各列之间的差值并累加,分别计算边界坐标。从上到下逐行扫描像素,若此行黑白像素交替次数低于某一阈值(设为10),则删除该行。
diff_row = diff(d,1,2); % 前一列减后一列
diff_row_sum = sum(abs(diff_row), 2); %1为列, 2为行
[rows, columns] = size(d);
trows = ceil(rows*(1/3));
j = trows;
for i=1:trows
if diff_row_sum(j,1)<10
plate.rowa = j;
break;
end
j = trows-i;
end
for i=2*trows:size(diff_row_sum,1)
if diff_row_sum(i,1)<10
plate.rowb = i;
break;
end
end
I = d(plate.rowa:plate.rowb, :);
d=remove_extra_region(I);
handles.d=d;
guidata(hObject, handles);
axes(handles.axes21);
imshow(d);title('去除上下边框和铆钉');
三、车牌字符分割
1. 垂直投影法字符分割的方法也有多种:1.基于聚类分析的字符分割;2.投影分割的方法;3.基于模板匹配的字符分割等。最常用的是投影分割,主要是针对在车牌定位,图像预处理后比较规则的车牌图像。
在全局阈值算法中,Otsu在判别与最小二乘原理的基础上推导出来的大方差阈值算法,速度快,且准确率。其原理是:设车牌图像前景与后景分割阈值为X,前景点数占图像比例记为k1,平均灰度u1;后景点数比例k2,平均灰度u2;图像总平均灰度u=u1×k1+u2×k2。取X从最小灰度值到大灰度值,当X使得γ=k1×(u1-u)2+k2×(u2-u)2为大时即为最佳阈值。由于灰度值的分布情况,由方差值的大小来表现,因而当方差γ越大,说明前景和背景的差别γ越大。当前景被绘制到背景区域或背景被分为前景区域时,方差变小,所以当X使方差γ大时,它是最好的阈值。
从左到右逐列扫描像素,若此列像素均为黑色,在此处切割图像。检测每个图像块的宽度,若低于某一阈值,认为此区域为左右边界或字符中间的分隔区域,删除此图像块。
function pushbutton8_Callback(hObject, eventdata, handles)
d = handles.d;
%切割图像
d = my_imsplit(d);
[m, n] = size(d);
s = sum(d); %sum(x)就是竖向相加,求每列的和,结果是行向量;
j = 1;
k1 = 1;
k2 = 1;
while j ~= n
while s(j) == 0
j = j + 1;
end
k1 = j;
while s(j) ~= 0 && j<= n-1
j = j + 1;
end
k2 = j - 1;
if k2 - k1 >round(n / 6.5)
[val, num] = min(sum(d(:, [k1+5:k2-5])));
d(:, k1+num+5) = 0;%分割
end
end
%再切割
d = my_imsplit(d);
%切割出7个字符
y1=10;
y2=0.25;
flag=0;
word1=[];
while flag == 0
[m, n] = size(d);
left = 1;
width = 0;
while sum(d(:, width+1)) ~= 0
width = width + 1;
end
if width< y1
d(:, [1:width]) = 0;
d = my_imsplit(d);
else
temp = my_imsplit(imcrop(d, [1,1,width,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 >y2
flag = 1;
word1 = temp;
end
d(:, [1:width]) = 0;
d = my_imsplit(d);
end
end
%分割出第二至七个字符
[word2,d]=getword(d);
[word3,d]=getword(d);
[word4,d]=getword(d);
[word5,d]=getword(d);
[word6,d]=getword(d);
[word7,d]=getword(d);
[m,n]=size(word1);
2. 归一化目前常用的主要有两个,一是缩小或放大待识别字符的外框使其变成一特定的大小;另一种则是通过分析字符在两个方向上的像素点做字符归一化。imresize对图像做缩放处理,常用调用格式为:B=imresize(A,ntimes,method);其中method可选nearest,bilinear(双线性),bicubic,box,lanczors2,lanczors3等。
word1=imresize(word1,[40 20]);
word2=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]);
四、车牌字符识别字符识别的基本方法通常有三类:1.结构特征分析方法;2.模板匹配法;3.神经网络法。此处采用的是模板匹配的方法,即是将要识别的字符与事先构造好的模板进行比对,根据与模板的相似度的大小来确定最终的识别结果。基于模板匹配算法是首先将分割后的字符二值化,并将其尺寸缩放为字符数据库中模板的大小,然后与所有模板进行匹配,最后选取最佳匹配作为结果。建立数字库对该方法在车牌识别过程中很重要,数字库准确才能保证检测出的数据正确。模板匹配是图象识别方法中最具代表性的基本方法之一,它是将从待识别的图象或图象区域f(i,j)中提取的若干特征量与模板T(i,j)相应的特征量逐个进行比较,计算它们之间规格化的互相关量,其中互相关量大的一个就表示期间相似程度最高,可将图象归于相应的类。也可以计算图象与模板特征量之间的距离,用最小距离法判定所属类。
此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度大的输出。汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,紧接其后的为字母与数字。首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符相减,得到的0越多那么就越匹配。把每一幅相减后的图的0值个数保存,即为识别出来的结果。
Step 1.将分割完的图像用最近邻差值resize为20*40大小(与字符模板
同样大小)。
Step 2.采用误差法衡量匹配度,第p个分割图像与第q个模板匹配的误
差值为:
Step 3.对于每个分割图像,取误差值最小的模板当做其匹配图像。
Step 4.输出每个分割图像对应的车牌字符。
function pushbutton9_Callback(hObject, eventdata, handles)
code=char(['0':'9' 'A':'Z' '京津豫辽皖鲁浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼']);%京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼、京津浙粤豫辽鄂陕鲁
SubBw2=zeros(40,20);
l=1;
for I=1:7;
ii=int2str(I);
t=imread([ii,'.jpg']);
SegBw2=imresize(t,[40 20],'nearest');
SegBw2=double(SegBw2)>20;
if l==1 %第一位汉字识别
kmin=37;
kmax=43;
elseif l==2 %第二位字母识别
kmin=11;
kmax=36;
else l>=3 %第三位后字母或数字识别
kmin=1;
kmax=36;
end
for k2=kmin:kmax
fname=strcat('字符模板\',code(k2),'.jpg');
SamBw2=imread(fname);
SamBw2=double(SamBw2)>1;
for i=1:40
for j=1:20
SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);
end
end
%相当于两幅图相减得第三幅图
Dmax=0;
for k1=1:40;
for l1=1:20
if(SubBw2(k1,l1)>0 | SubBw2(k1,l1)<0)
Dmax=Dmax+1;
end
end
end
Error(k2)=Dmax;
end
Error1=Error(kmin:kmax);
MinError=min(Error1);
findc=find(Error1==MinError);
Code(l*2-1)=code(findc(1)+kmin-1);
Code(l*2)=' ';
l=l+1;
end
% 显示识别结果
disp(Code);%disp:显示变量的值
msgbox(Code,'识别出的车牌号');%msgbox:创建消息对话框
项目不是特别成熟,只能正确识别出车牌位置比较规整的图像,还需要再改进。
一是当车牌图像的对比度较小、光照不均匀、车牌磨损褪色以及有类似车牌纹理特征的干扰时,有效定位率下降;其次在车牌字符分割时,光照不均、对比度较小、倾斜、污迹、字符粘连和断裂等严重退化的车牌图像的字符分割效果也不理想。
五、改进1.采用hsv颜色系统,添加图片亮度检测环节,判定图片景的光照条件,依据光照强度的不同匹配不同颜色进行判断,进而优化车牌定位
2.字符识别匹配环节中,可增加多套字符模板,添加不同角度的字符样板,多次匹配,提高识别正确率
3.迫于时间,交互只做了预处理部分,可以动态调整参数值,后面可以多设置参数部分,可以根据不同场景不同角度车牌进行调整
4.学习神经网络进行车牌识别,主要有两种方法:一种方法是对待识别字符进行特征提取,然后用获得的特征来训练神经网络分类器。另一种方法则充分利用神经网络的特点,直接把待处理图像输入网络,由网络自动实现特征提取直至识别。
基于BP神经网络的字母识别系统设计与实现 - 道客巴巴 (doc88.com)
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧