21夜间车牌识别(matlab程序)

该文详细介绍了车牌识别的过程,包括图像预处理、车牌分割、字符分割和字符识别四个步骤。通过灰度化、边缘检测、二值化等技术定位车牌,然后使用OTSU算法进行字符分割,并采用模板匹配进行字符识别,成功识别出“京JX9168”车牌号。
摘要由CSDN通过智能技术生成

1.简述

      

简单说一下实现思路:

读取图片,转灰度,计算灰度直方图,估算阈值(这里的阈值计算很重要,经过阈值算法,选取一个最恰当的阈值),之后二值化。显示图像即可。

  1. 实现目标

输入一张车牌图片,实现车牌定位,字符切割和字符识别三步骤。同时可以根据需要,做成库外识别,语音播报,出入库等功能。

  1. 设计步骤:

所设计的车牌识别的流程包括图像预处理,车牌分割,字符分割,及字符识别。详见matalb程序。

 

  1. 程序讲解

1)第一部分为图像的预处理。

此部分借鉴了别人的程序,将灰度图像以sobel算子检测边缘;再对边缘图像进行腐蚀,去除掉细的,间断的边缘;对剩下的区域进行闭合以填充图像,此时可以看到车牌区域形成了一个大的连通域;调用bwareaopen函数去掉小的连通域,此时整个二值图像只b剩下了车牌区域为1。如下图所示:

 

fb7cdc56f13d663cf102ed5e42fbd3ae.png

 

 

  1. 第二部分为车牌的提取

此部分的工作为将上一步的白色区域取出,其对应的就是车牌区域。设计思路如下:首先将二值图像f中所有为1的点的坐标放入数组location_of_1中,对这些坐标遍历计算,寻找x坐标与y坐标之和最大的点a与最小的点b,a即为车牌的左上角,b为车牌的右下角。通过这两个坐标将车牌分割出来,并对灰度车牌图像以OTSU算法进行自适应二值化分割。最终效果如下:

 

80db0d5bbe9d5473929c1bdaf63c2706.png

 

 

 

  1. 第三部分为字符分割

此部分的工作是将车牌里的7个字符分别提取出来。方法如下:对该二值图从左向右像按列z遍历,计算每一列之和,没有白点的列和为0,有白点的列和非零,转换为逻辑1,记录下所有列和在0与1转换的列,即为需要切割的列,共有14列,可切出7个字符。切割出单个字符后,放入char_(i)中,并切割掉每个字符的上下的空白区域,完成精确切割,效果如下:

 

 

7c54ff222e9ca98e47ccfc9da0432f6b.png

 

 

 

  1. 第四部分为字符的识别

识别的方法主要有模板匹配字符识别算法,统计特征匹配算法,神经网络字符识别算法和支持向量机模式识别算法。由于分割的字符效果较好,为明显畸变,模k板维数低(32*16),且因为时间关系,这里采用了模板匹配识别算法。该程序把切割出的字符与库里的汉字和字符的模板做减法运算,找到差别点最少的模板为对应模板,输出该模板对应的字符,最后识别出其为“京JX9168”。如下:

5c7c8cb3f8a852e3dd666e00b7b9bf40.png

2.代码

 

clear all
clc
PS=imread('1.jpg'); 
subplot(1,2,1);
imshow(PS)                                             
title('原图')
p=rgb2gray(PS);
subplot(1,2,2)
imshow(p)
title('原灰度图')

[m,n]=size(p);  
GP=zeros(1,256);       
for k=0:255
GP(k+1)=length(find(p==k))/(m*n);  
end
figure
subplot(1,2,1);
bar(0:255,GP,'g')                          
title('原灰度直方图')

max_index=[];
for i=3:length(GP)-2
if((GP(i)>=GP(i+1))&(GP(i)>=GP(i-1)))&((GP(i+1)>=GP(i+2))&(GP(i-1)>=GP(i-2)))
max_index(end+1)=i-1;
end
end
possible=GP(max_index);
[max_value,index]=max(possible);
TT=max_index(index)-2;

[m,n]=size(p);
R=zeros(m,n);
for i=1:m
    for j=1:n
        if p(i,j)<TT
           R(i,j)=0;
        else R(i,j)=256;
        end
    end
end
subplot(1,2,2);
imshow(R);
title('二值图');

 

3.运行结果

01aca1ae40c3414991dc3990ffff8a28.png

 159321c969514251b6839c59005b8fe5.png

 

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。字符识别的算法很多,因为车牌字符间间隔较大,不会出现字符粘连情况,所以此处采用的方法为寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割。一般分割出来的字符要进行进一步的处理,以满足下一步字符识别的需要。但是对于车牌的识别,并不需要太多的处理就已经可以达到正确识别的目的。在此只进行了归一化处理,然后进行后期处理。 在MATLAB中,可以使用图像处理工具箱中的函数来实现车牌识别。首先,需要对车牌图像进行预处理,包括灰度化、二值化、去噪等操作。然后,可以使用形态学操作来进行字符分割,将车牌中的字符分离出来。接着,可以使用模板匹配或者神经网络等方法进行字符识别。最后,将识别结果输出即可。 下面是一个简单的车牌识别MATLAB程序的示例: ```matlab % 读取车牌图像 img = imread('car_plate.jpg'); % 灰度化 gray_img = rgb2gray(img); % 二值化 bw_img = imbinarize(gray_img); % 去噪 denoise_img = medfilt2(bw_img); % 形态学操作进行字符分割 se = strel('rectangle', [5, 5]); erode_img = imerode(denoise_img, se); dilate_img = imdilate(erode_img, se); % 字符识别 plate_num = ocr(dilate_img); % 输出识别结果 disp(plate_num.Text); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素馨堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值