Matlab-车牌识别
修改优化后代码链接:https://download.csdn.net/download/qq_43571150/12033276
⻋牌自动识别技术的关键在于⻋牌定位、字符切割、字符识别及后续处理等
- Hough变换的方法在⻋牌区域变形或图象被污损情况下容易失效
- 灰度分割则比直线检测的方法要稳定,但当图象在有许多与⻋牌的灰度非常相似的区域时,该方法也容易失效
- 纹理分析在遇到类似⻋牌纹理特征的其他因素干扰时,⻋牌定位正确率也会受到影响
过程&结果👇
Matlab代码👇
main.m👇
clc;
clear all;
%主要模块如下:
%颜色信息提取、车牌区域定位、识别、提取、检测倾斜度、车牌校正
%车牌区域2值化、擦除干扰区域、文字分割、模版匹配、结果输出
%
%
%% 自动弹出提示框读入图片
[fn,pn,fi]=uigetfile('*.jpg','选择图片');
I=imread([pn fn]);
figure,imshow(I);title('原始图像'); %显示原始图像
chepailujing=[pn fn];
I_bai=I;
[PY2,PY1,PX2,PX1]=caitu_fenge(I); %图像分割,车牌定位,并得到车牌的上边界PY1、下边界PY2、左边界PX1、右边界 PX2
%% 分割车牌区域
[PY2,PY1,PX2,PX1,threshold]=SEC_xiuzheng(PY2,PY1,PX2,PX1); %车牌区域根据面积二次修正
Plate=I_bai(PY1:PY2,PX1:PX2,:);
bw=Plate;figure,imshow(bw);title('车牌图像');
%根据图像的倾斜度进行选择
bw=rgb2gray(bw);figure,imshow(bw);title('灰度图像');
qingxiejiao=rando_bianhuan(bw); %倾斜校正
bw=imrotate(bw,qingxiejiao,'bilinear','crop');figure,imshow(bw);title('倾斜校正');%取值为负值向右旋转
bw=im2bw(bw,graythresh(bw)); %graythresh功能:使用最大类间方差法找到图片的一个合适的阈值,更好地把一张灰度图像转换为二值图像
bw=bwmorph(bw,'hbreak',inf); %对二值图像inf 无穷大的形态学处理,直到图像不再发生变化, 'hbreak':断开图像中的H型连接
bw=bwmorph(bw,'spur',inf); %'spur':去除小的分支(毛刺)
bw=bwmorph(bw,'open',5); %指定的形态学处理5次 'open':进行形态学开运算(即先膨胀后腐蚀)
bw = bwareaopen(bw, threshold); %删除二值图像bw中面积小于P的对象,默认情况下conn使用8邻域
figure,imshow(bw);title('擦除');
bw=~bw;%倒置二进制矩阵bw
figure,imshow(bw);title('擦除反色');
%上下边框的去除,对图像进一步裁剪,保证边框贴近字体
bw=touying(bw); %投影法
figure;imshow(bw);title('Y方向处理');
bw=~bw;
bw=bwareaopen(bw, threshold);
bw=~bw;
[y,x]=size(bw); %对长宽重新赋值
%% 文字分割
fenge=shuzifenge(bw,qingxiejiao);
[m,k]=size(fenge);
%显示分割图像结果
figure;
for s=1:2:k-1
subplot(1,k/2,(s+1)/2);imshow(bw( 1:y,fenge(s):fenge(s+1)));
end
%给七张图片定位
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));
%% 识别
%把修正数据读入
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');
%把0-9 , A-Z以及省份简称的数据存储方便访问
hanzishengfen=duquhanzi(imread('cpgui.bmp'),imread('cpguizhou.bmp'),imread('cpjing.bmp'),imread('cpsu.bmp'),imread('cpyue.bmp'));%识别汉字
%数字和字母比例不同
shuzizimu=duquszzm(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'),...
imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
zimu = duquzimu(imread('10.bmp'),imread('11.bmp'),imread('12.bmp'),imread('13.bmp'),imread('14.bmp'),...
imread('15.bmp'),imread('16.bmp'),imread('17.bmp'),imread('18.bmp'),imread('19.bmp'),...
imread('20.bmp'),imread('21.bmp'),imread('22.bmp'),imread('23.bmp'),imread('24.bmp'),...
imread('25.bmp'),imread('26.bmp'),imread('27.bmp'),imread('28.bmp'),imread('29.bmp'),...
imread('30.bmp'),imread('31.bmp'),imread('32.bmp'),imread('33.bmp'));
shuzi = duqushuzi(imread('0.bmp'),imread('1.bmp'),imread('2.bmp'),imread('3.bmp'),imread('4.bmp'),...
imread('5.bmp'),imread('6.bmp'),imread('7.bmp'),imread('8.bmp'),imread('9.bmp'));
%% 识别结果
i=1;
jieguohanzi = shibiehanzi(hanzishengfen,xiuzhenghanzi);shibiejieguo(1,i) =jieguohanzi; i=i+1;
jieguozimu = shibiezimu(zimu,xiuzhengzimu); shibiejieguo(1,i) =jieguozimu; i=i+1;
jieguozm_sz_1= shibiezm_sz(shuzizimu,xiuzhengzm_sz_1); shibiejieguo(1,i) =jieguozm_sz_1;i=i+1;
jieguozm_sz_2= shibiezm_sz(shuzizimu,xiuzhengzm_sz_2); shibiejieguo(1,i) =jieguozm_sz_2;i=i+1;
jieguoshuzi_1= shibieshuzi(shuzi,xiuzhengshuzi_1); shibiejieguo(1,i) =jieguoshuzi_1;i=i+1;
jieguoshuzi_2= shibieshuzi(shuzi,xiuzhengshuzi_2); shibiejieguo(1,i) =jieguoshuzi_2;i=i+1;
jieguoshuzi_3= shibieshuzi(shuzi,xiuzhengshuzi_3); shibiejieguo(1,i) =jieguoshuzi_3;i=i+1;
%对话框显示显示
shibiejieguo;
msgbox(shibiejieguo,'识别结果');
caitu_fenge.m👇
function [PY2,PY1,PX2,PX1]=caitu_fenge(I)
[y,x,z]=size(I); %行数/列数/RGB层数
myI=double(I); %将I数据转换成双精度型
Y_threshlow=5; %阈值 决定提取的彩图质量
X_firrectify=5; %干扰因子 适当提高可抗干扰,但是小图会照成剪裁太多
%% Y 方向
Blue_y=zeros(y,1); %创建y列向量,统计蓝色像素点
for i=1:y
for j=1:x
if(