原理步骤
1.图像预处理
包括二值化和去噪两部分。
图像二值化:应用领域很广泛,称为处理过程中的一个基本手段。
二值化阈值几种常用的选取方法:双峰{2-Mode}法,P参数法,Otsu法,迭代法等。本次课程设计采用的方法为迭代法。
迭代法是一种全局二值化方法,它要求图像分割阈值的算法是基于逼近的思想,首先选择一个近似阈值作为估计值的初始值,然后进行分割,产生子图像,并根据子图像的特性来选取新的阈值,再利用新的阈值分割图像,经过几次循环,使错误分割的图像像素点降到最少。这样做的效果好于用初始阈值直接分割图像的效果。具体算法步骤如下所述:
(1)求出图像中的最小灰度值和最大灰度值,分别记为Zmin和Zmax,则阈值初值T0=(Zmin+Zmax)/2;
(2)根据阈值TK将图像分割成目标和背景两部分,求出两部分的平均灰度值Z0和Z1,平均灰度值等于=å(灰度值*该灰度值的权重)/像素点的总数;
(3)求出新阈值T1=(Z0+Z1)/2;
(4)如果T0=T1,则结束,否则将TI的值赋予T0,转向(2)
去噪方法:
(1)求当前像素点NN邻域像素的平均值,若超过阈值,则将对应像素点置为白色(目标色),否则置为黑色(背景色);
(2)循环图像的每一个像素值;
(3)计算像素周围的33邻域的8个像素的均值;
(4)比较均值与给定阈值的大小,若大于阈值则置为对应像素为白,反之置黑。
2.对车牌定位
横向扫描确定上下边界。
理论依据:
车牌区域所在行相邻像素之间的变化(0->255、225->0)会
很频繁。
连续变化的行超过一定宽度,根据宽度排除一些广告、商标
等图案的干扰。
纵向扫描初步确定车牌的左、右边界。
实现步骤:
(1)计算车牌高度
(2)纵向扫描,记录每一列白像素点的个数,若某一列i的白像素点数大于一定值,且满足条件连续列的宽度大于一定值,则认为第i列为车牌的左边界。
(3)根据车牌的宽高比例计算车牌的右边界。
3.对车牌进行字符分割
任务:把单个字符从车牌字符串中分离出来。
根据车牌特征信息排除干扰:
(1)排除尺寸大小或长宽比例不符合车牌字符特征的连通域u,滤除大部分噪声点的干扰;
(2)确定车牌字符精确的起始行与结束行位置,排除螺钉对第二和第六个字符的干扰;
(3)充分利用车牌字符的位置和顺序信息,查找连通域漏检的字符,排除干扰区域。
字符分割方法:
垂直投影法,利用字与字之间形成的空白间隔将单个字符的图像切割出来的。
单纯的垂直投影造成的两个难题:粘连字没有分开,二分字和三分字没有合并。根据字符的高宽比有一定的范围。
对粘连字:估计出下一个字符的大致位置。
对多分字:以估计的宽度合并宽度较小的字。
字符细化方法:对图像进行多次迭代细化直到不存在可以消去的简单边界点为止。
归一化:
在车牌字符中,字符的宽度是不确定的,如字符“1”和“0”,
但字符的高度均相同,因此,可根据字符的高度来进行大小归一化。
归一化方法:将字符的外边框按比例线性放大或缩小到标准字符尺寸。根据给定的高度与提取车牌的高度计算缩放的比例,宽度与高度同比例缩放。
4.对车牌字符进行识别
模板匹配法:
首先把待识别字符二值化,并将其尺寸大小缩放为数据库中模板的大
小,然后与所有的模板进行匹配,最后选最佳匹配作为结果。
matlab实现
-
图形用户界面创建: guide
-
Gui_cpsb代码:
function varargout = Gui_cpsb(varargin)
% GUI_CPSB MATLAB code for Gui_cpsb.fig
% GUI_CPSB, by itself, creates a new GUI_CPSB or raises the existing
% singleton*.
%
% H = GUI_CPSB returns the handle to a new GUI_CPSB or the handle to
% the existing singleton*.
%
% GUI_CPSB('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in GUI_CPSB.M with the given input arguments.
%
% GUI_CPSB('Property','Value',...) creates a new GUI_CPSB or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before Gui_cpsb_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to Gui_cpsb_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help Gui_cpsb
% Last Modified by GUIDE v2.5 30-May-2020 14:55:05
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Gui_cpsb_OpeningFcn, ...
'gui_OutputFcn', @Gui_cpsb_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{
1})
gui_State.gui_Callback = str2func(varargin{
1});
end
if nargout
[varargout{
1:nargout}] = gui_mainfcn(gui_State, varargin{
:});
else
gui_mainfcn(gui_State, varargin{
:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before Gui_cpsb is made visible.
function Gui_cpsb_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to Gui_cpsb (see VARARGIN)
clc;warning off all;%清除
% Choose default command line output for Gui_cpsb
handles.output = hObject;
handles.imgfilename=[];%图像文件名
handles.imgdata=[];%彩色图像数据信息
handles.imgoutputhuidu=[];%灰度化图像输出信息
handles.imgoutputerzhi=[];%二值化图像输出信息
handles.imgoutputquzao=[];%去噪图像输出信息
handles.imgoutputdingwei=[];%定位图像输出信息
handles.imgoutput1=[];
handles.imgoutput2=[];
handles.imgoutput3=[];
handles.imgoutput4=[];
handles.imgoutput5=[];
handles.imgoutput6=