对图像识别这方面比较有兴趣,所以最近搜集了一点关于图片识别的资料来看,最后决定先行验证码识别开始,这是最简单的一步,从验证码识别来开启整个图像识别的路。
这个验证码识别,现在我只是刚刚开始接触,所以现在只是用java写几个函数简单的把噪点干扰去掉,今天开始最简单的验证码识别,想下面的图片
这是最简单的验证码,图像干扰少,且每个数字位置固定,那么要提取出其中数字是今天最主要要做的,这也算是关键的一步,要提取其中的图片,那就要用到图片的RGB数值,今天简单的看了一点计算机图形学,了解了一点显示器的原理,现在我们就是要把每张验证码黑白化,把数字部分用黑色填充,其余用白色填充,这个验证码也是比较容易改的,因为背景是浅颜色的,所以我们要把背景去掉就好,那么就要知道,当RGB三要素的和越大的时候颜色越浅,反之则越深,小伙伴们可以上网搜一下RGB表,在这里就不好多赘述了,现在开始移除背景,代码如下:
//把验证码的浅颜色区域变白 public static int isWhite(int colorInt){ //这里的colorInt是代表一个颜色的参数,用这个Int型参数就可以实现一个颜色对象,小伙伴们可以查API Color color = new Color(colorInt); if(color.getRed()+color.getGreen()+color.getBlue()>=100){ return 1; } return 0; } //把验证码的深颜色区域变黑 public static int isBlack(int colorInt){ Color color = new Color(colorInt); if(color.getRed()+color.getGreen()+color.getBlue() < 100){ return 1; } return 0; } //黑白化图片 public static BufferedImage removeBackground(String path) throws IOException{ //把图片读入缓冲图中处理 BufferedImage img = ImageIO.read(new File(path)); //计算像素点数目,对每一个像素点处理 int imageWidth = img.getWidth(); int imgHight = img.getHeight(); for(int i = 0;i<imageWidth;++i){ for(int j= 0;j<imgHight;++j){ if(isWhite(img.getRGB(i, j)) == 1){ img.setRGB(i, j, Color.white.getRGB()); } else if(isBlack(imgHight) == 1){ img.setRGB(i, j, Color.BLACK.getRGB()); } } } return img; }
做完这一步以后,我们就要读入图片了,先要把图片存在一个File类型的数组里面,然后写到缓冲图里面一个一个的处理,在缓冲图里黑白化处理以后,就要把每个相应的数字切割出来,然后跟自己的标准数字库比较,像素点相同的最多的就是该数字。
//用一个哈希map存储图片和名称,并返回,BufferedImage 缓冲图 public static Map<BufferedImage,String> loadImageData() throws IOException{ Map<BufferedImage,String> map = new HashMap<BufferedImage,String>(); //我是把图片文件都存在本地的一个img文件夹下 File dir = new File("img"); File[] files = dir.listFiles(); for(File file : files){ //读取图片,存入map中 map.put(ImageIO.read(file), file.getName().charAt(0)+""); } return map; } //得到验证码中图片单个的数字,可以用于跟自己的标准库比对 public static String getSingleCharOcr(BufferedImage img,Map<BufferedImage,String> map){ String result = ""; //得到改图片的像素点数 int width = img.getWidth(); int heigth = img.getHeight(); int min = width * heigth; //对每一张图片进行分解配对 for(BufferedImage bi : map.keySet()){ int count = 0; //对图片中的每一个数字进行匹配 Label1: for(int x = 0;x<width;++x){ for(int y = 0;y<heigth;++y){ if(isWhite(img.getRGB(x, y))== 1){ count++; } if(count >= min){ break Label1; } } } if(count <min ){ min = count; result = map.get(bi); } } return result; } //得到所有的匹配结果,并生成图片,用匹配结果命名 public static String getAllOcr(String path) throws IOException { BufferedImage img = removeBackground(path); List<BufferedImage> listImg = splitImage(img); Map<BufferedImage,String> map = loadImageData(); String result = ""; for(BufferedImage bi : listImg){ result += getSingleCharOcr(bi,map); ImageIO.write(bi, "JPG", new File("output/"+result+"and"+".jpg")); } ImageIO.write(img, "JPG", new File("result/"+result+".jpg")); return result; }
这里面的标准库就是1--9所有单个数字的图片,下面是截图:
用每一个从验证码中截取出来的单个数字进行匹配就可以得到结果,如果截取函数位置设的恰当,辨别率理应达到100%:
//黑白化分割图片,坐标好像有些不精准,小伙伴们可以改一下 public static List<BufferedImage> splitImage(BufferedImage image){ List<BufferedImage> subImg = new ArrayList<BufferedImage> (); subImg.add(image.getSubimage(7, 0, 11, 20)); subImg.add(image.getSubimage(18,0, 11, 20)); subImg.add(image.getSubimage(30,0, 11,20)); subImg.add(image.getSubimage(35,0, 11,20)); return subImg; }
相关推荐
【资源说明】 ...10. 当验证码识别效果不佳时,可采用其他二值化方法,在二值化区域右侧的弹出式菜单可以选择二值化方法,若改用自定义level,默认取值0.9。再次点击识别即可重新识别验证码。 11. 若默认灰
优优云验证码识别答题平台官方网站:http://www.uudama.com/ 最近两版更新日志: 1.1.0.8 优化了日志记录功能 去除了gif创建相关的功能 启用代理服务器功能 如何启用代理服务器功能: 修改UUWiseHelper.dll...
选择验证码类型 - [第一类:数字四则运算,有噪点干扰,输出计算结果](level1) - [第二类:数字、英文,有噪点干扰,文字无旋转形变,输出数字、英文](level2) - [第三类:数字、英文,有噪点干扰,文字有旋转...
2. **扭曲和变形**:为了增加识别难度,验证码图片中的字符通常会进行扭曲、倾斜、缩放等变形处理。易语言可以使用图像处理库来实现这些效果,例如通过像素级别的操作改变字符的位置和形状。 3. **添加背景噪声**:...
3.1.5 字符识别(字母、数字、手写体、汉字、验证码) 3.1.6 病灶识别 3.1.7 花朵、药材、水果蔬菜识别 3.1.8 指纹、手势、虹膜识别 3.1.9 路面状态和裂缝识别 3.1.10 行为识别 3.1.11 万用表和表盘识别 ...
- 对于反爬机制,如验证码,可能需要集成第三方库(如pytesseract)进行识别,或者人工介入。 6. **Item定义与Pipeline**: - 定义`hexun_forum_item.py`中的`Item`类,如`PostItem`,包含字段如`title`、`author...
"Lax"模式允许在同站的Top-Level导航中发送cookie,"Strict"模式则更严格,仅在同站的非Top-Level导航时发送。不过,需要注意的是,此方案在老版本浏览器中可能不被支持。 3. **客户端安装浏览器插件**:有些浏览器...
- **消息验证码**:描述了如何使用消息验证码(MAC)来验证数据的完整性和来源的真实性。 - **安全性提高**:MAC机制增加了额外的安全层,防止数据被篡改或伪造。 #### 3.5 访问权限编码 - **权限管理**:通过编码的...
修改 "Capture Level" 为 "winlnet level data"。这将使 LoadRunner 能够处理代理连接。 3. 其他可能的问题与解决方案: - 录制脚本时,可能需要处理动态参数,例如会话 ID 或验证码。LoadRunner 提供了关联和...
服务器通过session ID来识别用户,从而实现会话跟踪。 3. **Login Views和Forms**:Django提供了一些内置视图(views)和表单(forms),如`login()`和`logout()`,用于处理用户的登录和登出请求。这些视图可以与...
2. 多因素认证(Multi-Factor Authentication, MFA),增加安全强度,确保用户身份的验证不仅仅依靠密码,还依赖于多种认证方式,例如手机短信验证码、生物识别等。 3. 用户资源与生命周期管理,包括用户账户的创建...
5. **广泛的设备兼容性**:支持多种Android设备和版本,从API Level 16开始就可使用。 【Alto5TFAutoTest项目解析】 在"Alto5TFAutoTest"这个项目中,我们可以推测这是一套针对名为“Alto 5”设备或应用的五因素...
20. **Cool Captcha**: 创新的验证码系统,既安全又易于用户识别。 21. **Apple Like Login Form**: 仿苹果风格的登录表单,简洁美观,提升品牌形象。 22. **List Items Menu**: 优化的列表菜单,提供更好的导航体验...