JAVA爬虫---验证码识别技术(一)
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爬虫---验证码识别技术(一)的更多相关文章
- uu云验证码识别平台,验证码,验证码识别,全自动验证码识别技术,优优云全自动打码,代答题系统,优优云远程打码平台,uu云打码
uu云验证码识别平台,验证码,验证码识别,全自动验证码识别技术,优优云全自动打码,代答题系统,优优云远程打码平台,uu云打码 优优云验证码识别答题平台介绍 优优云|UU云(中国公司)是全球唯一领先的智 ...
- [验证码识别技术]字符验证码杀手--CNN
字符验证码杀手--CNN 1 abstract 目前随着深度学习,越来越蓬勃的发展,在图像识别和语音识别中也表现出了强大的生产力.对于普通的深度学习爱好者来说,一上来就去跑那边公开的大型数据库,比如I ...
- 【Java】验证码识别解决方案
对于类似以下简单的验证码的识别方案: 1. 2 3 4. 1.建库:切割验证码为单个字符,人工标记,比如:A. 2.识别:给一个验证码:切割为单个字符,在库中查询识别. /*** * author:c ...
- [验证码识别技术] 字符型验证码终结者-CNN+BLSTM+CTC
验证码识别(少样本,高精度)项目地址:https://github.com/kerlomz/captcha_trainer 1. 前言 本项目适用于Python3.6,GPU>=NVIDIA G ...
- Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术
滑动验证码介绍 本篇博客涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成. 这类验证码不常见了,官方介绍地址为:https://promotion.a ...
- Python爬虫入门教程 59-100 python爬虫高级技术之验证码篇5-极验证识别技术之二
图片比对 昨天的博客已经将图片存储到了本地,今天要做的第一件事情,就是需要在两张图片中进行比对,将图片缺口定位出来 缺口图片 完整图片 计算缺口坐标 对比两张图片的所有RBG像素点,得到不一样像素点的 ...
- 不会python?那就换一种姿势爬虫!Java爬虫技术总结
-本博客为原创内容,转载需注明本人- 前几天有个师妹将要毕业,需要准备毕业论文,但是论文调研需要数据资料,上知网一查,十几万条数据!指导老师让她手动copy收集,十几万的数据手动copy要浪费多少时间 ...
- Java 验证码识别之多线程打码兔
验证码识别,爬虫永远的话题~ 用打码兔总体的体验就是单线程速度太慢~ import java.io.IOException; import java.net.MalformedURLException ...
- Java 验证码识别库 Tess4j 学习
Java 验证码识别库 Tess4j 学习 [在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下 ...
随机推荐
- js中Function方法
function.apply(thisArg,argArray) apply方法调用function,传递一个会绑定到this上的对象和一个可选的数组作为参数. apply方法被用在apply调用模式 ...
- html文档树形结构图
- 应用HtmlInputFile进行大文件上传 解决asp.net上传大文件默认文件大小限制
选择一个文件,也可以正确上传至服务器,但您会发现文件大于2048的时候,出现:Internet Explorer显示 "The page cannot be displayed - Cann ...
- 关于ArcGis for javascript整合百度地图 天地图 高德地图进行搜索
1.ArcGis for javascript整合百度地图搜索 1.1.首先引入百度地图的api <!-- 引入百度地图API --> <script type="text ...
- mongodb操作数据集合
1.创建数据集: a.创建不设置参数的默认数据集(默认数据集自带一个流水id,_id) db.createCollection("mycol") //创建默认集合 b.创建指定参数 ...
- 除了BAT,计算机、软件专业的毕业生还有别的好去处吗?
"学技术的同学应该关注36氪.pingwest,极客公园这些圈子里很有影响力的科技媒体" 转载--除了BAT,计算机.软件专业的毕业生还有别的好去处吗? 又到校招季,985理工科的 ...
- idea调试SpringMvc, 出现:”Can't find catalina.jar"错误的解决方法
用gradle构建的项目,点击运行出现以下错误提示: Error running PraticeWeb: Can't find catalina.jar 21:54 Error running Pra ...
- Win10访问不了Samba网络共享的解决办法
一,首先安装SMB功能 1.打开"应用和功能",选择“程序和功能” 2.选择"开启或关闭windows功能" 3.选中下面红框中三个选项,点击确定,然后重启,就 ...
- 魔卡少女(cardcaptor)——线段树
题目 [题目描述] 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时 ...
- [Swift]Scanner字符串扫描类
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...