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

合着代码进行相关讲解。

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

Image=imread('D:\1_2学习\图像处理\车牌识别\matlab_car_plate-recognization\car_example\car0.jpg');%获取图片
im=double(rgb2gray(Image));
im=imresize(im,[,]);%重新设置图片大小 [,]
% % 灰度拉伸
% % im=imadjust(Image,[0.15 0.9],[]);
s=strel('disk',);%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,,Lo_D,Hi_D); %Lo_D is the decomposition low-pass filter
% decomposition vector C corresponding bookkeeping matrix S
isize=prod(S(,:));%元素连乘
%
cA = C(:isize);%cA
cH = C(isize+(:isize));
cV = C(*isize+(:isize));
cD = C(*isize+(:isize));
%
cA = reshape(cA,S(,),S(,));
cH = reshape(cH,S(,),S(,));
cV = reshape(cV,S(,),S(,));
cD = reshape(cD,S(,),S(,));

获取结果

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

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

获取的筛选结果:

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

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

%利用长宽比进行区域筛选
[L,num] = bwlabel(I5,);%标注二进制图像中已连接的部分,c3是形态学处理后的图像
Feastats =regionprops(L,'basic');%计算图像区域的特征尺寸
Area=[Feastats.Area];%区域面积
BoundingBox=[Feastats.BoundingBox];%[x y width height]车牌的框架大小
RGB = label2rgb(L,'spring','k','shuffle'); %标志图像向RGB图像转换 lx=;%统计宽和高满足要求的可能的车牌区域个数
Getok=zeros(,);%统计满足要求个数
for l=:num %num是彩色标记区域个数
width=BoundingBox((l-)*+);
hight=BoundingBox((l-)*+);
rato=width/hight;%计算车牌长宽比
%利用已知的宽高和车牌大致位置进行确定。
if(width> & width< & hight> & hight< &(rato>&rato<)&((width*hight)>Area(l)/))%width> & width< & hight> & hight<
Getok(lx)=l;
lx=lx+;
end
end
startrow=;startcol=;
[original_hihgt original_width]=size(cA);

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

for order_num=:lx- %利用垂直投影计算峰值个数来确定区域
area_num=Getok(order_num);
startcol=round(BoundingBox((area_num-)*+)-);%开始列
startrow=round(BoundingBox((area_num-)*+)-);%开始行
width=BoundingBox((area_num-)*+)+;%车牌宽
hight=BoundingBox((area_num-)*+)+;%车牌高
uncertaincy_area=cA(startrow:startrow+hight,startcol:startcol+width-); %获取可能车牌区域
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(,,),bar(histcol_unsure);
subplot(,,),imshow(mat2gray(uncertaincy_area));
[data_1 data_2]=size(histcol_unsure);
peak_number=; %判断峰值个数
for j=:data_2-%判断峰值个数
if (histcol_unsure(j)>histcol_unsure(j-))&(histcol_unsure(j)>histcol_unsure(j+))
peak_number=peak_number+;
end
end
valley_number=; %判断波谷个数
for j=:data_2-
if (histcol_unsure(j)<histcol_unsure(j-))&(histcol_unsure(j)<histcol_unsure(j+)) &(histcol_unsure(j)<average_vertical)
%波谷值比平均值小
valley_number=valley_number+;
end
end
%peak_number<=
if peak_number>= & peak_number<= &valley_number>= & (startcol+width/)>=original_width/ &(startcol+width/)<=*original_width/....
&(startrow+hight/)>=original_hihgt/ & (startrow+hight/)<=original_hihgt*/
%进一步确认可能区域
select_unsure_area(count)=area_num;
standard_deviation(count)=std2(histcol_unsure);%计算标准差
count=count+;
end
end
correct_num_area=;
max_standard_deviation=;
if(count<=) %仅有一个区域 correct_num_area=select_unsure_area(count-);
else
for num=:count-
if(standard_deviation(num)>max_standard_deviation)
max_standard_deviation=standard_deviation(num);
correct_num_area=select_unsure_area(num);
end
end
end

获取区域:

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

基于matlab的蓝色车牌定位与识别---定位的更多相关文章

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

    本着对车牌比较感兴趣,自己在课余时间摸索关于车牌的定位与识别,现将自己所做的一些内容整理下,也方便和大家交流. 考虑到车牌的定位涉及到许多外界的因素,因此有必要对车牌照的获取条件进行一些限定: 一.大 ...

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

    接着昨天的工作,把最后一部分识别讲完. 关于字符识别这块,一种最省事的办法是匹配识别,将所得的字符和自己的标准字符库相减,计算所得结果,值最小的即为识别的结果.不过这种方法是在所得字符较为标准的情况, ...

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

    接着上面的工作,接下去就该是进行字符分割了.考虑到为了后面的字符识别,因此在这部分需要实现的目标是需要把车牌的边框全部切除,对重新定位的车牌进行垂直方向水平方向调整,保证字符是正的.最后才是字符的分割 ...

  4. 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)

    学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...

  5. 基于MATLAB的手写公式识别(2)

    基于MATLAB的手写公式识别 图像的预处理(除去噪声.得到后续定位分割所需的信息.) 预处理其本质就是去除不需要的噪声信息,得到后续定位分割所需要的图像信息.图像信息在采集的过程中由于天气环境的影响 ...

  6. 基于MATLAB的人脸识别算法的研究

    基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...

  7. 基于MATLAB的手写公式识别(3)

    基于MATLAB的手写公式识别 图像的膨胀化,获取边缘(思考是否需要做这种处理,初始参考样本相对简单) %膨胀 imdilate(dilate=膨胀/扩大) clc clear A1=imread(' ...

  8. 基于MATLAB的手写公式识别(9)

    基于MATLAB的手写公式识别(9) 1.2图像的二值化 close all; clear all; Img=imread('drink.jpg'); %灰度化 Img_Gray=rgb2gray(I ...

  9. 基于MATLAB的手写公式识别(6)

    基于MATLAB的手写公式识别 2021-03-29 10:24:51 走通了程序,可以识别"心脑血管这几个字",还有很多不懂的地方. 2021-03-29 12:20:01 tw ...

随机推荐

  1. 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)

    本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...

  2. Java Servlet图片上传至指定文件夹并显示图片

    在学习Servlet过程中,针对图片上传做了一个Demo,实现的功能是:在a页面上传图片,点击提交后,将图片保存到服务器指定路径(D:/image):跳转到b页面,b页面读取展示绝对路径(D:/ima ...

  3. 洛谷P4407 [JSOI2009]电子字典

    题目描述 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子字典能够从一定 ...

  4. 制作windows启动盘

    ·首先:不要使用“老毛桃,大白菜,u深度,电脑店,u大师”等工具,国产流氓软件了解下. ·工具:UltraISO (自行下载)环境:Windows ·Windows 7微软原版无修改的系统镜像下载地址 ...

  5. jvm 默认字符集

    最近在读取第三方上传的文件时,遇到一个问题,就是采用默认字符集读取,发现个别中文乱码,找到乱码的字,发现是生僻字:碶. 由于在window是环境下做的测试,并没有报错,但是在linux服务器上执行,发 ...

  6. SpringBoot用户CRUD

    1.准备 http://start.spring.io/ 这里地址去直接生成你需要的项目信息,如何你本身ide以及集成了springboot 那么可以直接生成项目信息 需要的知识:java,sprin ...

  7. HDU 5883 F - The Best Path 欧拉通路 & 欧拉回路

    给定一个图,要求选一个点作为起点,然后经过每条边一次,然后把访问过的点异或起来(访问一次就异或一次),然后求最大值. 首先为什么会有最大值这样的分类?就是因为你开始点选择不同,欧拉回路的结果不同,因为 ...

  8. HTTP状态码完整版

    HTTP 状态代码的完整列表   1xx(临时响应) 用于表示临时响应并需要请求者执行操作才能继续的状态代码. 代码 说明 100(继续) 请求者应当继续提出请求.服务器返回此代码则意味着,服务器已收 ...

  9. SpringBoot 2.0中SpringWebContext 找不到无法使用的问题解决

    为了应对在SpringBoot中的高并发及优化访问速度,我们一般会把页面上的数据查询出来,然后放到redis中进行缓存.减少数据库的压力. 在SpringBoot中一般使用 thymeleafView ...

  10. 如何设置FusionCharts图片导出格式

    通过设置FusionCharts的<chart exportEnabled='1' ...>属性,就可以导出图表,图表的右键菜单将会显示所有可能导出的格式- JPEG, PNG and P ...