【原】基于matlab的蓝色车牌定位与识别---定位

接着昨天的工作继续。定位的过程有些是基于车牌的颜色进行定位的,自己则根据数字图像一些形态学的方法进行定位的。

合着代码进行相关讲解。

1.相对彩色图像进行灰度化,然后对图像进行开运算。再用小波变换获取图像的三个分量。考虑到车牌的竖直分量较为丰富,选用竖直分量进行后续操作。注意下,这里的一些参数可能和你的图片大小有关,所以要根据实际情况调整。

Image=imread(‘D:\1_2学习\图像处理\车牌识别\matlab_car_plate-recognization\car_example\car0.jpg‘);%获取图片
im=double(rgb2gray(Image));
im=imresize(im,[1024,2048]);%重新设置图片大小  [1024,2048]
% % 灰度拉伸
% % im=imadjust(Image,[0.15 0.9],[]);
  s=strel(‘disk‘,10);%strei函数
 Bgray=imopen(im,s);%打开sgray s图像
% % figure,imshow(Bgray);title(‘背景图像‘);%输出背景图像
% %用原始图像与背景图像作减法,增强图像
 im=imsubtract(im,Bgray);%两幅图相减
% figure,imshow(mat2gray(im));title(‘增强黑白图像‘);%输出黑白图像

[Lo_D,Hi_D]=wfilters(‘db2‘,‘d‘); % d Decomposition filters
[C,S]= wavedec2(im,1,Lo_D,Hi_D); %Lo_D  is the decomposition low-pass filter
% decomposition vector C    corresponding bookkeeping matrix S
isize=prod(S(1,:));%元素连乘
%
cA   = C(1:isize);%cA  49152
cH  = C(isize+(1:isize));
cV  = C(2*isize+(1:isize));
cD  = C(3*isize+(1:isize));
%
cA   = reshape(cA,S(1,1),S(1,2));
cH  = reshape(cH,S(2,1),S(2,2));
cV  = reshape(cV,S(2,1),S(2,2));
cD  = reshape(cD,S(2,1),S(2,2));

获取结果

2. 对上面过程中获取的图像进行边沿竖直方向检测,再利用形态学的开闭运算扩大每个竖直方向比较丰富的区域。最后对不符合区域进行筛选。部分代码:

I2=edge(cV,‘sobel‘,thresh,‘vertical‘);%根据所指定的敏感度阈值thresh,在所指定的方向direction上,
a1=imclearborder(I2,8); %8连通 抑制和图像边界相连的亮对象
se=strel(‘rectangle‘,[10,20]);%[10,20]
I4=imclose(a1,se);
st=ones(1,8); %选取的结构元素
bg1=imclose(I4,st); %闭运算
bg3=imopen(bg1,st); %开运算
bg2=imopen(bg3,[1 1 1 1]‘);
I5=bwareaopen(bg2,500);%移除面积小于2000的图案
I5=imclearborder(I5,4); %8连通 抑制和图像边界相连的亮对象
 figure,imshow(I5);title(‘从对象中移除小对象‘);  

获取的筛选结果:

我们接下来目的就是从这些待选区域中挑选出车牌区域。

3 这里我们就要利用一些关于车牌的先验知识。2007 年实施的车牌标准规定,车前车牌长440mm,宽140mm。其比例为440 /140 ≈3.15  。根据图像像素的大小,这里选取筛选条件为宽在70到250之间,高在15到70之间,同时宽高比例应大于0.45,就可以比较准确的得到车牌的大致位置。当然,这里宽高值也是根据你的图像大小进行设置的,大小不一样,值略有区别。

%利用长宽比进行区域筛选
[L,num] = bwlabel(I5,8);%标注二进制图像中已连接的部分,c3是形态学处理后的图像
Feastats =regionprops(L,‘basic‘);%计算图像区域的特征尺寸
Area=[Feastats.Area];%区域面积
BoundingBox=[Feastats.BoundingBox];%[x y width height]车牌的框架大小
RGB = label2rgb(L,‘spring‘,‘k‘,‘shuffle‘); %标志图像向RGB图像转换

lx=1;%统计宽和高满足要求的可能的车牌区域个数
Getok=zeros(1,10);%统计满足要求个数
for l=1:num  %num是彩色标记区域个数
width=BoundingBox((l-1)*4+3);
hight=BoundingBox((l-1)*4+4);
rato=width/hight;%计算车牌长宽比%利用已知的宽高和车牌大致位置进行确定。
if(width>70 & width<250 & hight>15 & hight<70 &(rato>3&rato<8)&((width*hight)>Area(l)/2))%width>50 & width<1500 & hight>15 & hight<600
        Getok(lx)=l;
        lx=lx+1;
end
end
startrow=1;startcol=1;
[original_hihgt original_width]=size(cA);

当然,这个只是初步确定,经常出现的结果是好几个待选区域都满足要求。通过观察它的直方图发现车牌区域的直方图多波峰波谷,变化大,而一般的区域变化较不明显。因此根据它的方差,波峰波谷值数量来确定车牌区域。实验结果表明效果还是挺不错的。

for order_num=1:lx-1 %利用垂直投影计算峰值个数来确定区域
  area_num=Getok(order_num);
  startcol=round(BoundingBox((area_num-1)*4+1)-2);%开始列
  startrow=round(BoundingBox((area_num-1)*4+2)-2);%开始行
  width=BoundingBox((area_num-1)*4+3)+2;%车牌宽
  hight=BoundingBox((area_num-1)*4+4)+2;%车牌高
  uncertaincy_area=cA(startrow:startrow+hight,startcol:startcol+width-1); %获取可能车牌区域
  image_binary=binaryzation(uncertaincy_area);%图像二值化
  histcol_unsure=sum(uncertaincy_area);%计算垂直投影
   histcol_unsure=smooth(histcol_unsure)‘;%平滑滤波
      histcol_unsure=smooth(histcol_unsure)‘;%平滑滤波
      average_vertical=mean(histcol_unsure);
  figure,subplot(2,1,1),bar(histcol_unsure);
  subplot(2,1,2),imshow(mat2gray(uncertaincy_area));
  [data_1 data_2]=size(histcol_unsure);
  peak_number=0; %判断峰值个数
  for j=2:data_2-1%判断峰值个数
      if (histcol_unsure(j)>histcol_unsure(j-1))&(histcol_unsure(j)>histcol_unsure(j+1))
          peak_number=peak_number+1;
      end
  end
   valley_number=0; %判断波谷个数
  for j=2:data_2-1
      if (histcol_unsure(j)<histcol_unsure(j-1))&(histcol_unsure(j)<histcol_unsure(j+1)) &(histcol_unsure(j)<average_vertical)
           %波谷值比平均值小
          valley_number=valley_number+1;
      end
  end
  %peak_number<=15
 if peak_number>=7 & peak_number<=18 &valley_number>=4 & (startcol+width/2)>=original_width/6 &(startcol+width/2)<=5*original_width/6....
     &(startrow+hight/2)>=original_hihgt/6 & (startrow+hight/2)<=original_hihgt*5/6
     %进一步确认可能区域
     select_unsure_area(count)=area_num;
     standard_deviation(count)=std2(histcol_unsure);%计算标准差
     count=count+1;
 end
end
correct_num_area=0;
max_standard_deviation=0;
if(count<=2) %仅有一个区域

    correct_num_area=select_unsure_area(count-1);
else
    for  num=1:count-1
       if(standard_deviation(num)>max_standard_deviation)
           max_standard_deviation=standard_deviation(num);
         correct_num_area=select_unsure_area(num);
       end
    end
end

获取区域:

定位大概就这么多。这里说明一下,上面一些参数和你的图片规格有关系,不是你随便拿来一张就可以识别的,要根据你的实际进行调整。大概就这么多,欢迎交流,转载请注明出处,谢谢。

时间: 2024-10-13 10:47:31

【原】基于matlab的蓝色车牌定位与识别---定位的相关文章

【原】基于matlab的蓝色车牌定位与识别---绪论

本着对车牌比较感兴趣,自己在课余时间摸索关于车牌的定位与识别,现将自己所做的一些内容整理下,也方便和大家交流. 考虑到车牌的定位涉及到许多外界的因素,因此有必要对车牌照的获取条件进行一些限定: 一.大部分车牌照都是用自己的手机照的,大小在1M左右,距离车牌照距离3m左右.这样保证所获取的车牌照有一定的规律,否则随便一张是无法进行定位的. 二.本次仅针对蓝色车牌,至于其他像黄色,黑色车牌的没有做研究.感兴趣的可以自己找些资料,毕竟要做到全面,工作量还是很大的. 三. 相关的参考资料网上也挺多的,这

基于matlab的蓝色车牌定位与识别---识别

接着昨天的工作,把最后一部分识别讲完. 关于字符识别这块,一种最省事的办法是匹配识别,将所得的字符和自己的标准字符库相减,计算所得结果,值最小的即为识别的结果.不过这种方法是在所得字符较为标准的情况,由于众多因素影响,切割出来的字符往往不是标准的,因此识别效果也不好.本次采用的BP神经网络方法,至于像其他的分类器方法,没有尝试,这里就不说了. 利用神经网络的方法的思路也比较清晰,将已有的字符库输入到神经网络的输入口进行训练,然后用训练好的神经网络对待识别的字符继续识别,输出识别结果.matlab

基于matlab的蓝色车牌定位与识别---分割

接着上面的工作,接下去就该是进行字符分割了.考虑到为了后面的字符识别,因此在这部分需要实现的目标是需要把车牌的边框全部切除,对重新定位的车牌进行垂直方向水平方向调整,保证字符是正的.最后才是字符的分割. 1.首先上下边框切割.对定位的车牌每行作一次的差分,计算每行的综合,小于某个阈值时候将其舍去.部分代码: [length height]=size(p); % 水平方向定位 for i=1:length % 水平一阶差分 for j=1:height-1 revise_row(i,j)=abs(

基于MATLAB的多项式数据拟合方法研究-毕业论文

摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式曲线拟合的基本理论,对多项式数据拟合原理进行了全方面的理论阐述,同时也阐述了曲线拟合的基本原理及多项式曲线拟合模型的建立.具体记录了多项式曲线拟合的具体步骤,在建立理论的基础上具体实现多项式曲线的MATLAB实现方法的研究,采用MATLAB R2016a的平台对测量的数据进行多项式数据拟合,介绍了M

基于MATLAB的数字基带信号的各种码型的产生

单极性非归零码 单极性非归零码使用电平1来表示二元信息中的"1",用电平0来表示二元信息中的"0",电平在整个码元的时间里不变单极性非归零码的优点是实现简单,但由于含有直流分量,对在带限信道中的传输不利,另外当出现连续的0或连续的1时.电平长时间保持一个值,不利于提取时间信息以便获得同步. function y = snrz(x) %本函数实现将输入的一段二进制代码编为相应的单极性非归零码输出 %输入x为二进制码,输出y为编出的单极性非归零码 t0 = 300; t

基于matlab的音频波形实时采集显示 v0.1

robj = audiorecorder(44100,16,1); %设置采样频率.采样位数.通道数 recordblocking(robj,1); %采集初步数据(1s长度) rdata = getaudiodata(robj); %获取音频数据 plot(rdata); %绘制波形 axis([1,44100,-0.1,0.1]); %设置固定坐标轴 drawnow %刷新显示 n = 100; %设定后续的采样更新次数,n与m可联合计算后续更新时间长度 m = 0.1; %设定更新间隔,m

基于matlab mex的平面点集按重心逆时针排序算法

基于matlab mex的平面点集按重心逆时针排序算法,可用于求凸集,代码如下: #include <mex.h> #include <mat.h> #include <stdlib.h> #include <vector> #include <algorithm> using namespace std; typedef struct PointF { int id; double x, y; PointF() { id = -1; } Poi

基于MATLAB的GUI(Graphical User Interface)音频实时显示设计

摘要:本文章的设计主要讲基于matlab的gui音频实时显示设计,此次设计的gui相当于一个简洁的音乐播放器,界面只有”录音“和”播放“两个控件,哈哈,够简洁吧.通过”录音“按钮可以实现声音从电脑的声卡录入,并且实时显示录入声音的时域图形和频域图形:待录音结束,通过”播放“按钮可以播放刚录入的声音,并且一边播放一遍实时显示时域和频域图形.本设计的编码在matlab2013a上亲测,可以实现... 一.首先matlab的gui界面设计 打开matlab—>在命令行执行guide—>出现gui编辑

基于MATLAB的离散小波变换

申明,本文非笔者原创,原文转载自:  基于Matlab的离散小波变换         http://blog.sina.com.cn/s/blog_725866260100ryh3.html 简介 在数字图像处理中,需要将连续的小波及其小波变换离散化.一般计算机实现中使用二进制离散处理,将经过这种离散化的小波及其相应的小波变换成为离散小波变换(简称DWT).实际上,离散小波变换是对连续小波变换的尺度.位移按照2的幂次进行离散化得到的,所以也称之为二进制小波变换. 虽然经典的傅里叶变换可以反映出信