隨這圖形影像技術的發展,現在的車牌識別技術準確率越來越高,識別速度越來越快,無論何種形式的車牌識別系統,它們都是由觸發、影像采集、影像識別模塊、輔助光源和通信模塊組成的,車牌識別系統涉及光學、電器、電子控制、數字影像處理、計算視覺、人工智能等多項技術,觸發模塊負責在車輛到達合適位置時,給出觸發信號,控制抓拍,輔助光源提供輔助照明,保證系統在不同的光照條件下都能拍攝到高質量的影像,影像預處理程式對抓拍的影像進行處理,去除噪聲,并進行引數調整,然后通過車牌定位、字符識別,最后將識別結果輸出,
牌照自動識別是一項利用車輛的動態視頻或靜態影像進行牌照號碼、牌照顏色自動識別的模式識別技術,其硬體基礎一般包括觸發設備、攝像設備、照明設備、影像采集設備、識別車牌號碼的處理機等,其軟體核心包括車牌定位演算法、車牌字符分割演算法和光學字符識別演算法等,某些牌照識別系統還具有通過視頻影像判斷車輛駛入視野的功能稱之為視頻車輛檢測,一個完整的牌照識別系統應包括車輛檢測、影像采集、牌照識別等幾部分,當車輛檢測部分檢測到車輛到達時觸發影像采集單元,采集當前的視頻影像,牌照識別單元對影像進行處理,定位出牌照位置,再將牌照中的字符分割出來進行識別,然后組成牌照號碼輸出,

牌照號碼、顏色識別
為了進行牌照識別,需要以下幾個基本的步驟:
a.牌照定位,定位圖片中的牌照位置;
b.牌照字符分割,把牌照中的字符分割出來;
c.牌照字符識別,把分割好的字符進行識別,最終組成牌照號碼,
牌照識別程序中,牌照顏色的識別依據演算法不同,可能在上述不同步驟實作,通常與牌照識別互相配合、互相驗證,
(1)牌照定位:
自然環境下,汽車影像背景復雜、光照不均勻,如何在自然背景中準確地確定牌照區域是整個識別程序的關鍵,首先對采集到的視頻影像進行大范圍相關搜索,找到符合汽車牌照特征的若干區域作為候選區,然后對這些侯選區域做進一步分析、評判,最后選定一個最佳的區域作為牌照區域,并將其從圖象中分割出來,
2.1輸入待處理的原始影像:
clear ;
close all;
%Step1 獲取影像 裝入待處理彩色影像并顯示原始影像
Scolor = imread('3.jpg');%imread函式讀取影像檔案
圖2.1原始影像
2.2影像的灰度化:
彩色影像包含著大量的顏色資訊,不但在存盤上開銷很大,而且在處理上也會降低系統的執行速度,因此在對影像進行識別等處理中經常將彩色影像轉變為灰度影像,以加快處理速度,由彩色轉換為灰度的程序叫做灰度化處理,選擇的標準是經過灰度變換后,像素的動態范圍增加,影像的對比度擴展,使影像變得更加清晰、細膩、容易識別,
%將彩色影像轉換為黑白并顯示
Sgray = rgb2gray(Scolor);%rgb2gray轉換成灰度圖
figure,imshow(Sgray),title('原始黑白影像');
圖2.2原始黑白影像
2.3對原始影像進行開操作得到影像背景影像:
s=strel('disk',13);%strei函式
Bgray=imopen(Sgray,s);%打開sgray s影像
figure,imshow(Bgray);title('背景影像');%輸出背景影像
圖2.3背景影像
2.4原始影像與背景影像作減法,對影像進行增強處理:
Egray=imsubtract(Sgray,Bgray);%兩幅圖相減
figure,imshow(Egray);title('增強黑白影像');%輸出黑白影像
圖2.4黑白影像
2.5取得最佳閾值,將影像二值化:
二值影像是指整幅影像畫面內僅黑、白二值的影像,在實際的車牌處理系統中,進行影像二值變換的關鍵是要確定合適的閥值,使得字符與背景能夠分割開來,二值變換的結果影像必須要具備良好的保形性,不丟掉有用的形狀資訊,不會產生額外的空缺等等,車牌識別系統要求處理的速度高、成本低、資訊量大,采用二值影像進行處理,能大大地提高處理效率,閾值處理的操作程序是先由用戶指定或通過演算法生成一個閾值,如果影像中某中像素的灰度值小于該閾值,則將該像素的灰度值設定為0或255,否則灰度值設定為255或0,
fmax1=double(max(max(Egray)));%egray的最大值并輸出雙精度型
fmin1=double(min(min(Egray)));%egray的最小值并輸出雙精度型
level=(fmax1-(fmax1-fmin1)/3)/255;%獲得最佳閾值
bw22=im2bw(Egray,level);%轉換影像為二進制影像
bw2=double(bw22);
figure,imshow(bw2);title('影像二值化');%得到二值影像
圖2.5二值影像
2.6邊緣檢測:
兩個具有不同灰度值的相鄰區域之間總存在邊緣,邊緣就是灰度值不連續的結果,是影像分割、紋理特征提取和形狀特征提取等影像分析的基礎,為了對有意義的邊緣點進行分類,與這個點相聯系的灰度級必須比在這一點的背景上變換更有效,我們通過門限方法來決定一個值是否有效,所以,如果一個點的二維一階導數比指定的門限大,我們就定義影像中的次點是一個邊緣點,一組這樣的依據事先定好的連接準則相連的邊緣點就定義為一條邊緣,經過一階的導數的邊緣檢測,所求的一階導數高于某個閾值,則確定該點為邊緣點,這樣會導致檢測的邊緣點太多,可以通過求梯度區域最大值對應的點,并認定為邊緣點,去除非區域最大值,可以檢測出精確的邊緣,一階導數的區域最大值對應二階導數的零交叉點,這樣通過找影像強度的二階導數餓的零交叉點就能找到精確邊緣點,
grd=edge(bw2,'canny')%用canny算子識別強度影像中的邊界
figure,imshow(grd);title('影像邊緣提取');%輸出影像邊緣
圖2.6像邊緣提取
2.7對得到影像作開操作進行濾波:
數學形態非線性濾波,可以用于抑制噪聲,進行特征提取、邊緣檢測、影像分割等影像處理問題,腐蝕是一種消除邊界點的程序,結果是使目標縮小,孔洞增大,因而可有效的消除孤立噪聲點;膨脹是將與目標物體接觸的所有背景點合并到物體中的程序,結果是使目標增大,孔洞縮小,可填補目標物體中的空洞,形成連通域,先腐蝕后膨脹的程序稱為開運算,它具有消除細小物體,并在纖細處分離物體和平滑較大物體邊界的作用;先膨脹后腐蝕的程序稱為閉運算,具有填充物體內細小空洞,連接鄰近物體和平滑邊界的作用,對影像做了開運算和閉運算,閉運算可以使影像的輪廓線更為光滑,它通常用來消掉狹窄的間斷和長細的鴻溝,消除小的孔洞,并彌補輪廓線中的斷裂,
bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的閉運算
figure,imshow(bg1);title('影像閉運算[5,19]');%輸出閉運算的影像
bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的開運算
figure,imshow(bg3);title('影像開運算[5,19]');%輸出開運算的影像
bg2=imopen(bg3,strel('rectangle',[19,1]));%取矩形框的開運算
figure,imshow(bg2);title('影像開運算[19,1]');%輸出開運算的影像
圖2.7.1閉運算的影像 圖2.7.2開運算的影像
圖2.7.3開運算的影像
2.8對二值影像進行區域提取,并計算區域特征引數,進行區域特征引數比較,提取車牌區域:
a.對影像每個區域進行標記,然后計算每個區域的影像特征引數:區域中心位置、最小包含矩形、面積,
[L,num] = bwlabel(bg2,8);%標注二進制影像中已連接的部分
Feastats = imfeature(L,'basic');%計算影像區域的特征尺寸
Area=[Feastats.Area];%區域面積
BoundingBox=[Feastats.BoundingBox];%[x y width height]車牌的框架大小
RGB = label2rgb(L, 'spring', 'k', 'shuffle'); %標志影像向RGB影像轉換
figure,imshow(RGB);title('影像彩色標記');%輸出框架的彩色影像
圖2.8.1彩色影像
b. 計算出包含所標記的區域的最小寬和高,并根據先驗知識,比較誰的寬高比更接近實際車牌寬高比,將更接近的提取并顯示出來,
|
計算矩形的高度
|
|
框架的寬度和高度的范圍 |
|
車牌的開始列 |
|
車牌的開始行 |
|
計算車牌長寬比 |
|
獲取車牌二值子圖 |
|
計算矩形的寬度 |
2.9對水平投影進行峰谷分析:
對水平投影進行峰谷分析,計算出車牌上邊框、車牌字符投影、車牌下邊框的波形峰上升點、峰下降點、峰寬、谷寬、峰間距離、峰中心位置引數,
histcol1=sum(sbw1); %計算垂直投影
histrow=sum(sbw1'); %計算水平投影
figure,subplot(2,1,1),bar(histcol1);title('垂直投影(含邊框)');%輸出垂直投影
subplot(2,1,2),bar(histrow); title('水平投影(含邊框)');%輸出水平投影

圖2.9.1垂直投影和水平投影
figure,subplot(2,1,1),bar(histrow); title('水平投影(含邊框)');%輸出水平投影
subplot(2,1,2),imshow(sbw1);title('車牌二值子圖');%輸出二值圖
%(2)線性擬合,計算與x夾角
fresult = fit(xdata',ydata','poly1'); %poly1 Y = p1*x+p2
p1=fresult.p1;
angle=atan(fresult.p1)*180/pi; %弧度換為度,360/2pi, pi=3.14
%(3)旋轉車牌圖象
subcol = imrotate(subcol1,angle,'bilinear','crop'); %旋轉車牌圖象
sbw = imrotate(sbw1,angle,'bilinear','crop');%旋轉影像
figure,subplot(2,1,1),imshow(subcol);title('車牌灰度子圖');%輸出車牌旋轉后的灰度影像標題顯示車牌灰度子圖
subplot(2,1,2),imshow(sbw);title('');%輸出車牌旋轉后的灰度影像
title(['車牌旋轉角: ',num2str(angle),'度'] ,'Color','r');%顯示車牌的旋轉角度

圖2.10.1旋轉后的灰度影像和旋轉角度
b.旋轉車牌后重新計算車牌水平投影,去掉車牌水平邊框,獲取字符高度:
histcol1=sum(sbw); %計算垂直投影
histrow=sum(sbw'); %計算水平投影
figure,subplot(2,1,1),bar(histcol1);title('垂直投影(旋轉后)');
subplot(2,1,2),bar(histrow); title('水平投影(旋轉后)');

圖2.10.2垂直投影(旋轉后)和水平投影(旋轉后)
figure,subplot(2,1,1),bar(histrow); title('水平投影(旋轉后)');
subplot(2,1,2),imshow(sbw);title('車牌二值子圖(旋轉后)');

圖2.10.3水平投影(旋轉后)和車牌二值子圖(旋轉后)
2.11去水平(上下)邊框,獲取字符高度:
a.通過以上水平投影、垂直投影分析計算,獲得了車牌字符高度、字符頂行與尾行、字符寬度、每個字符的中心位置,為提取分割字符具備了條件,
maxhight=max(markrow2);
findc=find(markrow2==maxhight);
rowtop=markrow(findc);
rowbot=markrow(findc+1)-markrow1(findc+1);
sbw2=sbw(rowtop:rowbot,:); %子圖為(rowbot-rowtop+1)行
maxhight=rowbot-rowtop+1; %字符高度(rowbot-rowtop+1)
b.計算車牌垂直投影,去掉車牌垂直邊框,獲取車牌及字符平均寬度
histcol=sum(sbw2); %計算垂直投影
figure,subplot(2,1,1),bar(histcol);title('垂直投影(去水平邊框后)');%輸出車牌的垂直投影影像
subplot(2,1,2),imshow(sbw2); %輸出垂直投影影像
title(['車牌字符高度: ',int2str(maxhight)],'Color','r');%輸出車牌字符高度
%對垂直投影進行峰谷分析
c.計算車牌上每個字符中心位置,計算最大字符寬度maxwidth
l=0;
for k=1:n1
markcol3(k)=markcol(k+1)-markcol1(k+1);%字符下降點
markcol4(k)=markcol3(k)-markcol(k); %字符寬度(上升點至下降點)
markcol5(k)=markcol3(k)-double(uint16(markcol4(k)/2));%字符中心位置
end
markcol6=diff(markcol5); %字符中心距離(字符中心點至下一個字符中心點)
maxs=max(markcol6); %查找最大值,即為第二字符與第三字符中心距離
findmax=find(markcol6==maxs);
markcol6(findmax)=0;
maxwidth=max(markcol6);%查找最大值,即為最大字符寬度
d.提取分割字符,并變換為22行*14列標準子圖
l=1;
[m2,n2]=size(subcol);
figure;
for k=findmax-1:findmax+5
cleft=markcol5(k)-maxwidth/2;
cright=markcol5(k)+maxwidth/2-2;
if cleft<1
cleft=1;
cright=maxwidth;
end
if cright>n2
cright=n2;
cleft=n2-maxwidth;
end
SegGray=sbw(rowtop:rowbot,cleft:cright);
SegBw1=sbw(rowtop:rowbot,cleft:cright);
SegBw2 = imresize(SegBw1,[22 14]); %變換為32行*16列標準子圖
subplot(2,n1,l),imshow(SegGray);
if l==7
title(['車牌字符寬度: ',int2str(maxwidth)],'Color','r');
end
subplot(2,n1,n1+l),imshow(SegBw2);
fname=strcat('F:\MATLAB\work\sam\image',int2str(k),'.jpg');%保存子圖備選入樣本庫,并建立樣本庫
imwrite(SegBw2,fname,'jpg')
l=l+1;
end
2.12將計算計算獲取的字符影像與樣本庫進行匹配,自動識別出字符代碼:
進行車牌識別前需要使用樣本對神經網路進行訓練,然后使用訓練好的網路對車牌進行識別,其具體流程為:使用漢字、字母、字母數字、數字四個樣本分別對四個子網路進行訓練,得到相應的節點數和權值,對已經定位好的車牌進行影像預處理,逐個的特征提取,然后從相應的檔案中讀取相應的節點數和權值,把車牌字符分別送入相應的網路進行識別,輸出識別結果,
|
樣本與資料庫中圖片相減 |
|
計算誤差 |
|
找到誤差最小圖片 |
|
依次識別并識別 |
|
建立資料庫 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/154069.html
標籤:其他
