数字图像处理——基于matlab的车牌号识别

article/2025/9/21 11:27:21

希望大家有问题多多评论留言鸭
码字不易,老阿姨头发都没啦,小可爱们记得给三连鸭,么么哒。
(只收藏,不点赞,好运连连会中断!!!)

<--!(源码资源****有常(注意目前是有常哦)私我vx:xdsqczkyqs713**,**无GUI30圆
(包含源码+测试图片+字符模板),
带GUI40圆**,**再带一份30页的完整课设报告50圆,
加我备注来意**(GUI是用户界面的意思,
报告仅供参考,可以就着写,节省时间,但宝儿你可千万别傻乎乎的直接拿去上交鸭!),加vx之前
注意下后边的说明内容哦**,**说明一下,这是个比较简单的图像处理练手级项目,没有考虑角度
和光线问题,对于下边动图中出现过车牌图片都能识别,但并不能通用!!!给的联系方式有常求源码
的可爱们加,vx只提供交易渠道,交易前不提供咨询(因为这里我已经写得很清楚了),对项目有问题,
可以在评论区询问,想自己根据博客的代码做,出现问题的小可爱也直接博客留言就好啦!**非诚勿扰/<->
认真脸**)-->

(有小可爱看了文章,想要字符模板,这里给出模板链接,下载后把字符模块文件夹放在程序的文件目录下就好,我设置了下载不需要积分的哦。**希望大家不吝点赞鸭,之前许诺的点赞数过50免费分享字符模板,老阿姨我已经提前兑现啦)
字符模板,记得回来点赞鸭
(后续加了GUI,参见下边)
GUI入门:给车牌识别系统加个GUI

结合可变部件模型目标检测,模拟监控视频车辆行人检测识别,满足毕设需求见这篇

先上个动图给个效果:
(这篇文章效果还好,今天做一次更新,是结合小伙伴们的源码使用反馈我做出的一些提升,补全了字符模板,之前有些行省简称不全,泛化能力提升,不需要修改参数可以识别的图片更多了,可以手机拍照,注意视角和光线因素一般都可以识别出来,更新的详细内容和方法附在文章结尾了,下边这些图片是小伙伴们自己拍摄的图片识别效果图附在动图后边了哈都是同一参数下的效果,提升后识别准确性和图片适用性增强了不少鸭!)

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

车牌识别技术的推广普及对加强道路管理、城市交通事故、违章停车、处理车辆被盗案件、保障社会稳定等方面有非常重大的影响。本文以生活中最常见的蓝底白字的小型汽车的车牌照为例,介绍一种通过车牌区域颜色特征来标定图片中的车牌位置,继而分割出车牌区域图像,二值化,形态学处理,分割单个字符,规整字符图像大小,与已有字符模板比对,按照逻辑值相差最小原则匹配字符,作为车牌号码识别结果输出。

一、图像预处理
预处理的具体操作是规整大小、噪声滤波,规整为统一大小便于后续处理的参数设置,提高定位精确度及识别正确率。
规整大小函数:imresize(I,[row,col])

接着进行图像平滑滤波。RGB图像的平滑滤波,需要将R,G,B三个色道分别提取出,分别滤波。这里采用3*3的中值滤波算子,对三个色道分别滤波,然后使用cat函数将三色道整合起来。

R=K(:,:,1);G=K(:,:,2);B=K(:,:,3);%提取色道
R=medfilt2(R,[3,3]);
G=medfilt2(G,[3,3]);
B=medfilt2(B,[3,3]);%3*3模板中值滤波
K=cat(3,R,G,B); %将三个色道整合

二、车牌定位
车牌定位依据的是车牌蓝色底色的特点,即颜色区分法,因此,确定车牌底色的蓝色RGB值范围非常重要。先打开一幅车牌图片,查看下车牌底色的RGB值。
在这里插入图片描述
车牌底色为蓝色,因此B值较高,R和G值较小,初步考虑车牌底色RGB范围应是:R<=RT, G<=GT, B>=BT (RT,GT,BT分别为RGB三色道的颜色阈值)
从网络上查询相应资料,并实际取点查看RGB色值,最终确定的判断门限为:((K(i,j,1)<=76)&&(K(i,j,2)<=146)&&(K(i,j,3)>=115))
有了这个判断门限条件,对图像进行遍历,符合蓝色条件的赋值为1(白色)。

%车牌号定位%rgb蓝底颜色区分法%
Blue=zeros(m,n);
for i=1:m    for j=1:n        if(((K(i,j,1)<=76)&&(K(i,j,2)<=146)&&(K(i,j,3)>=115)))           %%%蓝色度RGB的灰度范知围道          Blue(i,j)=1;        end    endend%得到车牌蓝色区域初始判断的二值图像

考虑到颜色阈值设置不精准、有噪声斑点等情况,对初判图像进行闭运算,填平区域中的小孔,平滑区域边界,再去除可能产生干扰的散点。
p1= bwmorph(Blue,‘close’); %闭运算平滑区域边界
p1=bwareaopen(p1,20); % 去除零散蓝点防止干扰

然后对二值图像分别行列遍历,以白色区域的所在行或列它的逻辑值比较大为条件,设置阈值,确定车牌的上下边界、左右边界。
根据定下来的边界,计算车牌区域尺寸,考虑到误差的情况,稍微放大计算的区域,避免车牌区域缺失、信息遗漏。然后从原图中标定出车牌,并截取下来。
在这里插入图片描述
在这里插入图片描述
三、车牌区域处理
区域边框、铆钉、车牌字符的间隔点,都是后续字符分割的干扰因素,使用二值图像的形态学处理去除这些干扰因素。
bw=im2bw(pic2);%转为二值图像
bw1=imclearborder(bw);%清理、平滑边界
bw2=bwareaopen(bw1,20);%删除小于20的连通域除去散点(锈迹、污渍等)
bw2=bwareaopen(bw2,80);%删除小于80的连通域去掉间隔点
在这里插入图片描述
再次依据车牌区域的行列逻辑值较高,精准定位车牌字符区域,以30个像素点作为判断阈值,去除边缘位置的铆钉。

bw3=bw2;
[H,L]=size(bw3);WL=0;
while sum(bw3(:,WL+1))<2 && WL<L-2WL=WL+1;
end
WR=L-1;
while sum(bw3(:,WR-1))<2 && WR>2WR=WR-1;
endtop=3;
bot=H-3;
while sum(bw3(top,WL:WR))<=30top=top+1;
end
while sum(bw3(bot,WL:WR))<=30bot=bot-1;
endWL=WL-2;
WR=WR+2;
bw3=imcrop(bw3,[WL top WR-WL bot-top]);
figure()
imshow(bw3)
title('字符区域精取');

在这里插入图片描述
四、字符分割
字符区域确定下来后,只要对列进行遍历,提高边界判断的要求,逻辑值为0,判断为黑色区域,逻辑值为1,判断为包含字符的区域,或者自己设置一个较小的阈值也ok。将字符分割,从原二值图像中截取下来。

%车牌字符分割
[H,L]=size(bw3);
w1=0;
while sum(bw3(:,w1+1))==0 && w1<L-2w1=w1+1;
end
w2=w1;
while sum(bw3(:,w2+1))~=0 && w2<L-2w2=w2+1;
ende1=imcrop(bw3,[w1 1 w2-w1 H]);
figure()
imshow(e1)
title('第一个字符分割')

在这里插入图片描述

后一个字符的左边界,从前一个字符的右边界开始遍历,碰到某列逻辑值非0,视为抵达字符左边界。接着遍历,碰到某列的逻辑值归0后,视为有边界。依次分割出7个字符。
在这里插入图片描述

五、 字符识别
字符识别需要有相应的模板库
保存下分割后的字符图像,开始进行字符识别。第一个字符为行省简称,其余六个字符为数字与字母的组合,据此分别构建行省简称字符模板与数字、字母字符模板,供识别匹配备用。字符模板制作统一为40*20的二值图像,利用模字制作软件,制模后保存在同一个文件夹中以备用
在这里插入图片描述

对分割出的七个字符图像进行遍历,规整车牌字符与字符模板相同大小,将车牌字符与每个模板字符相减,把所有相减的结果记录在误差数组error中,取相差最小的那个模板字符为识别结果输出。
为了提高匹配速度,依据车牌字符的特点,将字符分为两组,汉字组character和数字字母组numberAlphabet组。将匹配结果放下字符数组result中,作为结果输出。
整个算法的流程如下图:
在这里插入图片描述


charWith=40;
charHigh=20;%模字大小设置
chars={e1,e2,e3,e4,e5,e6,e7};
character=['鄂','粤','京','鲁','辽','浙','陕','津','豫'];
numberAlphabet=['0','1','2','3','4','5','6','7','8','9',...'A','B','C','D','E','F','G','H','K','M','N','L','S','W','J','N','U','Q'];
result=[];
index=ones(1,7);
Num1=length(character);
Num2=length(numberAlphabet);
error=zeros(1,Num1);
Error=zeros(1,Num2);
for i=1:7e=(chars(i));e=cell2mat(e);%转换为二值型e=imresize(e,[charWith,charHigh]);%规整大小if i==1for j=1:Num1fname=strcat('字符模板\',character(j),'.jpg');%获取模板文件名model=imread(fname);%读取模板图片model=im2bw(model);%转为二值图像error(j)=sum(sum(abs(e-model)));%计算当前图片与模板图差值endbest=min(error);%差值最小的作为匹配结果保存index(i)=find(error==best);%获取匹配模板索引result=character(index(i));%输出匹配结果字符elsefor j=1:Num2fname=strcat('字符模板\',numberAlphabet(j),'.jpg');model=imread(fname);model=im2bw(model);Error(j)=sum(sum(abs(e-model)));endbest=min(Error);index(i)=find(Error==best);result=[result,numberAlphabet(index(i))];end
end
result

识别结果:
在这里插入图片描述
结果还行哈,对图片的清晰度有要求,程序比较粗糙,不能保证很高的识别成功率。
这里已经给了程序中包括识别在内的关键代码,GUI实在太大了就不放了哈。
有帮助记得双击么么哒!

下边是我思考的一些优化方法:
可以考虑使用HSV颜色空间系统,优化代码,添加图片亮度检测环节,判定图片情景的光照条件,依据光照强度的不同,匹配不同的颜色判断系统,进而优化定位判断;引入边缘检测环节,锁定检测的蓝色区域边界大致为长方形的判断为车牌区域以区分图像中的其他蓝色区域;形态学处理的时候进一步添加标准车牌的字符区与边框大小,边框比例,间隔大小,等参数,优化字符串区域提取环节;字符识别匹配环节中,可增加多套字符模板,添加不同角度的字符样板,多次匹配,提高识别正确率等。

更新做的两点提升:

1、字符模板补充,感谢一位小伙伴的赠予,现在的行省简称包含如下:
在这里插入图片描述

2、字符分割归一化处理
不同图片因为视角大小不一,对于之前代码中的处理参数,泛化能力差,对于间隔点去除设置了比例参数,bw2是精准定位后的字符区域,两个参数coef1、2是基于比例的参数,所以可以克服图片视角大小的影响

%车牌字符分割
plate_size=sum(sum(bw2));
coef1=0.0012;%实际检测参数1,污渍点占区域比例系数
coef2=0.00465;%实际检测参数2,间隔点占区域比例系数
bw2=bwareaopen(bw2,ceil(coef1*plate_size));%除去散点(锈迹、污渍等)
bw2=bwareaopen(bw2,ceil(coef2*plate_size));%去掉间隔点
figure()
imshow(bw2);
title('去间隔点二值图像');`)

码字不易,老阿姨头发都没啦,小可爱们记得给三连鸭,么么哒。


http://chatgpt.dhexx.cn/article/L3IgbDj5.shtml

相关文章

【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)

前面4篇博客介绍了OpenCV图像处理的基础知识&#xff0c;本篇博客利用前4篇的知识完成一个小项目——车牌号码识别。该篇博客的代码可以满足小区门禁车牌号的识别。本篇博客是前4篇博客知识的一个综合运用。感觉学会了这个可以实现一系列的图像识别任务。。。毕竟好多技巧都是共…

网络安全检测技术

一&#xff0c;网络安全漏洞 安全威胁是指所有能够对计算机网络信息系统的网络服务和网络信息的机密性&#xff0c;可用性和完整性产生阻碍&#xff0c;破坏或中断的各种因素。安全威胁可分为人为安全威胁和非人为安全威胁两大类。 1&#xff0c;网络安全漏洞威胁 漏洞分析的…

深度学习网络安全

Introduction 我们在社区中看到的大多数深度学习应用程序通常面向营销&#xff0c;销售&#xff0c;财务等领域。我们几乎从未阅读过文章或找到有关深度学习的资源用于保护这些产品和业务&#xff0c; 恶意软件和黑客攻击。 虽然像谷歌&#xff0c;Facebook&#xff0c;微软和…

网络安全法学习整理笔记

网络安全法 一、背景 概念 网络&#xff1a;是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息进行收集、存储、传输、交换、处理的系统。网络安全&#xff1a;是指通过采取必要措施&#xff0c;防范对网络的攻击、侵入、干扰、破坏和非法使用以及意…

网络安全免费学习网址(英文)

转载 作者&#xff1a;W-Pwn 链接&#xff1a;https://www.zhihu.com/question/49222590/answer/339206050 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 知识就是力量 但是知识太贵了&#xff0c;现在随便拎…

【论文阅读】基于强化学习的网络安全防护策略

【论文阅读】基于强化学习的网络安全防护策略 本篇文章将介绍一篇针对网络安全问题&#xff0c;运用强化学习方法寻找最优的网络防御策略。 Finding Effective Security Strategies through Reinforcement Learning and Self-Play 前言 通过强化学习和 自对弈(self-play) 寻…

还在为不知道怎么学习网络安全而烦恼吗?这篇文带你从入门级开始学习网络安全—认识网络安全

随着网络安全被列为国家安全战略的一部分&#xff0c;这个曾经细分的领域发展提速了不少&#xff0c;除了一些传统安全厂商以外&#xff0c;一些互联网大厂也都纷纷加码了在这一块的投入&#xff0c;随之而来的吸引了越来越多的新鲜血液不断涌入。 不同于Java、C/C等后端开发岗…

[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例

最近开始学习网络安全相关知识&#xff0c;接触了好多新术语&#xff0c;感觉自己要学习的东西太多&#xff0c;真是学无止境&#xff0c;也发现了好几个默默无闻写着博客、做着开源的大神。准备好好学习下新知识&#xff0c;并分享些博客与博友们一起进步&#xff0c;加油。非…

码农翻身,卧虎藏龙

写公众号是很不容易的&#xff0c;在现在信息爆炸的情况下&#xff0c;好文章也很容易被标题党埋没&#xff0c;在我的知识星球“码农翻身”中&#xff0c;我发起了一个活动&#xff1a;免费给写公众号的球友们做个推广。 这个不是互推&#xff0c;就是我单方面的推广&#xf…

现在转行码农的成本已经非常高了,别盲目转行..

转行码农一直是个比较火热的话题&#xff0c;也有很多读者咨询过这个问题&#xff0c;转成功的也不少&#xff0c;比如下面这位香港的同学&#xff1a; 这位朋友半年前就跟我聊过&#xff0c;他不太想干没有技术含量的体力活&#xff0c;一直在坚持自学&#xff0c;这也算如愿…

农村出身的 90 后程序员,如何逆袭为中产阶级?| 程序员有话说

作者 | 阿文 责编 | 伍杏玲 出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 小蔡&#xff0c; 90 年 10 月出生&#xff0c;Java开发工程师&#xff0c;目前就职于杭州滨江某知名互联网公司从事云计算开发工作&#xff0c;2013 年毕业就从山东来到了杭州。 …

【一哥闲聊】程序员如何打破35岁魔咒

公众号推文规则变了&#xff0c;点击上方 "数据社"关注, 设为星标 后台回复【加群】&#xff0c;申请加入数据学习交流群 大家好&#xff0c;我是一哥。今天跟大家聊聊程序员35岁以后的方向怎么选&#xff1f; 作为程序员&#xff0c;行业内一直流传着35岁的魔咒&…

码农翻身(随笔)

书一直都有在读&#xff0c;我会一直更新博文&#xff0c;欢迎大家前来阅读、指教&#xff01; XML和注解 xml&#xff1a;应用于集中配置的场合&#xff0c;比如数据源的配置&#xff1b; 注解&#xff1a;像Controller、RequestMapping、Transactional这样的注解&#xff…

读《码农翻身》有感

前几日偶得一本《码农翻身》&#xff0c;闲来品读&#xff0c;收获颇丰。 作者刘欣老师可能是码农中故事讲得最好的人&#xff0c;能把线程&#xff0c;进程&#xff0c;死锁这种概念讲成计算机内部王国漫游记&#xff0c;能把分布式事务这种高级概念讲成java王国中的权贵大臣勾…

告别码农,成为真正的程序员

本文是我借助 Google 从网上拼凑的文章&#xff0c;可能条理不是很清晰&#xff0c;希望对广大程序员们有些帮助。 一、成长的寓言&#xff1a;做一棵永远成长的苹果树 一棵苹果树&#xff0c;终于结果了。 第一年&#xff0c;它结了10个苹果&#xff0c;9个被拿走&#xff0c;…

达到年薪百万,就算码农翻身了吗?

上周末有个小伙伴问我&#xff1a;码农怎么样才能真正地翻身&#xff1f; 我自己都没有翻身&#xff0c;更没有达到财务自由&#xff0c; 回答这样的问题显然是力不从心的。 &#xff08;郑渊洁对财务自由的定义&#xff1a;从现在开始不工作&#xff0c;能保持现在的生活水平不…

《码农翻身》之技术之路

《码农翻身》读书笔记之技术之路 这是我的后端读书笔记系列文章的第四三篇&#xff0c;选取的是最近刚刚圈粉的知名博主刘欣创作的《码农翻身》。这篇文章只是最后一部分内容。 本文内容主要根据知名博主刘欣一作《码农翻身》的内容总结而来&#xff0c;本书的内容风趣幽默&a…

给大忙人看的码农翻身记

码农翻身记个人读后感 文章目录 码农翻身记个人读后感本书介绍大纲启发分享个人的能力欠缺的地方书中比较棒的建议 本书介绍 《码农翻身》用故事的方式讲解了软件编程的若干重要领域&#xff0c;侧重于基础性、原理性的知识。 非常适合刚入门大学生或者 计算机领域入行 一两年左…

码农翻身之编程语言的巅峰

“哇塞&#xff0c;怎么可能这么简单&#xff01;” 当C语言老头儿还是小伙子的时候&#xff0c;第一次见到了汇编&#xff0c;发出了这么一声感慨。 在C语言看来&#xff0c;这汇编的指令实在是太简单了&#xff0c;简单到了令人发指的地步&#xff0c;只有这么几类指令&…

《码农翻身》

大话编程 我是一个线程 我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生 JSP:一个装配工的没落 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大明内阁 TCP/IP 之 蓟辽督师 CPU 阿甘 CPU 阿甘之烦恼 CPU 阿甘&#xff1a;函数调用的秘密 我是一个网卡 …