當前位置: 華文星空 > 知識

如何寫一個簡單的手寫辨識演算法?

2015-04-02知識

正好手頭有個demo,這裏盡量用最簡單的思路介紹一下。

說明,這個是給零基礎的同學看的,不需要任何電腦基礎。

同樣,這個處理思路忽略了非常多的細節,只是為了讓大家更好地理解原理而已。

1。首先看下如何提取特征,看這麽多數位,眼睛都花了。

2。簡單說就是把數位劃分成很多很多的小塊,比如下圖這樣:

每個數位被劃分成了4*5=20個小塊。

分好了小塊以後,其實我們要知道每個小塊是由很多個像素構成的。

或者這樣理解,每個小塊其實可以劃分為更多的小塊,即每個小塊是由很多個更小的塊構成的。

比如每個小塊可能是100*100個更小的小塊構成的。

為了敘述上的方便,把小塊記為B(Bigger),更小的塊記為S(Smaller)。

因此,比如數位8,是由5行4列共計:5*4=20個小塊B構成。

每個小塊B內其實是由100*100=100000個像素(更小塊S)構成的。

3。數一下每個小塊B內,有多少個黑色的像素。

或者這樣理解,每個小塊B內有多少個更小塊S是黑色的。

比如第一行:

  • 第1個小塊B中,共有0個更小塊S是黑色的,記為0.
  • 第2個小塊B中,共有28個更小塊S是黑色的,記為28.
  • 第3個小塊B中,共有10個更小塊S是黑色的,記為10.
  • 第4個小塊B中,共有0個更小塊S是黑色的,記為0.
  • 以此類推,可以計算出每一行的每一個小塊B的數位是多少,寫好就好了。

    這就是數位的特征,如果仔細觀察,每個數位的特征是不一樣的。

    因為他們的每個小塊B內的數位是不一致的。

    4。為了方便,我們把得到的特征,排成一排(陣列)就好了。

    5。所以,我們可以看看數位8的特征,其實就是一堆數位(陣列)構成的。

    6。照著葫蘆畫瓢,每個數位的特征其實都是一堆數位構成的。

    這個數位類似於我們的身份證號碼,一般來說,是獨一無二的。

    7。那辨識是怎麽回事呢?

    就是比較要辨識的數位特征和步驟6中的哪個數位的特征最接近就好了。

    這裏為了方便,假設要辨識數位「8」,然後看看怎麽從一堆(為了方便只有兩個)數位裏面選出來他到底應該是幾?

    8。當然,為了方便,特征簡化了,我們假設每個數位只有4個特征值了。

    9。這裏要用到一個歐氏距離的概念。

    簡單點說,就是有一個罪犯,經過警察叔叔的縝密偵查,發現他的身高 是175cm(透過腳印就可以判斷出身高,大家自己百度一下)。

    警察過來抓人了,兩個已知嫌疑人,一個A身高176cm,另外一個B身高168厘米。

    那我計算一下,取絕對值就好了:

  • A與嫌疑人的差值:176-175=1cm
  • B與嫌疑人的差值:175-168=7cm
  • 那當然,罪犯就是身高176cm的A了。

    當然,由於當前不僅僅有身高,還有體重,那就要綜合計算身高和體重了。

    為了更好地計算,就用到公式:

    看起來很復雜,簡單說就是把所有的差值取平方和後開根號。

    這就是一種計算方法,不理解原理其實也沒有關系,總之就是計算一下,知道怎麽計算就行了。

    10。看看罪犯和嫌疑人的相似程度。

    好了,計算一下要辨識的這個影像(圖中待辨識右側的8,這裏我們假裝不認識他)和資料庫裏面保存的數位8的歐式距離吧!

    恩,計算就是把每個對應的特征值相減,取平方,計算和,開根號。

    得到結果,當前結果是根號3.

    11。再次計算罪犯和另外一個嫌疑人的相似程度。

    好了,計算要辨識的影像和資料庫裏面的數位7的特征值進行比較。

    恩,綠色部份是我們的計算結果,根號7322.

    12。辨識

    罪犯和嫌疑人的計算差異值,一個是根號3,另外一個是根號7322.

    距離小的是辨識結果。

    這裏,根號3是辨識結果,所以,要辨識的影像是數位8.

    這就是辨識過程了。

    可以用圖表示一下:

    在提取特征前,影像可能是彩色的,就先把他處理為二值的,這樣好方便計算其中黑色小塊的個數。

    寫得比較匆忙,歡迎大家對細節提出改進意見。謝謝。

    版權所有,轉載請私信聯系。

    本文已經寫入【OpenCV輕松入門】(電子工業出版社,2019)、【電腦視覺40例】(電子工業出版社,2022)。