Python中有专门的图像处理技术比如说PIL,可以对验证码一类的图片进行二值化处理,然后对图片进行分割,进行像素点比较得到图片中的数字。这种方案对验证码的处理相对较少,运用相对普遍,很多验证码图片可以通过这个方式得到识别,当然还需要一部分的降噪处理。

什么是图片二值化处理:简单也就是把一张五颜六色的验证码处理成一张只由黑白构成的验证码,这个是为了方便后期我们和保存的黑白单一数字、字母进行像素点比较。

什么是降噪处理:简单的解释就是把验证码中的干扰去掉一部分,降噪不可能完全降,但是可以处理一大部分就是对识别的一种进步,毕竟如果降噪处理不行,对后期的像素点比较和结果值影响比较大。

今天我们用图片的RGB的色彩比对技术,用JAVA对图片进行一次二值化处理,然后识别。

原图片:     

二值化后图片:

我们针对这个网页的验证码需要在自己库中保存的模板类型:.....这一类是用于后期像素点比较得到图片本身数值的准备。

那么基本流程我们知道了,我们就开始

第一步:图片下载:

网页的抓取有时候会有验证码的识别,这样我们就需要对http请求的包进行解析,有的验证码可以在js中解析得到,有的是直接返回该网页页面,反正可以找到这个img图片进行下载到本地就行,此处不一一赘述。

第二部:对下载到本地的图片进行二值化处理:

在这里我自己写了一个脚本,供大家使用和参考:


public class MyImgDel {
//todo splitNums可以根据你给到的图片色差进行调整,在你自己使用时,可以针对splitNums做一个循环,每次加多少,得到不同的色差比的二值化后的图片,因为不同的图片可能干扰线、干扰点颜色原因,二值化后会有差异
//todo splitWidthNum:把图片根据长度切分的分数,这个可以根据你图片中的数字个数进行切分
public static final int splitNums=4000000;
public static final int splitWidthNum=5;
public static void main(String[] args) {
String path="F://test1.png";
try{
BufferedImage img=removeBackgroud(path);
ImageIO.write(img, "PNG", new File("F://test1-1.png"));
}catch (Exception e){
e.printStackTrace();
}
} public static BufferedImage removeBackgroud(String picFile)
throws Exception {
BufferedImage img = ImageIO.read(new File(picFile)); img = img.getSubimage(1, 1, img.getWidth()-2, img.getHeight()-2);
int width = img.getWidth();
int height = img.getHeight();
double subWidth = (double) width/(splitWidthNum+0.0);
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < splitWidthNum; i++) { //todo 以下是对图片进行二值化处理,在这里我的思路是规定,色差范围在splitNums到负splitNums之间的,算是同色,放入同一个色值,放入一个map中,map中的Key放色值,value放这个色值得个数,后期就根据这个色值来对验证码进行二值化
for (int x = (int) (1 + i * subWidth); x < (i + 1) * subWidth && x < width - 1; ++x) {
for (int y = 0; y < height; ++y) {
if (isWhite(img.getRGB(x, y)) == 1){
continue;
}
Map<Integer, Integer> map2 = new HashMap<Integer, Integer>();
for (Integer color : map.keySet()) {
map2.put(color,map.get(color));
} for (Integer color : map2.keySet()) {
System.out.println(Math.abs(color)-Math.abs(img.getRGB(x, y)));
if (Math.abs(color)-Math.abs(img.getRGB(x, y))<splitNums&&Math.abs(color)-Math.abs(img.getRGB(x, y))>-splitNums){
map.put(color, map.get(color) + 1);
}else{
map.put(img.getRGB(x, y), 1);
}
}
if (map.isEmpty()){
map.put(img.getRGB(x, y), 1);
}
}
}
System.out.println("=============================="); int max = 0;
int colorMax = 0;
for (Integer color : map.keySet()) {
if (max < map.get(color)) {
max = map.get(color);
colorMax = color;
}
} for (int x = (int) (1 + i * subWidth); x < (i + 1) * subWidth&& x < width - 1; ++x) {
for (int y = 0; y < height; ++y) {
int ress=Math.abs(img.getRGB(x, y))-Math.abs(colorMax);
if (ress<splitNums&&ress>-splitNums) {
img.setRGB(x, y, Color.WHITE.getRGB());
} else {
img.setRGB(x, y, Color.BLACK.getRGB());
}
}
}
}
return img;
} //todo 判断是否为白色的方法
public static int isWhite(int colorInt) {
Color color = new Color(colorInt);
if (color.getRed() + color.getGreen() + color.getBlue()>600) {
return 1;
}
return 0;
} }

处理到这里我们就可以得到一个二值化后的图片了。

然后我们就要开始对二值化后的图进行等分,然后和我们样本库中的图片进行一次像素比对。

JAVA爬虫---验证码识别技术(一)的更多相关文章

  1. uu云验证码识别平台,验证码,验证码识别,全自动验证码识别技术,优优云全自动打码,代答题系统,优优云远程打码平台,uu云打码

    uu云验证码识别平台,验证码,验证码识别,全自动验证码识别技术,优优云全自动打码,代答题系统,优优云远程打码平台,uu云打码 优优云验证码识别答题平台介绍 优优云|UU云(中国公司)是全球唯一领先的智 ...

  2. [验证码识别技术]字符验证码杀手--CNN

    字符验证码杀手--CNN 1 abstract 目前随着深度学习,越来越蓬勃的发展,在图像识别和语音识别中也表现出了强大的生产力.对于普通的深度学习爱好者来说,一上来就去跑那边公开的大型数据库,比如I ...

  3. 【Java】验证码识别解决方案

    对于类似以下简单的验证码的识别方案: 1. 2 3 4. 1.建库:切割验证码为单个字符,人工标记,比如:A. 2.识别:给一个验证码:切割为单个字符,在库中查询识别. /*** * author:c ...

  4. [验证码识别技术] 字符型验证码终结者-CNN+BLSTM+CTC

    验证码识别(少样本,高精度)项目地址:https://github.com/kerlomz/captcha_trainer 1. 前言 本项目适用于Python3.6,GPU>=NVIDIA G ...

  5. Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术

    滑动验证码介绍 本篇博客涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成. 这类验证码不常见了,官方介绍地址为:https://promotion.a ...

  6. Python爬虫入门教程 59-100 python爬虫高级技术之验证码篇5-极验证识别技术之二

    图片比对 昨天的博客已经将图片存储到了本地,今天要做的第一件事情,就是需要在两张图片中进行比对,将图片缺口定位出来 缺口图片 完整图片 计算缺口坐标 对比两张图片的所有RBG像素点,得到不一样像素点的 ...

  7. 不会python?那就换一种姿势爬虫!Java爬虫技术总结

    -本博客为原创内容,转载需注明本人- 前几天有个师妹将要毕业,需要准备毕业论文,但是论文调研需要数据资料,上知网一查,十几万条数据!指导老师让她手动copy收集,十几万的数据手动copy要浪费多少时间 ...

  8. Java 验证码识别之多线程打码兔

    验证码识别,爬虫永远的话题~ 用打码兔总体的体验就是单线程速度太慢~ import java.io.IOException; import java.net.MalformedURLException ...

  9. Java 验证码识别库 Tess4j 学习

    Java 验证码识别库 Tess4j 学习 [在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下 ...

随机推荐

  1. 你做电商死法TOP10:你中了几枪?

    有相关报道说淘宝目前只有3%的店铺能够盈利,其余97%的店铺基本上都成了炮灰.这是一个非常可怕的数字,都说不赚钱的电商是犯罪,那么,是什么原因导致了会有如此庞大的电商群体一如既往的走在这千军万马的不归 ...

  2. LoadRunner 12 模拟 RSA加密 登录的实现(JS)

    LR 12 中 web_js_run API 非常坑,只能调用一个 JS 文件:更坑的是,不能通用 一个JS调用另外一个JS:(可能有,但在网上找了N个国家,都没有找到!如有,还请朋友告之,谢谢.) ...

  3. IO系列之File

    1 File类 1.1 目录列表器 在这里我主要是参考Think in Java的内容从而做的一些总结以及扩展.Java中的IO流的设计应该说是Java中最经典的,最学院式的设计,包括它的整体架构设计 ...

  4. Spring框架IOC容器和AOP解析 非常 有用

    Spring框架IOC容器和AOP解析   主要分析点: 一.Spring开源框架的简介  二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面 ...

  5. hdu1099

    #include<iostream> using namespace std; __int64 gcd(__int64 a,__int64 b) { return b?gcd(b,a%b) ...

  6. c#事件1

    Private void button_clicked( object sender ,RouteEventArgs e) sender :引发事件的对象 源 e :      路由事件,提供可能重要 ...

  7. Mysql索引优化1

    Btree索引和哈希索引(索引是一种数据结构,提高查询,排序,分组速度) Btree索引的数据结构是平衡二叉树,时间复杂度为lgN 哈希索引的数据结构是一个Hash函数,时间复杂度为O(1),数据输入 ...

  8. webpack@3.6.0(2) -- css及图片相关问题

    本篇内容 css3前缀处理postcss 消除未使用的css部分 图片处理 css分离和分离后的图片处理 css3前缀处理postcss cnpm i -D postcss-loader autopr ...

  9. 反射实现数据库增删改查DAO及DAOImpl源代码(一)

    这是DAO层,第一次尝试,如有bug希望能即使反馈,我们共同进步.具体的用法和实现原理我会在前面几篇博客中补充更新.配置文件及项目目录结构会在下一篇中贴出! package com.javasm.su ...

  10. [Xcode 实际操作]四、常用控件-(14)使用UIWebView控件加载本地HTML

    目录:[Swift]Xcode实际操作 本文将演示使用网页视图,加载并渲染网页代码. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit im ...