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可以自动识别验证码,在这里简单记录下 ...
随机推荐
- “在注释中遇到意外的文件结束”--记一个令人崩溃的bug
下午写程序,写的好好的,突然报错"在注释中遇到意外的文件结束". 下面是官方给出的错误原因是缺少注释终结器 (* /). // C1071.cpp int main() { } / ...
- C++知识点总结(三)
1.字符串查找字符函数strchr strchr函数原型:extern char*strchr(const char *s,char c); 功能:查找字符数组s中首次出现字符c的位置 说明:返回首次 ...
- AngularJs(Part 6)
Overcomming same-origin policy restrictions with JSONP. AJAX has a restriction that it can only retr ...
- GCC源码编译
1. gcc源码下载 ftp://gcc.gnu.org/pub/gcc/releases/ [yhwang@yhwang ~] wget ftp://gcc.gnu.org/pub/gcc/rele ...
- BLAST在Windows系统中本地化
简介 NCBI除了提供在线的Web BLAST序列比对服务外,还提供FTP方式下载序列比对工具.这允许在本地平台上针对从NCBI下载或本地创建的数据库执行BLAST搜索.这些实用程序没有图形用户界面, ...
- 截止JDK1.8版本,java并发框架支持锁包括?
读写锁 自旋锁 乐观锁
- idea中,使用facets添加完web后,项目已变为web项目,但web.xml中内容经常变为红色,并报错,如何解决?
这中错误经常是由于配置facets并添加完web后,没有进一步配置web.xml文件,导致web.xml是使用系统默认的. 如图:需要进一步配置web.xml文件,使用我们src/main/webap ...
- uboot——详解各目录下的文件作用
uboot下载地址:http://ftp.denx.de/pub/u-boot/ 1.目录分布 2.目录结构变化: u-boot-2010.03及以前版本 ├── api ...
- -bash: ./bak_1.py: /usr/bin/python^M: bad interpreter: 没有那个文件或目录
在Windows的PyCharm中编写了一个Python文件,然后上传至CentOS中,已经添加执行权限,但是仍然会报如下的错误: 代码如下: #!/usr/bin/python # -*- codi ...
- android 手写万能adapter适配器
android开发中,我们离不开adapter,每个项目都有很多地方需要adapter,那么我们如何让自己少写adapter代码呢?那就是封装adapter,让我们的adapter成为万能的adapt ...