圖像驗證碼識別(八)——字符歸一化

前面提到了將驗證碼上的字符分割成一個單獨的字符圖片而且保存,可是扣下來的字符串可能會有傾斜的現象,由於如今不少網頁驗證碼爲了防止破解都對字符進行了必定的扭曲和旋轉,即便是同一個網站的驗證碼,每一個相同的字符頗有可能都是不同的,因此爲了提升識別的正確率,在這裏最好能讓每次進行訓練的字符可以保持同一個角度。因此首先須要作的就是旋轉傾斜。php

1、旋轉傾斜函數

旋轉傾斜的目的就是要提升識別的正確率,若是字符‘A’的模板是標準的,讓一個橫着的‘A’去訓練確定得不到正確的結果。不過怎麼旋轉呢?想要將每一個字符都旋轉到印刷體的角度那是很難的,也是沒必要要的,在這裏採用的思想就是每次都旋轉成爲「最瘦的」。每次分割出來一個字符不論是橫着的仍是豎着的,均可以回到「最瘦」的角度。具體作法就是利用OpenCV的旋轉函數.測試

 

[cpp]  view plain  copy網站

  1. cv::Mat M = cv::getRotationMatrix2D(center, angle, scale);  


getRotationMatrix2D這個函數所作的就是計算旋轉矩陣,熟悉計算機圖形學的都知道,圖形在作各類變換的時候都是在原有的矩陣上乘以變換矩陣。這裏center是CvPoint2D32f類型的結構體,其有兩個float類型的變量分別表示要旋轉的圖像的寬和高,angle就是要旋轉的角度,scale是旋轉後的縮放係數。獲得變換矩陣以後就能夠進行旋轉操做了spa

 

 

[cpp]  view plain  copy圖片

  1. warpAffine(m_Mat,rotate_mat, M,cvSize(getWidth(),getHeight()),INTER_LINEAR,BORDER_CONSTANT,cvScalar(WHITE) );  


warpAffine函數就是進行旋轉操做。ci

 

鑑於大部分驗證碼的旋轉都不是特別誇張,因此處理時我讓字符從旋轉的範圍定在順時針-15度到15度,每次旋轉一度,而後計算最左邊第一個黑色像素到最右邊第一個黑色像素的距離,取距離最小的角度最終讓字符旋轉那個角度。字符串

能夠看到分割出來的字符和原始的仍是有點不太同樣,因爲測試用的驗證碼傾斜的並不明顯,因此這裏調整的也不是很明顯。get

2、歸一化it

因爲驗證碼大小不一,圖片上又大量背景像素,所以在進行最後一步識別的時候,還應該將驗證碼的大小縮放到固定的大小。在這裏我是先獲得字符像素的最小外包矩形,這樣能夠先把沒有用的白色背景像素干擾取消掉。接下來就是將全部的字符都統一縮放到16*16的大小,這樣最終獲得的通過預處理的標準字符就能夠開始訓練識別了。

相關文章
相關標籤/搜索