这份代码只是一份课程设计,所以只是简单实现了车牌识别,没有训练库,也没有用比较好的识别算法,最后结果出来识别也不太准确。

样本库文件在下方百度网盘链接里:

百度网盘样品库文件

首先建立一个样本库,存放已经分割好的样本字符。

                                                                                                                      

然后建立一个目标图文件,里面存放要识别的车牌图片。

【源程序】:

main.m

I=imread('E:\MATLAB\function\目标图\car1.jpg');
figure(1),imshow(I);title('原图')
I1=rgb2gray(I);%功能是将真彩色图像转换为灰度图像,即灰度化处理
figure(2),subplot(1,2,1),imshow(I1);title('灰度图');
figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');
I2=edge(I1,'Prewitt',0.15,'both');
%功能是采用I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1,其他地方为0
figure(3),imshow(I2);title(' Prewitt算子边缘检测')
se=[1;1;1];
I3=imerode(I2,se);%腐蚀
figure(4),imshow(I3);title('腐蚀后图像');
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);
figure(5),imshow(I4);title('平滑图像的轮廓');
I5=bwareaopen(I4,2000);%作用是删除二值图像BW中面积小于2000的对象
figure(6),imshow(I5);title('从对象中移除小对象');
[y,x,z]=size(I5);
myI=double(I5);%double类型
tic  %tic用来保存当前时间,而后使用toc来记录程序完成时间Blue_y=zeros(y,1);%zeros功能是返回一个m×n×p×...的double类零矩阵for i=1:yfor j=1:xif(myI(i,j,1)==1) Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计 end  end       end[temp MaxY]=max(Blue_y);%Y方向车牌区域确定PY1=MaxY;while ((Blue_y(PY1,1)>=5)&&(PY1>1))PY1=PY1-1;end    PY2=MaxY;while ((Blue_y(PY2,1)>=5)&&(PY2<y))PY2=PY2+1;endIY=I(PY1:PY2,:,:);%%%%%% X方向 %%%%%%%%%Blue_x=zeros(1,x);%进一步确定x方向的车牌区域for j=1:xfor i=PY1:PY2if(myI(i,j,1)==1)Blue_x(1,j)= Blue_x(1,j)+1;               end  end       endPX1=1;while ((Blue_x(1,PX1)<3)&&(PX1<x))PX1=PX1+1;end    PX2=x;while ((Blue_x(1,PX2)<3)&&(PX2>PX1))PX2=PX2-1;endPX1=PX1-1;%对车牌区域的校正PX2=PX2+1;dw=I(PY1:PY2-8,PX1:PX2,:);t=toc;
figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');
figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')
imwrite(dw,'dw.jpg');
a=imread('dw.jpg');
b=rgb2gray(a);%功能是将真彩色图像转换为灰度图像,即灰度化处理
imwrite(b,'1.车牌灰度图像.jpg');
figure(8);subplot(3,2,1),imshow(b),title('1.车牌灰度图像')
g_max=double(max(max(b)));
g_min=double(min(min(b)));
T=round(g_max-(g_max-g_min)/3); % T 为二值化的阈值   向最近的方向取整
[m,n]=size(b);
d=(double(b)>=T);  % d:二值图像
imwrite(d,'2.车牌二值图像.jpg');
figure(8);subplot(3,2,2),imshow(d),title('2.车牌二值图像')
figure(8),subplot(3,2,3),imshow(d),title('3.均值滤波前')% 均值滤波处理
h=fspecial('average',3);
d=im2bw(round(filter2(h,d)));%filter2(B,X),B为滤波器.X为要滤波的数据,这里将B放在X上,一个一个移动进行模板滤波.
imwrite(d,'4.均值滤波后.jpg');
figure(8),subplot(3,2,4),imshow(d),title('4.均值滤波后')
se=eye(2);%产生m×n的单位矩阵
[m,n]=size(d);
if bwarea(d)/m/n>=0.365 %bwarea是计算二值图像中对象的总面积的函数d=imerode(d,se);%腐蚀
elseif bwarea(d)/m/n<=0.235d=imdilate(d,se);%膨胀
end
imwrite(d,'5.膨胀或腐蚀处理后.jpg');
figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
d=qiege(d);
[m,n]=size(d);
figure,subplot(2,1,1),imshow(d),title(n)
k1=1;k2=1;s=sum(d);j=1;
while j~=nwhile s(j)==0j=j+1;endk1=j;while s(j)~=0 && j<=n-1j=j+1;endk2=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=qiege(d);
% 切割出 7 个字符
y1=10;y2=0.25;flag=0;word1=[];
while flag==0[m,n]=size(d);left=1;wide=0;while sum(d(:,wide+1))~=0wide=wide+1;endif wide<y1   % 认为是左侧干扰d(:,[1:wide])=0;d=qiege(d);elsetemp=qiege(imcrop(d,[1 1 wide 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>y2flag=1;word1=temp;   % WORD 1endd(:,[1:wide])=0;d=qiege(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);
subplot(5,7,1),imshow(word1),title('1');
subplot(5,7,2),imshow(word2),title('2');
subplot(5,7,3),imshow(word3),title('3');
subplot(5,7,4),imshow(word4),title('4');
subplot(5,7,5),imshow(word5),title('5');
subplot(5,7,6),imshow(word6),title('6');
subplot(5,7,7),imshow(word7),title('7');
[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]);subplot(5,7,15),imshow(word1),title('1');
subplot(5,7,16),imshow(word2),title('2');
subplot(5,7,17),imshow(word3),title('3');
subplot(5,7,18),imshow(word4),title('4');
subplot(5,7,19),imshow(word5),title('5');
subplot(5,7,20),imshow(word6),title('6');
subplot(5,7,21),imshow(word7),title('7');
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':'Z' '京宁沪苏陕']);
%建立自动识别字符代码表  1~10 数字  11~36  字母   37~41汉字
SubBw2=zeros(40,20);%生成一个40*20大小的零矩阵
l=1;
for I=1:7ii=int2str(I);%整形数据转字符串类型t=imread([ii,'.jpg']);SegBw2=imresize(t,[40 20],'nearest');%缩放处理if l==1                 %第一位汉字识别kmin=37;kmax=41;elseif l==2             %第二位 A~Z 字母识别kmin=11;kmax=36;else l>=3               %第三位以后是字母或数字识别kmin=1;kmax=36;endfor k2=kmin:kmaxfname=strcat('样本库\',liccode(k2),'.bmp');SamBw2 = imread(fname);for  i=1:40for j=1:20SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);endend% 以上相当于两幅图相减得到第三幅图Dmax=0;for k1=1:40for l1=1:20if  ( SubBw2(k1,l1) > 0 || SubBw2(k1,l1) <0 )Dmax=Dmax+1;endendendError(k2)=Dmax;endError1=Error(kmin:kmax);MinError=min(Error1);findc=find(Error1==MinError);Code(l*2-1)=liccode(findc(1)+kmin-1);Code(l*2)=' ';l=l+1;
end
figure(10),imshow(dw),title (['车牌号码:', Code],'Color','b');

qiege.m

function e=qiege(d)
[m,n]=size(d);
top=1;bottom=m;left=1;right=n;   % init
while sum(d(top,:))==0 && top<=mtop=top+1;
end
while sum(d(bottom,:))==0 && bottom>=1bottom=bottom-1;
end
while sum(d(:,left))==0 && left<=nleft=left+1;
end
while sum(d(:,right))==0 && right>=1right=right-1;
end
dd=right-left;
hh=bottom-top;
e=imcrop(d,[left top dd hh]);%该函数用于返回图像的一个裁剪区域

getword.m

function [word,result]=getword(d)
word=[];flag=0;y1=8;y2=0.5;while flag==0[m,n]=size(d);wide=0;while sum(d(:,wide+1))~=0 && wide<=n-2wide=wide+1;endtemp=qiege(imcrop(d,[1 1 wide m]));[m1,n1]=size(temp);if wide<y1 && n1/m1>y2d(:,[1:wide])=0;if sum(sum(d))~=0d=qiege(d);  % 切割出最小范围else word=[];flag=1;endelseword=qiege(imcrop(d,[1 1 wide m]));d(:,[1:wide])=0;if sum(sum(d))~=0;d=qiege(d);flag=1;else d=[];endendend
%endresult=d;

MATLAB实现一个简单的车牌识别小程序相关推荐

  1. python3+opencv+tkinter开发简单的人脸识别小程序

    学校里有门图像处理的课程最终需要提交一个图像处理系统, 正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧 效果图如下 笔者IDE使用Pycharm,GUI编程直接使用内置的tkinte ...

  2. 利用EasyDL制作一个简单的图片识别小项目

    主要是利用EasyDL制作一个简单的傻瓜式猫狗图片识别,利用EasyDL,只需要几步简单的点击即可 *主要的步骤: 1.准备数据 2.训练模型 3.部署 4.H5 * 1.首先创建两个文件夹cat和d ...

  3. python小程序设计4s店_python自写的车牌识别小程序,完全自主实现。图片处理

    [实例简介] python写的车牌识别的 小程序,没有使用其它的一些库,几乎都是自写的东西,主要是一些自己的算法和自己的,想要车牌识别例子,图片处理例子的可以下载,目前现在可以主的识别正面对的车牌,通 ...

  4. 实战|轻松用 Python 开发一个简单有趣的聊天小程序

    前言 Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol). UDP 为应用程序提供了一种无需建立连接就可以发送封装的 I ...

  5. 整个canvas玩一玩,做一个简单的水印相机小程序

    目录 体验地址 前言 一.知识点介绍 1.小程序camera组件 2.腾讯位置微信sdk 3.微信小程序Canvas相关API(就不多说了) 二.拍照添加水印(核心部分) 体验地址 前言 核心js代码 ...

  6. 一个简单的留言微信小程序

    简易留言微信小程序 该小程序旨在熟悉小程序的页面写法,熟悉小程序的构成,掌握数据库的操作等等. 来了. 前言,一个小程序,如果需要和用户互动,就必定要获取用户授权,所以授权的操作这里省略, 我们只关注 ...

  7. PHP充值怎么打折,教大家如何用PHP语言写一个简单的商品打折小程序!

    注:php是嵌套在html里面使用的,本文仅是商品打折小程序的代码 效果图: 代码:html> 宗波尘客php代码演示P17 请输入商品折扣价: 折扣: 九折 八折 七折 六折 五折 $Orig ...

  8. matlab车牌识别小程序

    GitHub源码 https://github.com/benxiaohai8888/matlab------/tree/master/%E7%A8%8B%E5%BA%8F 程序: main.m %1 ...

  9. java 移动图片_Java写的一个简单的图片移动小程序

    前两天,有一个小姑娘让帮忙给其写一个小玩意,就是在Panel上绘制一个图片,然后通过键盘的方向键进行控制移动.虽然比较简单,这里还是希望和大家分享一下,里面有两点特别需要注意的知识点,这里一并加以说明 ...

  10. matlab设计一个简单图像直方图均衡的GUI程序

    效果,感觉画丑了我女神 命令行输入 guide 创建空白 GUI 程序, 拖动控件,修改按钮 String 按钮1用来选择图片,回调函数下粘贴程序 function pushbutton1_Callb ...

最新文章

  1. 数组最大最小值比较次数优化
  2. Debina解决浏览器中乱码(将系统字体改为中文)
  3. 5 个最受人喜爱的开源 Django 包
  4. 《也要相信》——沙叶新
  5. [24]CSS3 弹性伸缩布局(上)
  6. 2015蓝桥杯省赛---java---C---9(打印大X)
  7. Struts2下创建自定义类型转换器(表单中日期的处理)
  8. 【51Nod - 1182】完美字符串(贪心,字符串)
  9. php表白页面,2020情人节表白页面(代码分享)
  10. linux中的进程有哪三种基本状态,Linux下的进程有哪三种状态?()
  11. Java中try、finally语句中有return时的执行情况
  12. 没有UITableViewController的UIRefreshControl
  13. 转: ORA-12560: TNS:protocol adapter error(TNS:协议适配器错误)
  14. 剥开比原看代码03:比原是如何监听p2p端口的
  15. web项目嵌入Jetty运行的两种方式(Jetty插件和自制Jetty服务器)
  16. 数据可视化大屏真不是个事,这 30 个精美的模板拿走吧
  17. 验证邮箱的正则表达式
  18. 2016首次CCCC总结
  19. Flag:通过盲文+摩斯电码才能找到我
  20. 示波器基础知识100问

热门文章

  1. python按键退出循环_Python的for循环退出
  2. linux shell 高级编程,shell高级编程(带365个实例源码)
  3. Ubuntu16.04安装truffle时的一些错误
  4. 第08章-使用Spring Web Flow
  5. HDU 5145 NPY and girls (莫队分块离线)
  6. iOS 开发比较实用的框架总结(上)
  7. USACO 2.2 集合(DP)
  8. Linux下安装Scala
  9. Python核心编程--学习笔记--3--Python基础
  10. Caliburn.Micro框架学习资料积累