使用tesseract-ocr破解網站驗證碼

首先我得認可,關注tesseract-ocr, 是衝着下面這篇文章的噱頭去的,26行groovy代碼破解網站驗證碼 
http://www.kellyrob99.com/blog/2010/03/14/breaking-weak-captcha-in-slightly-more-than-26-lines-of-groovy-code/ 

固然,看了以後才知道,原來是調用了三方庫tesseract-ocr…… 
http://code.google.com/p/tesseract-ocr/ 

儘管如此,本着鄧爺爺的「無論白貓黑貓,能抓住老鼠的就是好貓」的原則,趁着假期也開始了「文字識別」的初級研究 

HP的tesseract最近被Google支持並開支持英文字母和數字,聽說辨識程度是世界排名第三的;更難能難得的是,提供多國語言包下載(包括中文,精度不咋的卻是真的……),並自帶訓練工具。 

安裝完並跑過自帶例子以後,首先想到的應用天然是用於驗證碼分析 

 

按照說明,送入tesseract的圖片的質量直接影響識別的效果,所以,簡單的預處理是不可或缺的 

1.首先灰度化,灰度值=0.3R+0.59G+0.11B: 
Java代碼   收藏代碼
  1.    
  2. for (int y = minY; y < height; y++) {  
  3.     for (int x = minX; x < width; x++) {  
  4.         int rgb = srcImg.getRGB(x, y);  
  5.         Color color = new Color(rgb); // 根據rgb的int值分別取得r,g,b顏色。  
  6.         int gray = (int) (0.3 * color.getRed() + 0.59  
  7.             * color.getGreen() + 0.11 * color.getBlue());  
  8.         Color newColor = new Color(gray, gray, gray);  
  9.         srcImg.setRGB(x, y, newColor.getRGB());  
  10.     }  
  11. }  

結果如圖: 
 

2.其次是灰度反轉: 
Java代碼   收藏代碼
  1. for (int y = minY; y < height; y++) {  
  2.     for (int x = minX; x < width; x++) {  
  3.         int rgb = buffImg.getRGB(x, y);  
  4.         Color color = new Color(rgb); // 根據rgb的int值分別取得r,g,b顏色。  
  5.         Color newColor = new Color(255 - color.getRed(), 255 - color  
  6.             .getGreen(), 255 - color.getBlue());  
  7.         buffImg.setRGB(x, y, newColor.getRGB());  
  8.     }  
  9. }  

結果如圖: 
 

3.再次是二值化,取圖片的平均灰度做爲閾值,低於該值的全都爲0,高於該值的全都爲255: 
Java代碼   收藏代碼
  1. for (int y = minY; y < height; y++) {  
  2.     for (int x = minX; x < width; x++) {  
  3.         int rgb = buffImg.getRGB(x, y);  
  4.         Color color = new Color(rgb); // 根據rgb的int值分別取得r,g,b顏色。  
  5.         int value = 255 - color.getBlue();  
  6.         if (value > average) {  
  7.             Color newColor = new Color(0, 0, 0);  
  8.             buffImg.setRGB(x, y, newColor.getRGB());  
  9.         } else {  
  10.             Color newColor = new Color(255, 255, 255);  
  11.             buffImg.setRGB(x, y, newColor.getRGB());  
  12.         }  
  13.     }  
  14. }  

結果如圖: 
 

看看效果還湊合,就省卻尺寸調整、中值濾波以及噪點去除等步驟了。 

以上完成圖片預處理工做;Tesseract沒有開放api,純命令行調用: 
Java代碼   收藏代碼
  1. List<String> cmd = new ArrayList<String>(); // 存放命令行參數的數組  
  2. cmd.add(tessPath + "\\tesseract");  
  3. cmd.add("");  
  4. cmd.add(outputFile.getName()); // 輸出文件位置  
  5. cmd.add(LANG_OPTION); // 字符類別  
  6. cmd.add("eng"); // 英文,找到tessdata裏對應的字典文件。  
  7. ProcessBuilder pb = new ProcessBuilder();  
  8. pb.directory(imageFile.getParentFile());  
  9.   
  10. cmd.set(1, tempImage.getName()); // 把圖片文件位置放在第一個位置  
  11.   
  12. pb.command(cmd); // 執行命令行  
  13. pb.redirectErrorStream(true); // 通知進程生成器是否合併標準錯誤和標準輸出,把進程錯誤保存起來。  
  14. Process process = pb.start(); // 開始執行進程  
  15.   
  16. int w = process.waitFor(); // 當前進程中止,直到process中止執行,返回執行結果.  


結果輸出表示一切正常 

固然,真正要用好tesseract-ocr,還需用到其強大地訓練工具,就是後話了…… 

另外,關於文字識別,除去做爲破解驗證碼的反制手段以外,咱們是否也有相關的應用呢? 

  • 大小: 1.1 KB
  • 大小: 1.3 KB
  • 大小: 1.3 KB
  • 大小: 1.4 KB
相關文章
相關標籤/搜索