zoukankan      html  css  js  c++  java
  • 使用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
     
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/Bonker/p/4021674.html
Copyright © 2011-2022 走看看