寫在前面
其實我之前寫過一個簡單的識別手寫數字的程序,但是因為邏輯比較簡單,而且要求比較嚴苛,是在50x50大小像素的白底圖上手寫黑色數字,并且給的訓練材料也不夠多,導致準確率只能五五開。所以這一次準備寫一個加強升級版的,借此來提升我對Python處理文件與圖片的能力。
這次準備加強難度:
被識別圖片可以是任意大小; 不一定是白底圖,只要數字顏色是黑色,周圍環境是淺色就行; 加強識別手寫數字的邏輯,提升準確率。因為我還沒開始正式寫,并且最近專業課程學習也比較緊迫,所以可能更新的比較慢。不過放心,代碼質量肯定是不會下降的,我會盡我所能寫的邏輯明確、通俗易懂點。
所以這次面向的人群是擁有一定Python基礎,對數學算發有一點了解(識別圖像的算法嘛)的人。
但畢竟我不是專業的,也沒有看那么多論文,所以我這里運用的算法僅僅是我一個粗淺的想法,只是為了練手而已。如果和實際應用脫節,還望莫怪。
當然,如果諸位有什么比較好的想法,可以在下方評論或者私信我,我們可以探討一下,相互進步。
整體思路
大綱
對圖片的預處理
在最開始的時候,我們假設只擁有一個訓練庫,里面是從0到9的手寫數字圖案若干組。
所以我們首先應該將這些圖案讀入程序中,然后運用某種方式保存好,用來后面識別圖片。
這里的圖案我們假設是大小不一的,里面手寫的數字也是有大有小。所以我們可以將包住手寫數字圖案的最小矩形給裁剪出來,然后將裁剪出來的圖案統一給拉伸成相同大小的圖案。
以上操作得出一個矩陣,這個矩陣的值是圖案的灰度值。對于訓練用的圖片和被檢測的圖片我們都是這樣處理。
圖像識別的算法處理
我這里想用兩個方法來讓數字識別準確點:
識別所寫數字的“洞數”; 將圖片轉為1xn的向量,然后根據根據訓練圖片分出的類對被識別圖片圖片進行分類。洞數就是某個數字是否有閉合的曲線,比如說7沒有洞,6有一個洞,8有兩個洞。所以我們根據洞數可以分成以下三類
0洞:1, 2, 3, 4, 5, 7
1洞:6, 9, 0
2洞:8
但是因為各種手寫差異,比如說6, 9, 8之類的沒有閉合,4上面閉合,所以會導致下面這種可能情況
0洞:1, 2, 3, 4, 5, 6, 7, 9
1洞:6, 8, 9, 0
2洞:8
雖然說這樣分類0洞占大多數,但是聊勝于無。
對于將圖片轉為向量的意思就是將圖片原本的二維矩陣展開稱為一維向量。這個用numpy的函數可以可以很簡單的實現。
對于這個分類,下面我就簡單的講一下原理。
假設我們在二維平面上有兩個點A=(1,1)和B=(5,5),我現在再放一個點C=(2,2),那么請問,C點離哪一個更近?
新聞熱點
疑難解答