zoukankan      html  css  js  c++  java
  • 【Selenium-WebDriver实战篇】Java丨验证码图片去除干扰像素,方便验证码的识别(转)

    参考地址:https://www.cnblogs.com/haojieli/p/6212627.html

    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)、循环执行除去干扰像素

    按 Ctrl+C 复制代码
    按 Ctrl+C 复制代码

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

    按 Ctrl+C 复制代码
    按 Ctrl+C 复制代码

    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 }
    复制代码
    以上代码只限于这类验证码  的干扰像素的去除 ,其他的验证码类型还待测试!
  • 相关阅读:
    C++笔记-智能指针 shared_ptr
    Linux笔记-性能调优工具perf
    git submodule 如何push代码
    性能测试工具gperftools使用
    Linux信号使用及自定义信号
    DNN在推荐系统中的应用参考资料
    vscode远程代码同步
    感知机模型到DNN模型
    c++笔记-libcurl多线程并发时的core【转载】
    go笔记-熔断器
  • 原文地址:https://www.cnblogs.com/conquerorren/p/11867090.html
Copyright © 2011-2022 走看看