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

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的蓝色车牌定位与识别---分割的更多相关文章

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

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

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

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

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

    接着昨天的工作继续.定位的过程有些是基于车牌的颜色进行定位的,自己则根据数字图像一些形态学的方法进行定位的. 合着代码进行相关讲解. 1.相对彩色图像进行灰度化,然后对图像进行开运算.再用小波变换获取 ...

  4. 车牌识别LPR(四)-- 车牌定位

    第四篇:车牌定位 车牌定位就是采用一系列图像处理或者数学的方法从一幅图像中将车牌准确地定位出来.车牌定位提取出的车牌是整个车牌识别系统的数据来源,它的效果的好坏直接影响到整个系统的表现,只有准确地定位 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 关于Mac系统中my sql 和navicat for mysql 的连接问题。

    我这个完完全全的技术小小白,经过数个小时的网搜,navicat for mysql和mysql终于可以可以正常连接了,好开森啊!,我把我遇到的问题,以及解决方法记录下来,希望也可以对遇到同样问题的能够 ...

  2. $("body").animate({"scrollTop":top})无效的问题

    问题 我在个人站点的左下角和右下角各自使用了如下代码来将页面滚动到顶部和底部: $("body").animate({scrollTop:0},800); $("body ...

  3. 关于idea的快捷键提示

    IntelliJ Idea 常用快捷键列表 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Sh ...

  4. .NET 基础 一步步 一幕幕[XML基础操作]

    XML可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 什么是XML,学他有什么用? 优点:容易读懂,格式标准任何语言都内置了XML分析引擎,不用单独进行文件分 ...

  5. render函数和redirect函数的区别+反向解析

    render函数和redirect函数的区别+反向解析 1.视图函数:一定是要包含两个对象的(render源码里面有HttpResponse对象)   request对象:----->所有的请求 ...

  6. mac下配置php+mysql+nginx遇到的问题

    1.mysql:没有useradd和groupadd命令,好在原来的/etc/passwd有了mysql,www用户,/etc/group下也有了mysql,www用户组 2.nginx:编译ngin ...

  7. Java通过图片url地址获取图片base64位字符串的两种方式

    工作中遇到通过图片的url获取图片base64位的需求.一开始是用网上的方法,通过工具类Toolkit,虽然实现的代码比较简短,不过偶尔会遇到图片转成base64位不正确的情况,至今不知道为啥. 之后 ...

  8. 牛客网Java刷题知识点之什么是匿名内部类、匿名内部类的使用原则、匿名内部类初始化、匿名内部类使用的形参为何要为final 和 案例

    不多说,直接上干货! 什么是匿名内部类 匿名内部类就是没有名字的内部类. 不使用关键字class . extends .implements 没有构造函数 必须继承其他类或实现其他接口 正因为没有名字 ...

  9. spirngmvc整合mybatis

    一.建立一张简单的User表 CREATE TABLE `users` (`id` int(20) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NUL ...

  10. js动态更换img的src问题

    在本地开发测试过程中,通过js动态更换img的src没有问题,图片正常切换,但是放在服务器上后测试发现,图片不显示,解决方法为:在对应onclick事件执行切换图片的js函数后加上一个return f ...