直接上程序:

%车牌识别程序
%根据hsv色彩定位法定位车牌,将图像转为HSV模型,获取每个像素点的HSV值,判断是否为蓝色像素点,统计每行每列蓝色像素点的个数,从而获取车牌位置
%根据该位置对原始彩色图像进行剪裁,并进行二值化,滤波、去点处理,为字符分割做准备
%按顺序切割出7个字符,并保存为7张图片
%分别提取图片和模板进行比较,将比较结果最接近的确定为对应模板,并最终显示车牌识别结果I=imread('E:\车牌识别 - 2\程序、配套的字符模板、车牌照片 - 2\车牌照片\car2.jpg');                      %读入车牌照片
figure(1),imshow(I),title('原图');%%%%根据hsv色彩定位法定位车牌%%%%
Image=im2double(I); %把图像数据类型转换为double类型
Image=rgb2hsv(Image); %将RGB图像转化为hsv模型,H色相,S饱和度,V亮度
[y,x,~]=size(Image);
Blue_y = zeros(y, 1);
p=[0.56 0.71 0.4 1 0.3 1 0];
for i = 1 : y  for j = 1 : x  hij = Image(i, j, 1);  %取出每个像素点的H、S、V值sij = Image(i, j, 2);  vij = Image(i, j, 3);  if (hij>=p(1) && hij<=p(2)) &&( sij >=p(3)&& sij<=p(4))&&(vij>=p(5)&&vij<=p(6)) %若像素点的HSV处于蓝色的HSV范围 Blue_y(i, 1) = Blue_y(i, 1) + 1;%统计每行的蓝色像素点数目   end  end
end
[~, MaxY] = max(Blue_y);%获取蓝色像素点最多的行号
Th = p(7); %Th=0
PY1 = MaxY;
while ((Blue_y(PY1,1)>Th) && (PY1>0))%找到车牌上边界  PY1 = PY1 - 1;
end
PY2 = MaxY;
while ((Blue_y(PY2,1)>Th) && (PY2<y))%找到车牌下边界PY2 = PY2 + 1;
end
PY1 = PY1 - 2; %上下边界校正(扩大)
PY2 = PY2 + 2;
if PY1 < 1  %如果图像内容只有车牌,上述校正可能会使得边界值超出合理范围,此处防止边界值超出图像范围PY1 = 1;
end
if PY2 > y  PY2 = y;
end
It=I(PY1:PY2,:,:);%Y方向获取原图的车牌区域
figure(2),subplot(3,1,1),imshow(It),title('hsv色彩分割法进行车牌行定位结果');
IY = Image(PY1:PY2, :, :); %对HSV模型图像Image在Y方向进行截取
[y1,x1,z1]=size(IY);
Blue_x=zeros(1,x1);
for j = 1 : x1  for i = 1 : y1  hij = IY(i, j, 1); %获取每个像素点的HSV sij = IY(i, j, 2);  vij = IY(i, j, 3);  if (hij>=p(1) && hij<=p(2)) &&( sij >=p(3)&& sij<=p(4))&&(vij>=p(5)&&vij<=p(6))%若为蓝色像素点  Blue_x(1, j) = Blue_x(1, j) + 1;   %记录每一列蓝色像素数目end  end
end  PX1=1;PX2=x1;%找到左右边界
while Blue_x(1, PX1)==0PX1=PX1+1;
end
while Blue_x(1, PX2)==0PX2=PX2-1;
endI1=I(PY1:PY2,PX1:PX2,:);%车牌剪裁
figure(2),subplot(3,1,2),imshow(I1),title('hsv色彩分割法车牌定位结果');
I2=rgb2gray(I1);                        %%%%字符分割前的图像处理%%%%
%边界校正
[y,x,z]=size(I2);%I2有y行x列
PX1=round(x*5/440);%根据实际车牌比例,将边框部分去除
PX2=x-round(x*5/440);
PY1=round(y*16/140);
PY2=y-round(y*16/140);
fprintf('校正后  左边界=%d、右边界=%d、上边界=%d、下边界=%d',PX1,PX2,PY1,PY2);
%彩色图像车牌部分截取
dw=I1(PY1:PY2,PX1:PX2,:);%对边界进行截取
figure(2),subplot(3,1,3),imshow(dw),title('边界校正结果');
imwrite(dw,'dw.jpg');%把截取后的彩色图像新创建一张图片,命名为dw
a=imread('dw.jpg');
b=rgb2gray(a);
imwrite(b,'1.车牌灰度图像.jpg');
g_max=double(max(max(b)));%得出剪裁后灰度图矩阵的最大值,并变成双精度浮点型
g_min=double(min(min(b)));%得出剪裁后灰度图矩阵的最小值,并变成双精度浮点型
T=round(g_max-(g_max-g_min)/2); % T为二值化的阈值,round用于取整
d=(double(b)>=T);  % d:二值图像
imwrite(d,'2.车牌二值图像.jpg');
figure(3),subplot(3,1,1),imshow(d),title('二值图像');% 滤波
h=fspecial('average',3);%创建一个二维滤波器,average是类型,3是参数
d=im2bw(round(filter2(h,d)));%filter2进行滤波处理,im2bw使用阈值变换法把灰度图像转换成二值图像
imwrite(d,'4.均值滤波后.jpg');%去点处理
d=cut(d);
[m,n]=size(d);
d(:,round(n*122/430):round(n*137/430))=0;%去除中间的点
d=bwareaopen(d,65);%用于删除二值图像中面积小于一个定值(此处为65)的对象,默认情况下使用8邻域
figure(3),subplot(3,1,2),imshow(d),title('去点处理');%上下边框处理,找到上下边界处像素值小于20的行,并将整行设为零
s=zeros(1,m);
i=1;
while i<=ms(i)=sum(d(i,:));i=i+1;
end
j=0;c=zeros(1,m);%c矩阵用于记录下边框处像素值小于20的行,用于确定边框与字符间空隙的位置
while j<mwhile s(j+1)>20&&j<m-1j=j+1;endif j<round(m*12/140) %如果是上边框d((1:j),:)=0;else j>round(m*115/140)%如果是下边框c(j)=j;%将下边界处理中像素值小于20的行记录下来d(j,:)=0;endj=j+1;
end
jj=round(m/2);%这里是为了找到下边界处理中,被记录下来的最小行(即边框和字符间空隙的上沿),所以从中间开始往下找,直到找到的第一个非零数
while c(jj)==0jj=jj+1;
end
d((jj:m),:)=0;%将这一行以下皆设为0
d=cut(d);
figure(3),subplot(3,1,3),imshow(d),title('上下边框处理');
imwrite(d,'5.切割前.jpg');%%%%字符分割%%%%
[~,n]=size(d);
% 切割出 7 个字符
% 第一个字符,
y1=n*15/440;y2=0.25;flag=0;word1=[];
while flag==0[m,~]=size(d);left=1;wide=0;while sum(d(:,wide+1))~=0 % 找到像素和为零的列wide=wide+1;endif wide<y1   % 若这一列的位置在图像左侧前10列之内则认为是左侧干扰d(:,(1:wide))=0;%把左侧干扰全部变为0,并将其切割掉d=cut(d);elsetemp=cut(imcrop(d,[1 1 wide m]));%将一个字符剪切下来[m,~]=size(temp);all=sum(sum(temp));%第一个字符的像素值总和two_thirds=sum(sum(temp((round(m/3):2*round(m/3)),:)));%单个字符中段1/3图像的像素值总和if two_thirds/all>y2%验证是否为字符flag=1;word1=temp;   %获取第一个字符word1endd(:,(1:wide))=0;d=cut(d);%当提取第一个字符结束或者不满足上述条件时,将该区域变为0,并切除end
end% 分割出第二个字符
[word2,d]=extract(d);
% 分割出第三个字符
[word3,d]=extract(d);
% 分割出第四个字符
[word4,d]=extract(d);
% 分割出第五个字符
[word5,d]=extract(d);
% 分割出第六个字符
[word6,d]=extract(d);
% 分割出第七个字符
[word7,d]=extract(d);
[m,n]=size(word1);%归一化大小为 40*20
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]);
%将切割下来短的字符保存为图片
imwrite(word1,'1.jpg');
imwrite(word2,'2.jpg');
imwrite(word3,'3.jpg');
imwrite(word4,'4.jpg');
imwrite(word5,'5.jpg');
imwrite(word6,'6.jpg');
imwrite(word7,'7.jpg');%%%%字符识别%%%%
%建立自动识别字符代码表
liccode=char(['0':'9' 'A':'H' 'J':'N' 'P':'Z' '藏川鄂甘赣桂贵黑沪吉冀津晋京辽鲁蒙闽宁青琼陕苏皖湘新渝豫粤云浙']);  %建立自动识别字符代码表
SubBw2=zeros(40,20);
l=1;
for I=1:7ii=int2str(I);%将整形变成字符串t=imread([ii,'.jpg']);SegBw2=imresize(t,[40 20],'nearest');%进行二值化,方便比较g_max=double(max(max(SegBw2)));g_min=double(min(min(SegBw2)));T=round(g_max-(g_max-g_min)/2); % T为二值化的阈值SegBw2=(double(SegBw2)>=T);  % SegBw2切割下来的字符的二值图像if l==1                 %第一位汉字识别kmin=35;kmax=65;elseif l==2             %第二位 A~Z 字母识别kmin=11;kmax=34;else l>=3;               %第三位以后是字母或数字识别kmin=1;kmax=34;end%在每一位对应区间按顺序提取字符模板for k2=kmin:kmaxfname=strcat('字符模板',liccode(k2),'.jpg');SamBw2 = imread(fname);if(k2~=2)SamBw2=rgb2gray(SamBw2);endg_max=double(max(max(SamBw2)));%二值化处理字符模板g_min=double(min(min(SamBw2)));T=round(g_max-(g_max-g_min)/2); % T为二值化的阈值SamBw2=(double(SamBw2)>=T);  % SamBw2为字符模板的二值图像%字符图像与模板进行比较a1(k2)=corr2(SegBw2,SamBw2);endA1=a1(kmin:kmax);%将比较结果放入矩阵A1MaxA1=max(A1);%找到比较结果最大值findc=find(A1==MaxA1);%获取最大值所在位置Code(l*2-1)=liccode(findc(1)+kmin-1);Code(l*2)=' ';l=l+1;%进行下一字符的提取和比较
end
figure(4),subplot(2,7,1:7),imshow(dw),title('车牌定位结果'),
xlabel({'','车牌切割结果'});
subplot(2,7,8),imshow(word1);
subplot(2,7,9),imshow(word2);
subplot(2,7,10),imshow(word3);
subplot(2,7,11),imshow(word4);
xlabel(['识别结果为: ', Code]);
subplot(2,7,12),imshow(word5);
subplot(2,7,13),imshow(word6);
subplot(2,7,14),imshow(word7);

运行结果如下

(车牌随便找的,为了保护他人权益,用了较粗暴的涂鸦方式)

工程文档下载请到: https://download.csdn.net/download/lc886/12576374

车牌识别(MATLAB)相关推荐

  1. matlab中caitu_tiqu,车牌识别matlab语音版+OpenCV版+测试图像和设计文档

    [实例简介] 该文件包含了车牌识别的两个版本:matlab语音版+OpenCV版,有丰富的测试实例和文档信息,测试结果能满足大部分的车牌识别. [实例截图] [核心代码] 5d61aaaa-2457- ...

  2. Java matlab车牌识别,车牌识别matlab实现(蓝色车牌和新能源车牌)

    首先放上结果: 新能源车牌识别结果: 蓝色车牌识别结果: 正文开始: 1.在进行图像处理任务之前,首先要明确处理对象和处理流程 处理对象: 新能源车牌和蓝色车牌 处理流程: 2.由于要对蓝色和新能源车 ...

  3. 车牌识别matlab,车牌识别matlab实现(蓝色车牌和新能源车牌)

    首先放上结果: 新能源车牌识别结果: 蓝色车牌识别结果: 正文开始: 1.在进行图像处理任务之前,首先要明确处理对象和处理流程 处理对象: 新能源车牌和蓝色车牌 处理流程: 2.由于要对蓝色和新能源车 ...

  4. 车牌识别matlab gui,车牌识别(含GUI,语音播报)

    车牌识别(含GUI,语音播报) 所属分类:matlab例程 开发工具:matlab 文件大小:6297KB 下载次数:11 上传日期:2020-08-08 16:01:31 上 传 者:可乐一生 说明 ...

  5. bp神经网络车牌识别matlab源代码,BP神经网络车牌识别

    [实例简介]利用GUI搭建车牌识别 [实例截图] [核心代码] bp神经网络车牌识别 ├── bp.m ├── bpnet.mat ├── getword.m ├── lpr.m ├── lpr_GU ...

  6. Java matlab车牌识别,MATLAB车牌识别 源码下载

    [实例简介] [实例截图] [核心代码] I=imread('car1.jpg'); figure(1),imshow(I);title('原图') I1=rgb2gray(I);%转换为灰度图 fi ...

  7. matlab中caitu_tiqu,Matlab平台基于颜色的车牌识别程序

    Matlab平台基于颜色的车牌识别程序 matlab 2020-11-18 下载地址 https://www.codedown123.com/51252.html Matlab平台基于颜色的车牌识别程 ...

  8. matlab 车牌识别模板,MATLAB的车牌识别

    MATLAB的车牌识别 matlab 2020-12-13 下载地址 https://www.codedown123.com/55034.html 基于MATLAB的车牌识别,主要包括车牌定位.字符分 ...

  9. matlab hsv颜色分割,车牌定位matlab程序:通过hsv彩色分割方式定位车牌

    最近看了<基于数字图像处理的车牌识别研究>这篇论文,对车牌识别知识讲的很仔细,推荐. 1.(摘自<基于数字图像处理的车牌识别研究>) 通过对大量车牌图像的分析,可以发现对于具有 ...

  10. matlab车牌识别课程设计,matlab车牌识别课程设计报告模板(附源代码).doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspmatlab matlab车牌识别课程设计报告模板(附源代码). ...

最新文章

  1. 用于制图、写电子邮件、创建条形码控件Aspose.Total
  2. JCR:曝气生物滤池处理焦化废水过程中N2O和NO的产生机理与群落功能研究
  3. python图片-python实现读取并显示图片的两种方法
  4. BZOJ1086:[SCOI2005]王室联邦——题解
  5. c语言一串大写字母转小写,C语言的基础函数大小写转换
  6. maven系列一:pom.xml文件详解
  7. matlab读取高光谱影像
  8. Keras 训练时出现 CUDA_ERROR_OUT_OF_MEMORY 错误
  9. 关键字:auto、static、register、const、volatile 、extern 总结
  10. nvidia-rapids︱cuGraph(NetworkX-like)关系图模型
  11. java+io+scanner_Java知识点总结(JavaIO- Scanner类 )
  12. Docker新手入门,最全详解看这里!
  13. c语言符合语法规定的常量,以下各项中,符合C语言语法规定的实型常量是() 答案:.5E-3...
  14. 2022年6月25日PMP考试通关宝典-3
  15. 记录一次被Paypal坑的经过
  16. DEEPCON: protein contact prediction using dilated convolutional neural networks with dropout
  17. python推箱子游戏顶层设计子层设计_python实现推箱子游戏
  18. 如何实现跳转至QQ 或者QQ的加好友页面。
  19. Password verification failed
  20. Linux常用备份恢复工具(1)

热门文章

  1. Java从小兵到指挥官领兵作战—线程高并发扫盲篇
  2. 2014总结2015展望
  3. flutter Web QQ登录
  4. 如何优雅获取B站壁纸?
  5. 表白来信流量主小程序开发
  6. 天正lisp修改了配置_学习配置Common Lisp开发环境(日志记录)
  7. matlab如何提取亚像素边缘点,棋盘格图像角点坐标亚像素提取方法
  8. OSI参考模型层次结构
  9. 华为smart mt880 adsl modem 路由共享上网配置
  10. 关于Ubuntu同时安装opencv2和opencv3