基于matlab的蓝色车牌定位与识别---分割
接着上面的工作,接下去就该是进行字符分割了。考虑到为了后面的字符识别,因此在这部分需要实现的目标是需要把车牌的边框全部切除,对重新定位的车牌进行垂直方向水平方向调整,保证字符是正的。最后才是字符的分割。
1.首先上下边框切割。对定位的车牌每行作一次的差分,计算每行的综合,小于某个阈值时候将其舍去。部分代码:
[length height]=size(p);
% 水平方向定位
for i=:length % 水平一阶差分
for j=:height-
revise_row(i,j)=abs(p(i,j)-p(i,j+));
end
revise_row(i,height)=revise_row(i,height-);
end
for i=:length
T(i)=sum(revise_row(i,:));
end
for i=:length-
T(i)=/*(T(i-)+T(i)+T(i+));
end
T(1)= T(2);
T(length)=T(length-1);
% 截取水平区间
left_row=;right_row=;
threshold_row=max(T);
for i=:length
if(T(i)>/*threshold_row)
left_row=i;
break;
end
end
for i=length:-:
if(T(i)>/*threshold_row)
right_row=i;
break;
end
end
temp=;
for i=left_row:right_row %截取区间
p_row(temp,:)=p1(i,:);
temp=temp+;
end
左右切割结果图:

2 左右边框切割。对定位的车牌每列作一次的差分。考虑到左右边框的一阶总数是两边大,中间小,因此采用获取左右的峰值,当小于峰值的摸个阈值时进行截取。 部分代码:
% 竖直方向定位
for j=:height % 一阶差分
for i=:length-
revise_column(i,j)=abs(p1(i,j)-p1(i+,j));
end
revise_column(length,j)=;
end for j=:height
T(j)=sum(revise_column(:,j));
end
for j=:height-
T(j)=/*(T(j-)+T(j)+T(j+));
end
T()= T();
T(height)=T(height-);
[max_peak max_num]=max(T);%求出峰值
threshold=0.25*max_peak;%阈值
left_peak= T();
right_peak= T(height); %找到左峰值
for j=:height
if(T(j)>=threshold&(T(j)>=T(j-))&(T(j)>=T(j+))&(j<=max_num))
left_peak=j;
break;
end
end
%找到右峰值
if(max_num</*height)
threshold=/*threshold;
end
for j=height-:-:
if(T(j)>=threshold&(T(j)>=T(j-))&(T(j)>=T(j+))&(j>=max_num))
right_peak=j;
break;
end
end
left_valley=;%谷底值
right_valley=right_peak;
%找出左边最小值
for j=left_peak:-:
if((T(j)<=T(j-))&(T(j)<=T(j+)))
left_valley=j;
break;
end
end
for j=right_peak:height-
if((T(j)<=T(j-))&(T(j)<=T(j+)))
right_valley=j;
break;
end
end
temp=;
for j=left_valley:right_valley %截取部分参数分开,否则仍然按照原图大小
p_array(:,temp)=p_row(:,j);
temp=temp+;
end
截取图: 
3 接下来进行车牌的水平校正。matlab里面有现成的函数imrotate,在-20~20角度范围对车牌进行操作,完成水平校正。代码
%水平校正
max_total=;
sum_abs_angle=zeros(,);
count=;
for angle=-:0.1:%旋转角度选择
p_array_temp=edge(p_array,'sobel','horizontal');%水平边缘检测
picbw_temp = imrotate(p_array,angle, 'bicubic','loose');%p_array对灰度图像进行判断操作
sum_xz=sum(picbw_temp'); %计算垂直投影
[sum_hight sum_width]=size(sum_xz);
% figure,bar(sum_xz);title('垂直投影(含边框)');%输出垂直投影
% title(['车牌旋转角: ',num2str(angle),'度后图像'] ,'Color','r');%显示车牌的旋转角度
total_xz=;
for i=:sum_width-
total_xz=total_xz+abs(sum_xz(i)-sum_xz(i+));
end
if total_xz>max_total %找出一阶导最大值
angle_xz=angle;%调整角度
picbw_xz=picbw_temp;
max_total=total_xz;
end
sum_abs_angle(count)=total_xz;
count=count+;
end
% figure,bar(sum_abs_angle);title('每个角度绝对值总和');%输出垂直投影
image_correct=imrotate(p_array,angle_xz,'bicubic','loose');%车牌的水平旋转校正
figure,imshow(mat2gray(image_correct));
title(['车牌旋转角: ',num2str(angle_xz),'度后图像'] ,'Color','r');%显示车牌的旋转角度
水平矫正结果: 
4 水平矫正后,我们还需要对车牌上下边框再次进行切割,去除车牌上下边框。与前面直接做一阶差分不同,这里考虑到上下边框水平成分较明显,所以我们在这里先对车牌进行竖直方向的边沿检测,然后计算水平方向的均值进行切割。 部分代码:
%去除上下边框
max_num=max(max(image_correct));
min_num=min(min(image_correct));
thresh=(max_num-min_num)/;%
image_correct_row=edge(image_correct,'sobel',thresh,'vertical');%根据所指定的敏感度阈值thresh,在所指定的方向direction上,
% figure,imshow(image_correct_row);
title('竖直边缘检测');%显示车牌的旋转角度
histrow=sum(image_correct_row'); %计算水平投影
histrow_mean=mean(histrow);
histcol=sum(image_correct_row); %计算竖直投影
histcol_mean=mean(histcol);
[width hight]=size(image_correct_row);
rowtop=;
for i=:width/
if histrow(i)>=/*histrow_mean & histrow(i+)>/*histrow_mean & histrow(i+)>/*histrow_mean & histrow(i+)>/*histrow_mean %连续有值判断为上边界
rowtop=i; %上边切割
break;
end
end
rowbot=;
for i=width:-:width/
if histrow(i)>=/*histrow_mean & histrow(i-)>histrow_mean & histrow(i-)>histrow_mean & histrow(i-)>histrow_mean & histrow(i-)>histrow_mean
rowbot=i; %下边切割
break;
end
end
结果图:

可以看到,上下边框基本清除,下面就需要对字符进行垂直校正。
5 关于字符垂直校正,这个部分自己也没太明白,只是参考别人的程序,可以交流。代码:
max_total=;
angle_yz=;
sum_abs_angle=zeros(,);
count=;
for angle=-:0.05:%旋转角度选择
picbw_temp = imrotate(image_correct_x,angle, 'bicubic','crop');%p_array对灰度图像进行判断操作
sum_yz=sum(picbw_temp); %计算垂直投影
[sum_hight sum_width]=size(sum_yz);
total_yz=;
for i=:sum_width-
total_yz=total_yz+abs(sum_yz(i)-sum_yz(i+));
end
if total_yz>max_total %找出一阶导最大值
angle_yz=angle;
picbw_yz=picbw_temp;
max_total=total_yz;
end
sum_abs_angle(count)=total_yz;
count=count+;
end
Td=maketform('affine',[ tand(angle_yz) ; ; ]');%切变的参数结构体
image_correct_x_y=imtransform(image_correct_x,Td,'FillValues',);%实现图像切变
实验结果: 
6 这样基本要做的都已经完成,剩下字符切割。在测试过程中,发现车牌的上下边框边角好去除,左右边框则无法达到理想的要求,经常是要么没有切割完全,要把把车牌字符也切割了。最后索性就不管左右边框了,直接进行字符分割。自己所用的方法是:设置字符宽为width=1/2*车牌的高度;考虑到车牌的第二位和第三位之间有小点(也可能没有),中间距离更大,所以认为车牌宽度的一半既是第四个字符所在位置或者是第三和第四字符之间,这里最主要是要确定某个参数,来标定车牌位置,便于分割。(实验证明还是有效的)当遇到字符宽度大于默认width时,取大的值。车牌左右第一个和第七个字符则是截取默认宽度,去除边框影响。部分代码:
获取第四个字符:
%切割字符
[image_heigth image_length]=size(image_correct_x_y);
character_left=;%切割字符左右位置
character_right=;
middle_histcol=uint8(image_length/);
char_width=image_heigth/;%默认字符宽度 if binary_histcol(middle_histcol)> %垂直投影不为零
%找出车牌的第四个字符
for i=middle_histcol:-: %字符左侧
if binary_histcol(i)==
character_left=i+;
break;
end
end
for i=middle_histcol:image_length%字符右侧
if binary_histcol(i)==
character_right=i-;
break;
end
end
result_char_forth(:,:)=binary_image(:,character_left:character_right);
else %认为中间值在 第三、四个字符之间
for i=middle_histcol:image_length%获取第四个字符
if binary_histcol(i)> & binary_histcol(i-)== %字符左起点
character_left=i;
end
if binary_histcol(i)> & binary_histcol(i+)== %字符右边界
character_right=i;
break;
end
end
result_char_forth(:,:)=binary_image(:,character_left:character_right); %获取字符
if character_right-character_left+>char_width %比默认字符大
char_width=character_right-character_left+;%默认字符用于确认车牌左右两侧的宽度
end
end
判断中间有无小点:
%判断有无中间小点!!!!! width_dot=
width_dot=;%只能是字母,认为宽度小于4即为点,否则认为没有点
for i=current_left_position-:-:
if binary_histcol(i)> & binary_histcol(i+)== %字符右起点
character_right_temp=i;
end
if binary_histcol(i)> & binary_histcol(i-)== %字符左边界
character_left_temp=i;
break;
end
end
if((character_right_temp-character_left_temp)>width_dot)%不是点
current_left_position=character_left;%记录当前位置放到下面读取
else %是点
current_left_position=character_left_temp;%记录当前位置
end
切割结果:
可以看到,基本上消除了左右边框的影响。七个工作基本完成!欢迎交流!
基于matlab的蓝色车牌定位与识别---分割的更多相关文章
- 【原】基于matlab的蓝色车牌定位与识别---绪论
本着对车牌比较感兴趣,自己在课余时间摸索关于车牌的定位与识别,现将自己所做的一些内容整理下,也方便和大家交流. 考虑到车牌的定位涉及到许多外界的因素,因此有必要对车牌照的获取条件进行一些限定: 一.大 ...
- 基于matlab的蓝色车牌定位与识别---识别
接着昨天的工作,把最后一部分识别讲完. 关于字符识别这块,一种最省事的办法是匹配识别,将所得的字符和自己的标准字符库相减,计算所得结果,值最小的即为识别的结果.不过这种方法是在所得字符较为标准的情况, ...
- 基于matlab的蓝色车牌定位与识别---定位
接着昨天的工作继续.定位的过程有些是基于车牌的颜色进行定位的,自己则根据数字图像一些形态学的方法进行定位的. 合着代码进行相关讲解. 1.相对彩色图像进行灰度化,然后对图像进行开运算.再用小波变换获取 ...
- 车牌识别LPR(四)-- 车牌定位
第四篇:车牌定位 车牌定位就是采用一系列图像处理或者数学的方法从一幅图像中将车牌准确地定位出来.车牌定位提取出的车牌是整个车牌识别系统的数据来源,它的效果的好坏直接影响到整个系统的表现,只有准确地定位 ...
- 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)
学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...
- 基于MATLAB的手写公式识别(2)
基于MATLAB的手写公式识别 图像的预处理(除去噪声.得到后续定位分割所需的信息.) 预处理其本质就是去除不需要的噪声信息,得到后续定位分割所需要的图像信息.图像信息在采集的过程中由于天气环境的影响 ...
- 基于MATLAB的人脸识别算法的研究
基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...
- 基于MATLAB的手写公式识别(3)
基于MATLAB的手写公式识别 图像的膨胀化,获取边缘(思考是否需要做这种处理,初始参考样本相对简单) %膨胀 imdilate(dilate=膨胀/扩大) clc clear A1=imread(' ...
- 基于MATLAB的手写公式识别(9)
基于MATLAB的手写公式识别(9) 1.2图像的二值化 close all; clear all; Img=imread('drink.jpg'); %灰度化 Img_Gray=rgb2gray(I ...
随机推荐
- 一文搞定 Redis 复制(全会的举个手看看)
阅读本文大概需要 5 分钟. 本文大纲 复制过程 数据间的同步 全量复制 部分复制 心跳 异步复制 总结 一.复制过程 Step 1:从节点执行 slaveof 命令. Step 2:从节点只是保存了 ...
- GFS安装
GlusterFS 搭建 1.环境要求 IP地址 主机名称 系统 172.16.2.201 test01 Centos 6.4 172.16.2.202 test02 Centos 6.4 172.1 ...
- maven工程运行出Unable to compile class for JSP: 错误
使用mvn tomcat:run运行时出现500错误,使用tomcat7再次运行就好了 更新,上面的是在命令行操作的 如果要在idea上面出现错误的话需要在pom.xml上配置下面的语句 org.ap ...
- Maven项目编译版本的问题和Spring中没有导入核心包
idea中maven项目的编译: 方案1:maven的settings.xml中指定全局默认编译版本 <profile> <id>jdk-1.8</id> < ...
- VLAN-7-VTP处理及修订版本号
在VTPv1和VTPv2中,更新的过程开始于:交换机管理员在一台VTP服务器交换机上添加.删除或更新VLAN.当新的配置出现时,VTP服务器将旧的VTP修订版本号加1,并通告完整的VLAN配置数据库以 ...
- 界面切换动画(CATransition实现 )
调用 // CATransition动画实现 [self pushWithAnimationType:@"fade"]; - (void)pushWithAnimationType ...
- Beanshell vs JSR223 vs Java JMeter脚本:性能关闭你一直在等待!
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能.查看最流行的扩展机制,比较性能并分析哪一个是最好的. 这是乐队之战,JMeter风格. Beanshell V. JSR223 V ...
- Atcoder AGC016 E Poor Turkeys
比赛的时候口胡这道题口胡了一年,看完题解被教做人 题意:有n只火鸡,m个猎人按序来杀火鸡,从自己预先选的两只中杀一只,问有多少火鸡对可以同时存活 考虑对于每一只火鸡i,按时间逆序维护一个最小的集合Si ...
- javac 找不到文件 的可能原因
初学Java还不太明白,竟在些简单的事情上栽跟头,分享一下省的麻烦. 当我们配置好JDK和环境变量之后,在命令行下输入javac,说明我们的安装是正确的.
- 《C#高效编程》读书笔记01-使用属性而不是可访问的数据成员
在需求变更中,属性比数据成员更容易修改,例:客户对象不该与空白名称,若你使用公有属性封装Name,那么现在修改一处,而数据成员则可能要修改多处 public class Customer { priv ...