一、模闆比對車牌識别簡介
1 系統整體設計
車牌識别系統包括4個步驟:車牌定位 (包括識别圖像中的車牌位置并将其分割) 、圖像處理、字元分割與字元識别, 如圖1所示。車牌定位的主要功能是從圖像中可能包含車牌的候選區域中定位車牌區域;圖像處理的功能是強化車牌關鍵特征;字元分割的功能是将車牌字元從檢測到的車牌區域背景中分離出來;字元識别的功能是用已知字元識别分割得到的字元。
圖1 車牌識别系統
2 車牌定位算法
車牌定位是車牌識别算法的第一步。顔色特征在定位和識别系統中起着重要作用, 車牌區域的顔色具有顯著特征。采用橫向掃描和縱向掃描的車牌定位算法。車牌區域的搜尋有時會受車輛本身一些廣告和商标等圖案的幹擾, 而車牌區域在圖像中的位置一般比這些幹擾所在的位置低。是以, 通過從下至上搜尋車牌區域可有效地減少這些幹擾。掃描得出的區域可能不止一個, 再根據該區域的長寬比例和藍白色的比例, 驗證是否為車牌區域。車牌區域定位和分割過程通過顔色範圍定義、行列掃描的方式實作。Y方向對應行, X方向對應列, 具體過程如下:
(1) Y方向:對每一個像素進行分析, 統計滿足條件的像素所在行對應的個數。找到所有藍點較多的行, 向上追溯, 直到車牌候選區域上邊界PY1;向下追溯, 直到車牌區域下邊界PY2, 對車牌區域進行修正, 得到Y方向的車牌候選區域。
(2) X方向:統計滿足條件的像素所在列對應的個數。找到車牌候選區域的左邊界PX1和右邊界PX2, 對候選區域進行修正。
(3) 同理提取其餘藍色點較多的區域, 标記為車牌候選區域, 這些區域包括了車牌區域和非車牌區域。
(4) 統計車牌候選區域中的白色像素點。
(5) 計算車牌候選區域寬度和高度之間的比率, 選擇具有滿足預定義限制寬高比的候選區域。根據我國小型汽車的車牌特征為藍底白字白框線, 長寬标準為440mm*140mm, 考慮到拍攝角度及傾斜等因素, 長寬比例範圍通常為1.3~3.5, 白色比例範圍通常為0.12~0.5。
(6) 根據長寬比例和白色比例, 淘汰其餘車牌候選區域, 實作對車牌的最終定位。
(7) 分割車牌區域。車牌定位和分割結果如圖2所示, 圖2 (a) 為車輛圖像, 圖2 (b) 為車牌分割結果。
圖2 車牌定位效果3 車牌圖像處理
3.1 圖像灰階化
道路監控錄影機抓拍的圖像一般為RGB真彩圖像, 在RGB格式中, 每個像素有3個顔色分量:紅, 綠, 藍。車牌圖像的每個像素由3個值确定紅綠藍分量。在RGB模型中, 當R=G=B為灰階色。灰階圖像保持了強度資訊而沒有顔色資訊。采用權重平均值法對RGB進行灰階化, 得到灰階圖的亮度值。設定合理的權值能較好地突出灰階圖亮度。任意一種顔色可表示為:
系數r、g、b分别為紅綠藍權值, 這裡r=0.299, g=0.587, b=0.114, 能獲得适合人眼觀察的灰階圖像, 如圖3所示。
圖3 灰階圖像3.2 傾斜校正
在車牌識别過程中, 車牌傾斜對車牌字元分割與最終識别結果有着顯著影響。由于拍攝角度、車輛狀态及道路狀況等原因影響, 如在抓拍中圖像位置不固定, 車頭或鏡頭出現晃動及路況較差, 都會造成牌照中的字元傾斜, 給字元的分割和識别增加難度。是以, 需對定位後的車牌進行矯正。采用Radon變換方法進行車牌圖像傾斜矯正, 原理是将圖像朝着各個方向投影, 然後分析投影特征, 确定車牌傾斜角度。
圖4 傾斜校正3.3 圖像二值化
二值圖像是指整幅圖像畫面内僅有黑白二值的圖像。灰階圖像二值化不僅可大幅度減少資料運算量, 并能有效突出目标輪廓, 以便後續處理。在車牌進行中, 二值化處理是将像素點的灰階設定為0或255, 使車牌區域呈現黑白效果。對灰階圖像設定合理門檻值, 能夠有效保持車牌形狀資訊。車牌區域二值化過程後, 僅保留黑白二值的數值矩陣, 每個像素取兩個離散數值0或1, 0為黑色, 1為白色, 如圖5所示。
圖5 二值圖像
f (i, j) 為原圖像上的像素值, b (i, j) 為二值化後圖像的像素值, T為門檻值。
3.4 多餘成分去除
經過圖像二值化取反後, 車牌圖像上可能出現一些較為明顯的孤立像素點或像素塊, 會對車牌的識别造成幹擾。為了有效地儲存目标車牌的形狀、大小及特定的幾何特征, 需要去除車牌圖像中的多餘成分。首先對二值圖像取反, 求反變換使圖像中感興趣的細節更容易被注意到, 如圖6所示。
圖6 二值圖像取反然後對圖像作進一步裁剪, 使邊框進一步貼近字型, 如圖7所示。
圖7 圖像裁剪4 字元分割
經過圖像處理後的車牌整體區域需要分割成單個字元區域, 以便後續識别。投影是有用且緊湊的形狀描述符, 通過計算水準垂直峰分割所有字元[9]。一個二值目标的水準投影和垂直投影分别為hi (x) 和vi (y) , 可使用以下公式求得:
如圖8顯示一個垂直投影, 利用獨立的7個峰提取7個車牌字元, 圖9為字元分割結果。
圖8 垂直投影7個獨立峰
圖9 字元分割
車牌字元分割後往往會出現大小不一的情況, 可采用基于圖像縮放的歸一化處理方式将字元圖像進行尺寸縮放, 以得到大小統一的字元圖像, 便于後續的字元識别。
5 字元識别
5.1 字元識别簡述
常用的車牌字元識别方法有以下幾類:
(1) 結構識别。該方法主要由識别和分析兩部分構成:識别部分主要包括預處理、基元抽取和特征分析;分析部分包括基元選擇與結構推理。
(2) 統計識别。該方法的目的在于确定已知樣本的所屬類别, 以數學的決策論為理論基礎, 建立統計學識别模型。
(3) BP神經網絡。該方法以神經網絡模型為基礎, 屬于誤差後向傳播的神經網絡, 是神經網絡中使用最廣泛的一類, 通過輸入層、隐層和輸入層三層網絡的層間全互聯方式運作, 具有較高的運作效率和識别準确率。
(4) 模闆比對。該方法是數字圖像進行中最常用的識别方法之一, 通過建立已知模闆庫, 再将其應用到輸入模式中, 尋找與之為最佳比對模式的處理步驟, 得到相應識别結果, 具有很高的運作效率。
5.2 基于模闆比對的字元識别
由于車牌字元是以規範的字元為基礎的, 模闆比對是以字元整體相關性為基礎的, 并不強求字元整體結構的完整性。是以, 模闆比對法具有較強的容錯能力, 适合有較強幹擾的場合。
由于前期字元的有效分割, 這裡采用簡單模版比對算法。該算法十分簡單, 對圖像噪聲敏感性較低, 識别率較高。
模闆比對是圖像識别方法中具有代表性的方法之一, 該方法首先根據已知條件建立模闆庫, 将分割出的車牌字元與字元模闆庫中的字元進行比對運算, 圖像與模闆之間的比對程度通過互相關算子确定:
Ri (x, y) 為互相關算子, F為待檢測圖像, Fxy為待檢測的圖像子圖, x、y為子圖左上角點在F中的坐标, T為模闆, 互相關算子最大對應的模闆為最佳比對模闆。字元識别流程如圖10所示。
圖1 0 字元識别流程
具體過程如下:
(1) 建庫。建立标準化的字元模闆庫。如圖11所示。
(2) 周遊字元模闆。
(3) 比對。将分割的字元圖像與模闆庫中的字元進行對比, 根據藍底白字号牌的特點, 第1位字元是漢字, 分别代表各個省份, 第2位是A~Z的字母, 後5位是數字和字母的混合搭配。為提高比對過程的效率和準确性, 分别對第1位、第2位和後5位字元進行識别。
(4) 将每個字元圖像的比對結果進行儲存。
(5) 輸出。
二、部分源代碼
function varargout = Gui_Main(varargin)
%%%%%%%%%運作這個即可打開《車牌識别系統》%%%%%%%%
%GUI_MAIN MATLAB code for Gui_Main.fig
% GUI_MAIN, by itself, creates a new GUI_MAIN or raises the existing
% singleton*.
%
% H = GUI_MAIN returns the handle to a new GUI_MAIN or the handle to
% the existing singleton*.
%
% GUI_MAIN(‘CALLBACK’,hObject,eventData,handles,…) calls the local
% function named CALLBACK in GUI_MAIN.M with the given input arguments.
%
% GUI_MAIN(‘Property’,‘Value’,…) creates a new GUI_MAIN or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before Gui_Main_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to Gui_Main_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_Main
% Last Modified by GUIDE v2.5 27-May-2022 18:45:00
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct(‘gui_Name’, mfilename, …
‘gui_Singleton’, gui_Singleton, …
‘gui_OpeningFcn’, @Gui_Main_OpeningFcn, …
‘gui_OutputFcn’, @Gui_Main_OutputFcn, …
‘gui_LayoutFcn’, [] , …
‘gui_Callback’, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
endif 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_Main is made visible.
function Gui_Main_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_Main (see VARARGIN)% Choose default command line output for Gui_Main
clc;
axes(handles.axes1); cla reset; box on; set(gca, ‘XTickLabel’, [], ‘YTickLabel’, []);
axes(handles.axes2); cla reset; box on; set(gca, ‘XTickLabel’, [], ‘YTickLabel’, []);
axes(handles.axes3); cla reset; box on; set(gca, ‘XTickLabel’, [], ‘YTickLabel’, []);
axes(handles.axes4); cla reset; box on; set(gca, ‘XTickLabel’, [], ‘YTickLabel’, []);
set(handles.text1, ‘string’, ‘’);
handles.output = hObject;
handles.file = [];
handles.Plate = [];
handles.bw = [];
handles.words = [];
% Update handles structure
handles.type=1;%打開時,預設識别藍色車牌
guidata(hObject, handles);% UIWAIT makes Gui_Main wait for user response (see UIRESUME)
% uiwait(handles.figure1);% — Outputs from this function are returned to the command line.
function varargout = Gui_Main_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --------------------------------------------------------------------
%工具欄:Save Figure
function uipushtool1_ClickedCallback(hObject, eventdata, handles)
% hObject handle to uipushtool1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uiputfile({’.jpg;.tif;.png;.gif’,‘All Image Files’;…
‘.’,‘All Files’ }, ‘儲存結果’, …
‘Result\result.jpg’);
if isempty(filename)
return;
end
file = fullfile(pathname, filename);
f = getframe(gcf);
f = frame2im(f);
imwrite(f, file);
msgbox(‘儲存結果圖像成功!’, ‘提示資訊’, ‘help’);
三、運作結果
四、matlab版本及參考文獻
1 matlab版本
2014a