`
什么都不懂的孩子
  • 浏览: 27816 次
社区版块
存档分类
最新评论

验证码识别level---01

 
阅读更多

         对图像识别这方面比较有兴趣,所以最近搜集了一点关于图片识别的资料来看,最后决定先行验证码识别开始,这是最简单的一步,从验证码识别来开启整个图像识别的路。

        这个验证码识别,现在我只是刚刚开始接触,所以现在只是用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;
	}

 

 

  • 大小: 3.5 KB
  • 大小: 3.9 KB
  • 大小: 3.6 KB
  • 大小: 4 KB
  • 大小: 3.6 KB
  • 大小: 3.7 KB
  • 大小: 15.7 KB
分享到:
评论

相关推荐

    基于MATLAB完成数字验证码识别的GUI设计源码+说明(图像处理,验证码识别等功能).zip

    【资源说明】 ...10. 当验证码识别效果不佳时,可采用其他二值化方法,在二值化区域右侧的弹出式菜单可以选择二值化方法,若改用自定义level,默认取值0.9。再次点击识别即可重新识别验证码。 11. 若默认灰

    优优云验证码识别答题平台最新API接口DLL下载

    优优云验证码识别答题平台官方网站:http://www.uudama.com/ 最近两版更新日志: 1.1.0.8 优化了日志记录功能 去除了gif创建相关的功能 启用代理服务器功能 如何启用代理服务器功能: 修改UUWiseHelper.dll...

    基于深度学习和TensorFlow的英文和汉字验证码识别

    选择验证码类型 - [第一类:数字四则运算,有噪点干扰,输出计算结果](level1) - [第二类:数字、英文,有噪点干扰,文字无旋转形变,输出数字、英文](level2) - [第三类:数字、英文,有噪点干扰,文字有旋转...

    易语言验证码图片生成

    2. **扭曲和变形**:为了增加识别难度,验证码图片中的字符通常会进行扭曲、倾斜、缩放等变形处理。易语言可以使用图像处理库来实现这些效果,例如通过像素级别的操作改变字符的位置和形状。 3. **添加背景噪声**:...

    用于 RIS 辅助通信系统的 SimRIS 通道模拟器附matlab代码+运行结果.zip

    3.1.5 字符识别(字母、数字、手写体、汉字、验证码) 3.1.6 病灶识别 3.1.7 花朵、药材、水果蔬菜识别 3.1.8 指纹、手势、虹膜识别 3.1.9 路面状态和裂缝识别 3.1.10 行为识别 3.1.11 万用表和表盘识别 ...

    通过Scrapy抓取和讯论坛关键字搜索的结果

    - 对于反爬机制,如验证码,可能需要集成第三方库(如pytesseract)进行识别,或者人工介入。 6. **Item定义与Pipeline**: - 定义`hexun_forum_item.py`中的`Item`类,如`PostItem`,包含字段如`title`、`author...

    Web应用安全:CSRF防范辅助性对策.pptx

    "Lax"模式允许在同站的Top-Level导航中发送cookie,"Strict"模式则更严格,仅在同站的非Top-Level导航时发送。不过,需要注意的是,此方案在老版本浏览器中可能不被支持。 3. **客户端安装浏览器插件**:有些浏览器...

    MF3ICD40 Mifare DESFire EV1 手册

    - **消息验证码**:描述了如何使用消息验证码(MAC)来验证数据的完整性和来源的真实性。 - **安全性提高**:MAC机制增加了额外的安全层,防止数据被篡改或伪造。 #### 3.5 访问权限编码 - **权限管理**:通过编码的...

    Loadrunner使用问题汇总

    修改 "Capture Level" 为 "winlnet level data"。这将使 LoadRunner 能够处理代理连接。 3. 其他可能的问题与解决方案: - 录制脚本时,可能需要处理动态参数,例如会话 ID 或验证码。LoadRunner 提供了关联和...

    使用django验证系统1

    服务器通过session ID来识别用户,从而实现会话跟踪。 3. **Login Views和Forms**:Django提供了一些内置视图(views)和表单(forms),如`login()`和`logout()`,用于处理用户的登录和登出请求。这些视图可以与...

    零信任安全之IDaaS实践.pdf

    2. 多因素认证(Multi-Factor Authentication, MFA),增加安全强度,确保用户身份的验证不仅仅依靠密码,还依赖于多种认证方式,例如手机短信验证码、生物识别等。 3. 用户资源与生命周期管理,包括用户账户的创建...

    uiautomator案例

    5. **广泛的设备兼容性**:支持多种Android设备和版本,从API Level 16开始就可使用。 【Alto5TFAutoTest项目解析】 在"Alto5TFAutoTest"这个项目中,我们可以推测这是一套针对名为“Alto 5”设备或应用的五因素...

    推荐30个新鲜出炉的精美 jQuery 效果

    20. **Cool Captcha**: 创新的验证码系统,既安全又易于用户识别。 21. **Apple Like Login Form**: 仿苹果风格的登录表单,简洁美观,提升品牌形象。 22. **List Items Menu**: 优化的列表菜单,提供更好的导航体验...

Global site tag (gtag.js) - Google Analytics