車牌、驗證碼識別的普通方法為:
1.將灰度化與二值化。
2.去噪,然後切割成乙個乙個的字元。
3.提取每乙個字元的特徵,生成特徵向量或特徵矩陣。
4.分類與學習。將特徵向量或特徵矩陣與樣本庫進行比對,挑選出相似的那類樣本,將這類樣本的值作為輸出結果。
下面藉著**,描述一下上述過程。
1.的灰度化與二值化
這樣做的目的是將的每乙個象素變成0或者255,以便以計算。同時,也可以去除部分噪音。的灰度化與二值化的前提是bmp,如果不是,則需要首先轉換為bmp。
1protected
static
color gray(color c)26
通過將灰度化,每乙個象素就變成了乙個
0-255
的灰度值。
然後是將灰度值二值化為 0 或255。一般的處理方法是設定乙個區間,比如,[a,b],將[a,b]之間的灰度全部變成255,其它的變成0。這裡我採用的是網上廣為流行的自適應二值化演算法。
1public
static
void
binarizate(bitmap map)214
else
1518}19
}20}21
22private
static
intcomputethresholdvalue(bitmap img)
2333
intgmin
=0xff;34
intgmax =0
;35for(i =1
; i
<
(img.width -1
); i++)
3645
if(cn
<
gmin)
4649}50
}51double
sum
=csum
=0.0;52
intn =0
;53for(k =0
; k
<=
0xff
; k++)54
58if
(n ==0)
5962
double
fmax =-
1.0;
63int
n1 =0;
64for
(k =
0; k
<
0xff
; k++)65
74csum
+=k
*ihist[k];
75double
m1 =
csum /((
double
) n1);
76double
m2 =
(sum
-csum) /((
double
) n2);
77double
sb =
((n1
*n2)
*(m1
-m2))
*(m1
-m2);
78if
(sb
>
fmax)
7983}84
}85return
thresholdvalue;
86}
87灰度化與二值化之前的:
灰度化與二值化之後的:
注:對於車牌識別來說,這個演算法還不錯。對於驗證碼識別,可能需要針對特定的**設計特殊的二值化演算法,以過濾雜色。
2.去噪,然後切割成乙個乙個的字元
上面這張車牌切割是比較簡單的,從左到右掃瞄一下,碰見空大的,咔嚓一刀,就解決了。但有一些車牌,比如這張:
簡單的掃瞄就解決不了。因此需要乙個比較通用的去噪和切割演算法。這裡我採用的是比較樸素的方法:將上面的看成是乙個平面。將向水平方向投影,這樣有字的地方的投影值就高,沒字的地方投影得到的值就低。
然後,用一根掃瞄線從下向上掃瞄。這個掃瞄線會與圖中曲線存在交點,這些交點會將山頭分割成乙個又乙個區域。車牌一般是7個字元,因此,當掃瞄線將山頭分割成七個區域時停止。然後根據這七個區域向水平線的投影的座標就可以將中的七個字元分割出來。
但是,現實是複雜的。比如,「川」字,它的水平投影是三個山頭。按上面這種掃瞄方法會將它切開。因此,對於上面的切割,需要加上約束條件:每個山頭有乙個中心線,山頭與山頭的中心線的距離必需在某乙個值之上,否則,則需要將這兩個山頭進行合併。加上這個約束之後,便可以有效的切割了。
以上是水平投影。然後還需要做垂直投影與切割。這裡的垂直投影與切割就乙個山頭,因此好處理一些。
水平投影及切割**:
1public
static
ilist
<
bitmap
>
split(bitmap map,
intcount)27
ilist
<
bitmap
>
resultlist
=new
list
<
bitmap
>
();8
intx
=map.width;
9inty =
map.height;
10int
splitbitmapminwidth =4
;11int xnormal
=new
int[x];
12for
(inti =
0; i
<
x; i++)
1320}21
}22pair pair
=new
pair();
23for
(inti =
0; i
<
y; i++)
2438
pair
=new
pair();39}
40else
if(pair.status
==pairstatus.justcreated)
4145}46
else
if(pair.status
==pairstatus.start)
4754
pair
=new
pair();55}
56if
(pairlist.count
>
count)
5760}61
if(pairlist.count
==count)
6271}72
foreach
(pair p
inpairlist)
7382}83
resultlist.add(newmap);84}
85return
resultlist;86}
87}88return
resultlist;
**中的
pair,
代表掃瞄線與曲線的一對交點:
1private
class
pair25
public
intcharpixelxdensity
6public
intend
7public
intstart
8public
bitmapconverter.pairstatus status
9public
intwidth 10}
pairstatus
代表pair
的狀態。
1private
enum
pairstatus23.
提取每乙個字元的特徵,生成特徵向量或特徵矩陣
將切割出來的字元,分割成乙個乙個的小塊,比如3×3,5×5,或3×5,或10×8,然後統計一下每小塊的值為255的畫素數量,這樣得到乙個矩陣m,或者將這個矩陣簡化為向量
v通過以上3步,就可以將乙個車牌中的字元數值化為向量了。
4.分類與學習。將特徵向量或特徵矩陣與樣本庫進行比對,挑選出相似的那類樣本,將這類樣本的值作為輸出結果。
驗證碼識別技術
由於現在很多 為了加強安全性,以及防止程式的自動操作 都加入的了驗證碼技術。但卻給廣大站長推廣宣傳 帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!廣大站長宣傳推廣自己的 經常要發布一些宣傳廣告,如果靠人工,太慢太昂貴,所以理想的辦法是...
驗證碼識別技術
目前大部分驗證碼都是文字的序列,因此現有的識別方法,大都來自ocr 光學字元識別 的技術。ocr用於印刷體掃瞄後文字的識別,一般分為三個步驟 1 預處理 因為有些印刷文字會存在字跡不清 汙點 顏色不統一等問題,所以在最開始都要對影象進行預處理。這些處理包括邊緣檢測 二值化等操作。邊緣檢測就是根據顏色...
驗證碼識別技術
原文 由於現在很多 為了加強安全性,以及防止程式的自動操作 都加入的了驗證碼技術。但卻給廣大站長推廣宣傳 帶來的麻煩。所以我準備寫這篇關於驗證碼識別技術的文章,不足之處在所難免!本人從來不寫東西,今天為了想落伍才寫了!廣大站長宣傳推廣自己的 經常要發布一些宣傳廣告,如果靠人工,太慢太昂貴,所以理想的...