Java 丨验证码图片去除干扰像素,方便验证码的识别

本贴最后更新于 2941 天前,其中的信息可能已经东海扬尘

1、先来看看效果:

原图

除去干扰像素后

2、解析代码:

1)、读取文件夹里面的图片

1 String fileName = "picture"; 2 BufferedImage img = ImageIO.read(new File("img//"+fileName+".jpg"));

2)、获取图片的宽度和高度

1 int width = img.getWidth(); 2 int height = img.getHeight();

3)、循环执行除去干扰像素

1 for(int i = 1;i < width;i++){
2   Color colorFirst = new Color(img.getRGB(i, 1));
3 int numFirstGet = colorFirst.getRed()+colorFirst.getGreen()+colorFirst.getBlue();
4   for (int x = 0; x < width; x++)
5 {
6   for (int y = 0; y < height; y++)
7   {
8     Color color = new Color(img.getRGB(x, y)); 9   System.out.println("red:"+color.getRed()+" | green:"+color.getGreen()+" | blue:"+color.getBlue()); 10 int num = color.getRed()+color.getGreen()+color.getBlue(); 11 if(num >= numFirstGet){ 12 img.setRGB(x, y, Color.WHITE.getRGB()); 13 } 14 } 15 } 16}

4)、图片背景变黑,验证码变白色

1      for(int i = 1;i){
2 Color color1 = new Color(img.getRGB(i, 1));
3 int num1 = color1.getRed()+color1.getGreen()+color1.getBlue();
4 for (int x = 0; x < width; x++)
5 {
6 for (int y = 0; y < height; y++)
7 {
8 Color color = new Color(img.getRGB(x, y)); 9 System.out.println("red:"+color.getRed()+" | green:"+color.getGreen()+" | blue:"+color.getBlue()); 10 int num = color.getRed()+color.getGreen()+color.getBlue(); 11 if(num==num1){ 12 img.setRGB(x, y, Color.BLACK.getRGB()); 13 }else{ 14 img.setRGB(x, y, Color.WHITE.getRGB()); 15 } 16 } 17 } 18 }

5)、保存图片

1      File file = new File("img\temp\"+fileName+".jpg");
2 if (!file.exists())
3 {
4 File dir = file.getParentFile(); 5 if (!dir.exists())
6 {
7 dir.mkdirs();
8 }
9 try
10 { 11 file.createNewFile(); 12 } 13 catch (IOException e) 14 { 15 e.printStackTrace(); 16 } 17 } 18 ImageIO.write(img, "jpg", file);

3、重要代码:

BufferedImage img = ImageIO.read(new File("img//"+fileName+".jpg"));

Color color1 = new Color(img.getRGB(i, 1));
int num1 = color1.getRed()+color1.getGreen()+color1.getBlue();

getRed()、getGreen()、getBlue()这三个方法分别是获取图片每一个像素的三原色(注释:每一种颜色都是由红、绿、蓝组成的)

4、原理:

1)、获取图片的高度和宽度
2)、循环获取图片的每一个像素的值
3)、把每一排的像素值用来作为对比的标准从而替代颜色相同的为白色(横向和纵向都可以循环一次,这里我只循环了横向的像素)
4)、循环获取像素,替代验证码背景为黑色(在这个步骤验证码的背景已经是白色的,数字的颜色还没有替换,所以我们循环一次把白色换为黑色,不是白色的换成白色)

5、所有代码:

1 package com.haojieli.main; 2
3 import java.awt.Color; 4 import java.awt.image.BufferedImage; 5 import java.io.File; 6 import java.io.IOException; 7
8 import javax.imageio.ImageIO; 9
10 public class PictureRemove { 11
12 public static void main(String[] args) throws IOException { 13 //读取文件夹里面的图片
14 String fileName = "picture"; 15 BufferedImage img = ImageIO.read(new File("img//"+fileName+".jpg")); 16 //获取图片的高宽
17 int width = img.getWidth(); 18 int height = img.getHeight(); 19
20 //循环执行除去干扰像素
21 for(int i = 1;i < width;i++){ 22 Color colorFirst = new Color(img.getRGB(i, 1)); 23 int numFirstGet = colorFirst.getRed()+colorFirst.getGreen()+colorFirst.getBlue(); 24 for (int x = 0; x < width; x++) 25 { 26 for (int y = 0; y < height; y++) 27 { 28 Color color = new Color(img.getRGB(x, y)); 29 System.out.println("red:"+color.getRed()+" | green:"+color.getGreen()+" | blue:"+color.getBlue()); 30 int num = color.getRed()+color.getGreen()+color.getBlue(); 31 if(num >= numFirstGet){ 32 img.setRGB(x, y, Color.WHITE.getRGB()); 33 } 34 } 35 } 36 } 37
38 //图片背景变黑色
39 for(int i = 1;i){ 40 Color color1 = new Color(img.getRGB(i, 1)); 41 int num1 = color1.getRed()+color1.getGreen()+color1.getBlue(); 42 for (int x = 0; x < width; x++) 43 { 44 for (int y = 0; y < height; y++) 45 { 46 Color color = new Color(img.getRGB(x, y)); 47 System.out.println("red:"+color.getRed()+" | green:"+color.getGreen()+" | blue:"+color.getBlue()); 48 int num = color.getRed()+color.getGreen()+color.getBlue(); 49 if(num==num1){ 50 img.setRGB(x, y, Color.BLACK.getRGB()); 51 }else{ 52 img.setRGB(x, y, Color.WHITE.getRGB()); 53 } 54 } 55 } 56 } 57 //保存图片
58 File file = new File("img\temp\"+fileName+".jpg"); 59 if (!file.exists()) 60 { 61 File dir = file.getParentFile(); 62 if (!dir.exists()) 63 { 64 dir.mkdirs(); 65 } 66 try
67 { 68 file.createNewFile(); 69 } 70 catch (IOException e) 71 { 72 e.printStackTrace(); 73 } 74 } 75 ImageIO.write(img, "jpg", file); 76 } 77 }

**以上代码只限于这类验证码 的干扰像素的去除 ,其他的验证码类型还待测试!

博文到此结束,祝各位读者生活愉快!**

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    199 引用 • 541 回帖 • 1 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    951 引用 • 943 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    36 引用 • 155 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 393 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 413 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 87 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 2 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 545 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    28 引用 • 226 回帖 • 135 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 731 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 168 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 45 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    132 引用 • 796 回帖 • 1 关注
  • 倾城之链
    23 引用 • 66 回帖 • 158 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • 叶归
    5 引用 • 16 回帖 • 10 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 20 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 568 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 2 关注
  • 自由行
    1 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    93 引用 • 901 回帖