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

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<width;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<width;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 }
以上代码只限于这类验证码  的干扰像素的去除 ,其他的验证码类型还待测试!

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

原文地址:https://www.cnblogs.com/haojieli/p/6212627.html