Dear All~
範例網址:http://59-126-75-42.hinet-ip.hinet.net/produce/ocr/index.php
因為我把每一步驟所生成的圖片全寫在同一支呈現,所以電腦在解圖上會開很久~
So~試玩者得有點耐心~
網路上找的到文件老實說不如自己花點時間思考一下處理的方法
簡單的設計流程大概是:
1. 抓取來源圖檔~讀入成gd image
2. 利用四週相近的顏色,去除背景
3. 灰階 , 去除雜點
簡單提一下所謂的雜點我是定義成若自身這個 pixel 以外的四邊都是白色,自身就消失~
4. 將字的範圍定出﹑裁切
5. 將每個字切成各別的圖片
6. 把每個字左右各翻60度,找出黑色出現的最短路徑,如此可找到字是正的
7.
--- --- --- ---
|5| |2| |3| |1| ....
--- --- --- ---
得到每個字在每張圖後,接下來就來作最重要的圖型辨識
不過老實說我也想了好多種方法~
像是縱﹑橫﹑斜 類似 一條線穿過多少點,或是將筆畫切細有的沒的
但嘗試後總是不盡理想~
我也曾把每張圖的黑點數累加,也得到很不可靠的資訊
多方思考後,我得出一個結論,既然要電腦習得人類看字,總得教他觀察一個字
於是我嘗試把一個字 橫﹑縱 分出了 8x8 個點
圖片其實滿小的,大概10x10甚至不到這麼大張
所以8x8將會記下大概這些資訊
id num codes...
1 7 11111100 10111100 10111100 10111000 10100100 10011...
2 2 11111100 10111000 10110000 10001000 10001000 00000...
3 8 11111100 10010000 10001100 11101100 11000000 10011...
4 6 11111100 11000000 11000000 10111100 11100000 11100...
5 2 11111100 10111100 10111000 10110000 10001000 10001...
6 7 11111100 11001000 10000000 10111100 11111000 10000...
7 4 11111111 11111011 11110011 10000001 10000000 11111...
8 4 11111100 11110100 11110100 10000000 10000000 11110...
9 3 11111110 11111010 10111010 10101110 10000010 10000...
10 1 11111100 10111100 10000000 10000000 11111100 00000...
於是我開始利用網頁建檔,重新整理﹑建檔
建到目前大概200多筆左右,我得到了70%~85% 的辨識成功率
select distinct num,count(*) from ocr group by num order by num asc
num count(*)
0 28
1 17
2 28
3 20
4 24
5 33
6 30
7 28
8 25
9 22
平均每個字大概建檔 20~30次左右不等
總而言之,也算是小小的成功
範例的程式是小弟用 php-gd 實作
因小弟才疏學淺,若有前輩對於影像處理這些有心得方向,希望能多方研究討論