您的位置:首页 > 编程语言 > MATLAB

详解基于MATLAB的车牌识别系统设计与实现(1):车牌定位

2018-12-06 23:25 971 查看
版权声明:支持原创,转载请申明 https://blog.csdn.net/weixin_43958974/article/details/84867078

车牌识别系统主要包括车牌定位字符分割字符识别三个核心模块。

车牌定位是利用车牌的颜色和形状特征确认并获取汽车的车牌位置;
字符分割是将获取到的车牌切割成单个字符;
字符识别目前主要有基于模板匹配算法和基于人工神经网络算法对切割的字符进行识别。

本节内容主要讲解车牌定位,主要内容有:

读取图像预处理边缘检测形态学操作定位裁剪

主函数代码如下 :

// main.m
close all;
clear all
clc
[fn,pn,fi] = uigetfile('*.jpg','请选择所要识别的图片');        %1.读取图像
I = imread([pn fn]); % 读取图像 参数为图像名称和图像路径
figure('name','原始图像'), imshow(I);
title('原始图像'); %显示原始图像
Ia = Yuchuli_Caitu(I);                                     %2.进行预处理
Ib = Bianyuanjiance_Tu(Ia);                                  %3.边缘检测
Ic = Xingtaixue_Tu(Ib);                    %4.形态学操作:腐蚀、平滑、擦除
bw = Ic;
[PY2,PY1,PX2,PX1]=Chepai_Dingwei(bw);                 %5.获取车牌边界信息
%获取车牌上下左右边界的位置信息
dw = I(PY1:PY2-8,PX1:PX2,:);                                %6.裁剪车牌
figure('name','定位剪切后的彩色车牌图像'),imshow(dw);
title('定位剪切后的彩色车牌图像');
1.读取图像

读取原始图像,这里采用的是[fn,pn,fi] = uigetfile函数,可用于直接弹出对话框的选择图片,比较方便。
fn表示图片的名字,pn表示图片的路径,fi表示选择的文件类型

// 读取原始图像
[fn,pn,fi] = uigetfile('*.jpg','请选择所要识别的图片');
I = imread([pn fn]); % 读取图像 参数为图像名称和图像路径
figure('name','原始图像'), imshow(I);
title('原始图像'); %显示原始图像
2.预处理

灰度处理

I1 = imadjust(I1,[0.3,0.7],[]);
% 表示I显示在J中的像素值范围为0.3到0.8,而且0.3在J中对应0.2,0.8在J中对应0.9; I中小于0.3的也都在J中用0.2表示,高于0.8的像素在J中都用0.9表示;

滤波处理,滤波处理采用中值滤波

I1 = medfilt2(I1);

// 预处理
function Ia = Yuchuli_Caitu(I)
I1 = rgb2gray(I);                                    %1.RGB图像转灰度图像
I1 = imadjust(I1,[0.3,0.7],[]);
figure('name','预处理后的图片'),subplot(231),imshow(I1);
title('灰度处理后的灰度图');
subplot(122),imhist(I1);
title('灰度处理后的灰度图直方图');
%-------中值滤波
I1 = medfilt2(I1);                                          %2.中值滤波
subplot(232),imshow(I1);title('中值滤波');
Ia = I1;
end
3.边缘检测

采用roberts算子边缘检测

I2 = edge(Ia,‘roberts’,0.25,‘both’);
%边缘检测算法,强度小于阈值0.15的边缘被省略掉,'both’两个方向检测(缺省默认)

//边缘检测
function Ib = Bianyuanjiance_Tu(Ia)
I2 = edge(Ia,'roberts',0.25,'both');                          %3.边缘检测
%figure('name','边缘检测'),
subplot(233),imshow(I2);title('robert算子边缘检测')
Ib = I2;
end
4.形态学操作

腐蚀imrode、平滑imclose、擦除bwareaopen

// 腐蚀、平滑、擦除
function Ic = Xingtaixue_Tu(Ib)
se = [1;1;1];%设置结构元素对象
I3 = imerode(Ib,se);                                         %4.腐蚀图像
% 腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象
%figure('name','腐蚀后图像'),
subplot(234),imshow(I3);title('腐蚀后的图像');
se = strel('rectangle',[20,20]);
%strel(shape,parameters):shape为形状参数;parameters为控制形状大小参数
I4 = imclose(I3,se);                                        %5.平滑处理
%用25*25的矩形对图像进行闭运算(先膨胀后腐蚀)有平滑边界作用
%该函数功能是对灰度图像执行形态学闭运算
%figure('name','平滑处理'),
subplot(235),imshow(I4);title('平滑图像的轮廓');
I5 = bwareaopen(I4,2000);                                      %6.擦除
% 从二进制图像中移除所有少于2000像素的连接对象,消失的是连续的白色像素数量少于2000的字符
%figure('name','擦除'),
subplot(236),imshow(I5);title('擦除');
Ic = I5;
end
5.定位

采用的是对蓝色像素点的采集判断,因为就中国地区而言绝大部分车牌的底色的蓝色的,虽然算法很快很识别出大区域蓝色,但缺点在于对蓝色车辆的车牌识别不是很好。

//定位:适用非蓝色车辆
function [PY2,PY1,PX2,PX1]=Chepai_Dingwei(bw)
%并得到车牌的上边界PY1、下边界PY2、左边界PX1、右边界 PX2
[y,x,z]=size(bw);% size(A) 反回矩阵行数/列数/片数          %1.读取bw的size
myI=double(bw);                                  %2.将bw数据转换成双精度型

%====================== Y 方向====================    %3.获取车牌上下边界
Blue_y=zeros(y,1); %创建列向量y*1
% zeros(M,N) 表示的是M行*N列的全0矩阵
for i=1:y                                        %% a.统计每行蓝色像素点数
for j=1:x
if(myI(i,j,1)==1) %针对预处理后图像的判断蓝色像素
% if((I(i,j,1)<=48)&&((I(i,j,2)<=100)&&(I(i,j,2)>=40))&&((I(i,j,3)<=200)&&(I(i,j,3)>=80)))
% 此蓝色像素点的判断语句,是针对原始图像;如用的话,需加输入参数I
Blue_y(i,1)= Blue_y(i,1)+1;     % 蓝色像素点统计
end
end
end
[temp MaxY]=max(Blue_y); % Y方向车牌区域确定 [temp MaxY]临时变量MaxY
%temp表示最多的点数,MaxY表示最多点数所在的行

if temp<=20    %若蓝色像素小于这个值,则代表  2048*1536  照相
msgbox('车牌定位出错','warning'); % 弹出对话框函数msgbox
pause;
end

PY1=MaxY;                                         %% b.寻找车牌上边界PY1
Y_threshlow=5;  %提取彩图的质量因子,阈值
while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1)) %如果蓝色像素点数大于阈值
PY1=PY1-1;                            %则上移
end
PY2=MaxY;                                         %% c.寻找车牌下边界PY2
while ((Blue_y(PY2,1)>=Y_threshlow)&&(PY2<y)) %并且保证不跳出图像自身大小
PY2=PY2+1;
end

%====================== X 方向====================   %4.获取车牌左右边界
Blue_x=zeros(1,x);   %创建行向量1*x                      %% 步骤参考Y方向
for j=1:x
for i=PY1:PY2  % 因为确定了上下界范围,因此只需要处理PY1:PY2范围
if(myI(i,j,1)==1) %针对预处理后图像的判断蓝色像素
% if((I(i,j,1)<=48)&&((I(i,j,2)<=100)&&(I(i,j,2)>=40))&&((I(i,j,3)<=200)&&(I(i,j,3)>=80)))
% 此蓝色像素点的判断语句,是针对原始图像;如用的话,需加输入参数I
Blue_x(1,j)= Blue_x(1,j)+1; % 蓝色像素点统计
end
end
end

PX1 = 1;                                          %% a. 寻找车牌左侧位置
X_threshlow = 5;  %提取彩图的质量因子,阈值
while ((Blue_x(1,PX1)<X_threshlow)&&(PX1<x))
PX1 = PX1+1;
end
PX2 = x;                                          %% b. 寻找车牌右侧位置
while ((Blue_x(1,PX2)<3)&&(PX2>PX1))
PX2 = PX2-1;
end
%======================修正====================      %5.对车牌边界修正
X_firrectify=5;    %干扰因子
Y_firrectify=fix((PY2-PY1)/5); %取整,车牌区域修正系数
%fit为取整函数
PY1=PY1-Y_firrectify;%对车牌区域的修正,向上
PY2=PY2+Y_firrectify;%对车牌区域的修正,向下
PX1=PX1-X_firrectify;% 对车牌区域的修正
PX2=PX2+X_firrectify;% 对车牌区域的修正,
end
6.裁剪

对定位好的车牌进行裁剪,以便接下来的字符分割操作

dw = I(PY1:PY2-8,PX1:PX2,:);                                   %6.裁剪车牌
figure('name','定位剪切后的彩色车牌图像'),imshow(dw);
title('定位剪切后的彩色车牌图像')

图像处理过程:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: