車牌提取
寫在前面的話:python中有很多腐蝕膨脹的整合庫,cv2還是最常用的。這篇文章僅是從底層原理去理解這麼做的意義,供學習理解使用。
簡單介紹一下本節,主要是用python繼續對進行預處理,主要是腐蝕膨脹 還有這節就把車牌直接提取 出來啦!!!
常用庫就…
path =
'./huiimg.png'
im = image.
open
(path)
.convert(
'l')
plt.imshow(im)
# 轉換為陣列
im_array = np.array(im)
width, height = im_array.shape
粗略的說,腐蝕可以使目標區域範圍「變小」,其實質造成影象的邊界收縮,可以用來消除小且無意義的目標物。式子表達為:
式子表示用結構b腐蝕a,需要注意的是b中需要定義乙個原點,【而b的移動的過程與卷積核移動的過程一致,同卷積核與影象有重疊之後再計算一樣】當b的原點平移到影象a的像元(x,y)時,如果b在(x,y)處,完全被包含在影象a重疊的區域,(也就是b中為1的元素位置上對應的a影象值全部也為1)則將輸出影象對應的像元(x,y)賦值為1,否則賦值為0。
def
erosion
(ima,w,h)
: imb = np.copy(ima)
for rept in
range(5
):for i in
range(1
,w-1):
for j in
range(1
,h-1):
if(ima[i,j]
==255):
flag =
0for m in
range(-
1,2)
:for n in
range(-
1,2)
:if(ima[i+m,j+n]==0
):flag +=1if
(flag >3)
: imb[i,j]=0
return imb
粗略地說,膨脹會使目標區域範圍 「變大」,將於目標區域接觸的背景點合併到該目標物中,使目標邊界向外部擴張。作用就是可以用來填補目標區域中某些空洞以及消除包含在目標區域中的小顆粒雜訊。
結構b膨脹a,將結構元素b的原點平移到影象像元(x,y)位置。如果b在影象像元(x,y)處與a的交集不為空(也就是b中為1的元素位置上對應a的影象值至少有乙個為1),則輸出影象對應的像元(x,y)賦值為1,否則賦值為0。
def
dilation
(ima,w,h)
: imb = np.copy(ima)
for rept in
range(5
):for i in
range(1
,w-1):
for j in
range(1
,h-1):
if(ima[i,j]==0
):flag =
0for m in
range(-
1,2)
:for n in
range(-
1,2)
:if(ima[i+m,j+n]
==255):
flag +=
1break
# 詞出表明只要周圍有1個白色那麼原點就變為白色
if(flag >0)
: imb[i,j]
=255
return imb
開運算 = 先腐蝕運算,再膨脹運算(看上去把細微連在一起的兩塊目標分開了)
閉運算 = 先膨脹運算,再腐蝕運算(看上去將兩個細微連線的圖塊封閉在一起)
此部分直接將車牌給截出來,先介紹第一種方法
i. 我們先統計出畫素值為0的最大行以及最大列的畫素個數。我們設定比較值為1/3最大值。即大於找到第一行及最後一行大於這個值得行數,以及第一列和最後一列大於這個值得列數。我們再設定乙個閾值thred,則得出了行及列的標號。
'''
定位, y為行,x為列
'''def
get_location
(w, h, thred)
: temp = np.zeros(
(400,1
))flag =
0# 找出一行的最大值
for i in
range
(w):
temp[i]=0
for j in
range
(h):
if imb_array[i,j]
==255
: temp[i]+=1
maxnum =
(temp.
max())
/3for i in
range
(w):
if flag ==0:
if temp[i]
> maxnum:
y1 = i - thred
flag =
1if flag ==1:
if temp[i]==0
: y2 = i + thred
flag =
0break
# 找出一列
for i in
range
(h):
temp[i]=0
for j in
range
(w):
if imb_array[j,i]
==255
: temp[i]+=1
maxnum =
(temp.
max())
/3for i in
range
(h):
if flag ==0:
if temp[i]
> maxnum:
x1 = i - thred
flag =
1if flag ==1:
if temp[i]==0
: x2 = i + thred
flag =
0break
return x1,x2,y1,y2
得出結果:
vl, vh, hl, hh = get_location(new_w, new_h,0)
print
(vl, vh, hl, hh)
c_w = vh - vl
c_h = hh - hl
print
(c_w, c_h)
180 270 195 220將它截出來,一起來看效果圖吧!很nice!90 25
大家注意一下,我這張圖傳參0,並不代表這個值是合適的,最好取大一些,因為會有傾斜等等特殊狀況
就是我們要的圖啦,放張對比圖吧
接下來就是分割字串啦,且聽下回分解~
ii. 這裡介紹第二種方法
車牌由七個字元組成,在對候選區域對應的灰度化影象進行邊緣檢測二值化之後,正常情況下,在車牌水平投影區域內會出現較大的波峰,該波峰認為是車牌的上下邊界.
一般取15較合適,從上下左右四個方向分別遍歷,分別取出相應符合條件的行和列即可
p.s. 由於最近忙考試,這部分沒有去改,放上一部分c的**,其基本原理與上相差不多,效果的話也需要去用實踐去檢驗,畢竟實踐是檢驗真理的唯一標準嘛!
if
(outimg[i*width+j-15]
==0&& outimg[i*width+j-14]
==255
&& outimg[i*width+j]
==255
)
下一節直接分割字串~ Python OpenCV 車牌定位 橫向定位
一.原理 通過對已經縱向定位的車牌進行視窗搜尋,滑動視窗,遍歷視窗內的每一行的跳變點數,若符合則加入候選區域,若最後候選區域為0,則將的高度縮減,因為在進行縱向定位時,背景的變化造成的灰度跳變數也可能大於14 若最後候選區域數大於1,將視窗寬度減少,直到候選區域只有乙個。但該方法的車牌定位時間較長。...
複雜背景車牌定位
由於車牌號碼多為垂直數字,而車身引入的干擾在水平方向,進行垂直邊緣檢測,即可去除水平方向上顏色區別較大的干擾。該演算法核心之處在於利用了車牌號碼與車身干擾正好垂直的特點,僅在垂直方向檢測邊緣,而對水平的邊緣則不予理會。垂直邊緣檢測,可用 roberts 運算元 sobel 運算元 prewitt 運...
車牌定位方法 matlab
此車牌定位法採用的是 邊緣檢測 形態 算的方法。缺點 此方法對於車輛牌照周圍灰度變化劇烈的情況容易定位錯誤。function dw location i 車牌定位方法 i1 rgb2gray i 灰度化 i2 edge i1,robert 邊緣檢測 imshow i2 se 1 1 1 列腐蝕運算元...