1. 程式人生 > >驗證碼識別 matlab

驗證碼識別 matlab

驗證碼識別流程

[1]一、數字影象處理基礎

一幅影象可以定義為一個二維陣列f(x,y),這裡x,y是空間座標,而在任何一對空間座標(x,y)上的幅值f稱為該點影象的強度或灰度。當x,y和幅值f為有限的、離散的數值時,稱該影象為數字影象。

自然界呈現在人眼中的影象是連續的模擬訊號,在計算機處理前,必須用影象感測器把光訊號轉換為表示亮度的電訊號,再通過取樣和量化得到一副數字影象。取樣是對影象在座標上進行離散化的過程,每一個取樣點稱為一個畫素。量化是對影象灰度上的離散化過程。取樣後將得到M*N個畫素,每個畫素量化得到一個灰度值L,以L表示灰度值的允許取值範圍,則數字影象儲存需要的位元數b可以表示為:

clip_image002

影象的灰度值取值範圍被稱為影象的動態範圍。把佔有灰度級全部有效段的影象稱為高動態範圍影象,高動態範圍影象有較高的對比度。相反,地動態範圍的影象看上去是沖淡了的灰暗格調。

二、影象的預處理:

主要是對影象進行灰度化、二值化、抑噪(濾波)等技術。

1、影象的灰度化

RGB系統中一個顏色值由3個分量組成,這樣的影象稱為彩色影象,RGB系統稱為顏色空間模型。常見的顏色空間模型還有HSI、CMYK等。如果一幅影象的顏色空間是一維的(一個顏色值只有一個顏色分量),則這幅影象就是一副灰度圖。在點陣圖影象中,一般以R=G=B來顯示灰度影象。

clip_image004

圖 1 原始圖片

常用的灰度化方法有以下三種:

clip_image006 (2.1)

clip_image008 (2.2)

clip_image010 (2.3)

其中,公式(2.1)的方法來源於I色彩空間中I分量的計算公式,公式(2.2)來源於NTSC色彩空間中Y分量的計算公式。公式(2.3)是基於採用保留最小亮度(黑色)的方法。

clip_image012

圖 2 用公式2.2灰度化後的圖片

RGB彩色影象可以看成是由3副單色的灰度影象構成的,可以直接取RGB通道中的任一個通道得到灰度化影象,如clip_image014,前提是影象中目標畫素的亮度資訊主要分佈在B通道上,否則灰度化結果將是亮度資訊的大量丟失。灰度影象又叫亮度影象,由歸一化的取值表示亮度,最大取值表示白色,最小取值表示黑色。

以P(x,y)表示影象中一個點,x、y分別是影象的橫座標和縱座標,R(x,y)表示R通道的顏色分量,G(x,y)表示G通道的顏色分量,B(x,y)表示B通道的顏色分量。點P(x,y)的亮度值用L(x,y)表示。彩色影象的亮度沒有嚴格的定義和計算公式,一般用公式(2.1)來計算,我們記作L1(x,y)。同樣的用公式(2.2)計算的亮度值記作L2(x,y),用公式(2.3)計算的亮度值記作L3(x,y)。可以證明:

clip_image016 (2.4)

clip_image018 (2.5)

公式(2.1)取RGB通道的平均值,得到的影象相對比較柔和,同時也縮小了目標和背景的平均亮度差,不利於後續的閥值處理。公式(2.2)考慮了人眼對綠色的適應度最強,藍色次之,紅色最差。在處理綠色調和藍色調的驗證碼影象時,公式(2.2)的效果令人滿意,但在處理紅色調的影象時,因為公式中紅色的權值很小,灰度化後目標畫素和背景畫素的亮度差值被嚴重縮小,效果還不如公式(2.1)。公式(2.3)基於一個前提,那就是有限保留目標畫素的亮度資訊,利於後續的閥值分割。

需要說明的是,要根據影象灰度化的目的不同,原圖色彩特徵的不同,選擇合適的灰度化方法。

2、影象的二值化

一般24位RGB影象的灰度圖是8位256個灰度級的,如果把這個灰度級減少到1位2個灰度級,就得到一副二值圖,二值影象中的資料全部是0或1。

clip_image020

圖 3 二值化後圖像

三、字元分割:

字元分割包括從驗證碼影象中分割出字元區域和把字元區域劃分成單個字元兩個部分。如果採用統計特徵匹配以及神經網路法識別,必須要先分割出單個的字元。簡單的分割方法包括等距分割、積分投影分割、交叉點分割、求連通區等。其中,粘連字元的分割是一個難點,複雜的粘連情況下分割比較困難,是一個硬人工智慧問題。

四、字元識別

字元識別就是把處理後的圖片還原回字符文字的過程。可以分成基於字元分割的識別(包括採用神經網路、SVM、各種統計距離的識別法)和模板匹配法識別。

字元識別的常用做法是:先獲取該字元的特徵碼,然後使用各種分類演算法將對該特徵碼進行分類,將其打上相應的類標籤。分類模型的訓練,是對字元庫中的每個字元進行特徵化處理,得到每個字元的特徵碼,該字元的標籤就是該字元本身,利用特徵碼加上字元的標籤對字元庫中的所有資料進行訓練,得到相應的分類模型。

當然,得到了待識別字符的特徵碼後,也可以使用相似性度量和字元庫中的字元的特徵碼進行比較,將該字元識別為與其特徵碼相似性最高的字元。

現在的問題就集中在如何獲取字元的特徵碼。文章[2]中介紹了一種簡單的獲取特徵碼的方法:

對於二值化後的影象進行分割,分割出來的影象是一個個的字元,如下圖所示:

clip_image022

圖 4 對影象進行分割,確定每個影象的邊界

在每個字元的邊界內,按行(或列)掃描該圖片,檢測其中的每個畫素點,如果畫素為白色則為0,如果畫素為黑色則為1,將這些0和1連起來組成的字串就構成了該字元圖片的特徵碼。