Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 345|回复: 0

[jsp学习]简单图形验证码的识别

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 15:19:05 | 显示全部楼层 |阅读模式
    1.    文章来源:
    2. http://zzzhc.spaces.msn.com/blog

    3.                                      /cns!3905D34B10C3C381!129.entry  
    4.    

    5.       对于简单的图形验证码(字体规则,没有杂点或杂点容易过滤掉),
    6. 用模板匹配的方式可以比较容易地识别出来.
    7.   0.图片黑白化,用1表示有字的像素,0表示无字的像素
    8.   1.字块分隔,将图片分隔成只包含成单字的最小块
    9.   2.生成模板,将字块与字符关联
    10.   3.识别,将新图片分块并与模板匹配
    11. java(jdk1.5)实现:
    12. //先运行TemplateCreator创建模板,再运行Recognize2识别
    13.                      
    复制代码

      

    1. //图片数据表示,也用来表示字块
    2. package pay365;
    3. import java.awt.image.BufferedImage;
    4. import java.io.BufferedReader;
    5. import java.io.File;
    6. import java.io.FileReader;
    7. import java.io.IOException;
    8. import java.util.ArrayList;
    9. import java.util.Iterator;
    10. public class ImageData {
    11.     public int[][] data;
    12.     public int w;
    13.     public int h;
    14.     public char code;
    15.    
    16.     public ImageData() {
    17.     }
    18.    
    19.     public ImageData(BufferedImage bi) {
    20.         this(bi,new WhiteFilter());
    21.     }
    22.     public ImageData(BufferedImage bi,Filter filter) {
    23.         h = bi.getHeight();
    24.         w = bi.getWidth();
    25.         data = new int[h][w];
    26.         for (int i = 0; i < h; i++) {
    27.             for (int j = 0; j < w; j++) {
    28.                 int p = bi.getRGB(j, i);
    29.                 data[i][j] = p;
    30.             }
    31.         }
    32.         filter.doFilter(data);
    33.     }
    34.     public ImageData[] split() {
    35.         ArrayList list = new ArrayList();
    36.         ImageIterator ite = new ImageIterator(this);
    37.         while (ite.hasNext()) {
    38.             list.add(ite.next());
    39.         }
    40.         return (ImageData[]) list.toArray(new ImageData[0]);
    41.     }
    42.     int skipEmpty(int begin, boolean isX, int value) {
    43.         if (isX) {
    44.             for (int i = begin; i < w; i++) {
    45.                 for (int j = 0; j < h; j++) {
    46.                     if (data[j][i] != value) {
    47.                         return i;
    48.                     }
    49.                 }
    50.             }
    51.             return -1;
    52.         } else {
    53.             for (int i = begin; i < h; i++) {
    54.                 for (int j = 0; j < w; j++) {
    55.                     if (data[i][j] != value) {
    56.                         return i;
    57.                     }
    58.                 }
    59.             }
    60.             return -1;
    61.         }
    62.     }
    63.     int skipEntity(int begin, boolean isX, int value) {
    64.         if (isX) {
    65.             for (int i = begin; i < w; i++) {
    66.                 for (int j = 0; j < h; j++) {
    67.                     if (data[j][i] == value) {
    68.                         break;
    69.                     }
    70.                     if (j == h - 1)
    71.                         return i;
    72.                 }
    73.             }
    74.             return -1;
    75.         } else {
    76.             for (int i = begin; i < h; i++) {
    77.                 for (int j = 0; j < w; j++) {
    78.                     if (data[i][j] == value) {
    79.                         break;
    80.                     }
    81.                     if (j == w - 1)
    82.                         return i;
    83.                 }
    84.             }
    85.             return -1;
    86.         }
    87.     }
    88.     class ImageIterator implements Iterator {
    89.         int x;
    90.         ImageData ia;
    91.         ImageData next;
    92.         public ImageIterator(ImageData ia) {
    93.             this.ia = ia;
    94.         }
    95.         public boolean hasNext() {
    96.             if (next != null)
    97.                 return true;
    98.             next = getNext();
    99.             return next != null;
    100.         }
    101.         ImageData getNext() {
    102.             int x1 = skipEmpty(x, true, 0);
    103.             if (x1 == -1) {
    104.                 return null;
    105.             }
    106.             int x2 = skipEntity(x1, true, 1);
    107.             if (x2 == -1) {
    108.                 x2 = w;
    109.             }
    110.             x = x2;
    111.             int y1 = skipEmpty(0, false, 0);
    112.             if (y1 == -1)
    113.                 return null;
    114.             int y2 = skipEntity(y1, false, 1);
    115.             if (y2 == -1)
    116.                 y2 = h;
    117.             return ia.clone(x1, y1, x2 - x1, y2 - y1);
    118.         }
    119.         public Object next() {
    120.             ImageData temp = next;
    121.             next = null;
    122.             return temp;
    123.         }
    124.         public void remove() {
    125.         }
    126.     }
    127.     ImageData clone(int x, int y, int w0, int h0) {
    128.         ImageData ia = new ImageData();
    129.         ia.w = w0;
    130.         ia.h = h0;
    131.         ia.data = new int[ia.h][ia.w];
    132.         for (int i = 0; i < h0; i++) {
    133.             for (int j = 0; j < w0; j++) {
    134.                 ia.data[i][j] = data[i + y][j + x];
    135.             }
    136.         }
    137.         return ia;
    138.     }
    139.     public void show() {
    140.         System.out.println();
    141.         for (int i = 0; i < h; i++) {
    142.             for (int j = 0; j < w; j++) {
    143.                 System.out.print((data[i][j] == 1 ? "1" : " ") + "");
    144.             }
    145.             System.out.println();
    146.         }
    147.         System.out.println();
    148.     }
    149.     public int hashCode() {
    150.         int code = w ^ h;
    151.         int count = 0;
    152.         for (int i = 0; i < h; i++) {
    153.             for (int j = 0; j < w; j++) {
    154.                 if (data[i][j] == 1)
    155.                     count++;
    156.             }
    157.         }
    158.         code ^= count;
    159.         return code;
    160.     }
    161.     public boolean equals(Object obj) {
    162.         if (this == obj) {
    163.             return true;
    164.         }
    165.         if (obj instanceof ImageData) {
    166.             ImageData o = (ImageData) obj;
    167.             if (o.h != h)
    168.                 return false;
    169.             if (o.w != w)
    170.                 return false;
    171.             for (int i = 0; i < h; i++) {
    172.                 for (int j = 0; j < w; j++) {
    173.                     if (o.data[i][j] != data[i][j])
    174.                         return false;
    175.                 }
    176.             }
    177.             return true;
    178.         } else {
    179.             return false;
    180.         }
    181.     }
    182.     public static ImageData[] decodeFromFile(String path) throws IOException {
    183.         BufferedReader reader = new BufferedReader(new FileReader(
    184.                 new File(path)));
    185.         String line;
    186.         ArrayList list = new ArrayList();
    187.         while ((line = reader.readLine()) != null) {
    188.             ImageData ia = decode(line);
    189.             if (ia != null) {
    190.                 list.add(ia);
    191.             }
    192.         }
    193.         return (ImageData[]) list.toArray(new ImageData[0]);
    194.     }
    195.     public static ImageData decode(String s) {
    196.         String[] ss = s.split("\,", 4);
    197.         if (ss.length != 4)
    198.             return null;
    199.         if (ss[0].length() != 1)
    200.             return null;
    201.         ImageData ia = new ImageData();
    202.         ia.code = ss[0].charAt(0);
    203.         ia.w = Integer.parseInt(ss[1]);
    204.         ia.h = Integer.parseInt(ss[2]);
    205.         if (ss[3].length() != ia.w * ia.h) {
    206.             return null;
    207.         }
    208.         ia.data = new int[ia.h][ia.w];
    209.         for (int i = 0; i < ia.h; i++) {
    210.             for (int j = 0; j < ia.w; j++) {
    211.                 if (ss[3].charAt(i * ia.w + j) =="1") {
    212.                     ia.data[i][j] = 1;
    213.                 } else {
    214.                     ia.data[i][j] = 0;
    215.                 }
    216.             }
    217.         }
    218.         return ia;
    219.     }
    220.     public String encode() {
    221.         StringBuffer sb = new StringBuffer();
    222.         sb.append(code).append(",");
    223.         sb.append(w).append(",");
    224.         sb.append(h).append(",");
    225.         for (int i = 0; i < h; i++) {
    226.             for (int j = 0; j < w; j++) {
    227.                 if (data[i][j] == 1) {
    228.                     sb.append("1");
    229.                 } else {
    230.                     sb.append("0");
    231.                 }
    232.             }
    233.         }
    234.         return sb.toString();
    235.     }
    236. }
    237. //像素过滤接口
    238. package pay365;
    239. public interface Filter {
    240.    
    241.     void doFilter(int[][] data);
    242. }
    243. //
    244. package pay365;
    245. public abstract class AbstractFilter  implements Filter {
    246.     public void doFilter(int[][] data) {
    247.         int h = data.length;
    248.         if (h<=0)
    249.             return;
    250.         int w = data[0].length;
    251.         if (w<=0)
    252.             return ;
    253.         for(int i=0;i< h;i++) {
    254.             for(int j=0;j< w;j++) {
    255.                 data[i][j] = filter(data[i][j]);
    256.             }
    257.         }
    258.     }
    259.    
    260.     protected abstract int filter(int p);
    261. }
    262. //过滤csdn验证码的过滤器
    263. package pay365;
    264. public class CsdnFilter extends AbstractFilter {
    265.     protected int filter(int p) {
    266.         return isNotWhite(p)?1:0;
    267.     }
    268.     private boolean isNotWhite(int p) {
    269.         boolean b = (p & 0&times;0ff) == 255 && (p >> 8 & 0&times;0ff) == 255
    270.                 && (p >> 16 & 0xff) == 255;
    271.         return !b;
    272.     }
    273. }
    274. //过滤前景色为白色的过滤器
    275. package pay365;
    276. public class WhiteFilter extends AbstractFilter {
    277.    
    278.     protected int filter(int p) {
    279.         if (isWhite(p)) {
    280.             return 1;
    281.         }
    282.         else {
    283.             return 0;
    284.         }
    285.     }
    286.     private boolean isWhite(int p) {
    287.         return (p & 0x0ff) > 240 && (p >> 8 & 0x0ff) > 240
    288.                 && (p >> 16 & 0xff) > 240;
    289.     }
    290. }
    291. //模板创建类
    292. package pay365;
    293. import java.awt.image.BufferedImage;
    294. import java.io.BufferedReader;
    295. import java.io.File;
    296. import java.io.InputStreamReader;
    297. import java.io.PrintWriter;
    298. import java.net.URL;
    299. import java.util.HashSet;
    300. import java.util.Iterator;
    301. import java.util.Set;
    302. import javax.imageio.ImageIO;
    303. public class TemplateCreator {
    304.     /**
    305.      * @param args
    306.      */
    307.     public static void main(String[] args) throws Exception {
    308.         Set set = new HashSet();
    309.         
    310.         String url = "http://passport.csdn.net/member/ShowExPwd.aspx";
    311.         String filterClazz = "pay365.CsdnFilter";
    312.         if (args.length>=1) {
    313.             url = args[0];
    314.         }
    315.         if (args.length>=2) {
    316.             filterClazz = args[1];
    317.         }
    318.         Filter csdnFilter = (Filter) Class.forName(filterClazz).newInstance();
    319.         for (int i = 1; i < 10; i++) {
    320.             URL u = new URL(url);
    321.             BufferedImage bi = ImageIO.read(u);
    322.             ImageData ia2 = new ImageData(bi,csdnFilter);
    323.             ImageData[] ii = ia2.split();
    324.             for (int x = 0; x < ii.length; x++) {
    325.                 ImageData imageArr = ii[x];
    326.                 set.add(imageArr);
    327.             }
    328.             // set.addAll(Arrays.asList(ia2.split()));
    329.         }
    330.         System.out.println(set.size());
    331.         for (Iterator iter = set.iterator(); iter.hasNext();) {
    332.             ImageData ele = (ImageData) iter.next();
    333.             ele.show();
    334.             System.out.print("char:");
    335.             String s = readLine();
    336.             if (s.length() == 1) {
    337.                 ele.code = s.charAt(0);
    338.             }
    339.         }
    340.         
    341.         PrintWriter pw = new PrintWriter(new File("template.data"));
    342.         for (Iterator iter = set.iterator(); iter.hasNext();) {
    343.             ImageData ele = (ImageData) iter.next();
    344.             pw.println(ele.encode());
    345.         }
    346.         pw.flush();
    347.         pw.close();
    348.     }
    349.     private static BufferedReader reader = new BufferedReader(
    350.             new InputStreamReader(System.in));
    351.     private static String readLine() {
    352.         try {
    353.             return reader.readLine();
    354.         } catch (Exception e) {
    355.             e.printStackTrace();
    356.             return "";
    357.         }
    358.     }
    359. }
    360. //识别类
    361. package pay365;
    362. import java.awt.image.BufferedImage;
    363. import java.io.File;
    364. import java.io.IOException;
    365. import java.net.URL;
    366. import java.util.ArrayList;
    367. import java.util.HashMap;
    368. import java.util.Iterator;
    369. import javax.imageio.ImageIO;
    370. public class Recognize2 {
    371.     static String url = "http://passport.csdn.net/member/ShowExPwd.aspx";
    372.     static Filter filter;
    373.     public static void main(String[] args) throws Exception {
    374.         if (args.length >= 1) {
    375.             url = args[0];
    376.         }
    377.         String filterClazz = "pay365.CsdnFilter";
    378.         if (args.length >= 2) {
    379.             filterClazz = args[1];
    380.         }
    381.         filter = (Filter) Class.forName(filterClazz).newInstance();
    382.         int total = 10;
    383.         int count = 0;
    384.         for (int i = 0; i < total; i++) {
    385.             boolean b = recognize(i);
    386.             if (b)
    387.                 count++;
    388.         }
    389.         System.out.println("rate:" + (count * 1.0 / total * 100) + "%100");
    390.     }
    391.     /**
    392.      * @throws IOException
    393.      */
    394.     private static boolean recognize(int num) throws IOException {
    395.         BufferedImage bi = ImageIO.read(new URL(url));
    396.         ImageIO.write(bi,"png",new File(num+".png"));
    397.         ImageData ia2 = new ImageData(bi, filter);
    398.         ImageData[] ii = ia2.split();
    399.         ArrayList list = new ArrayList();
    400.         ImageData[] template = ImageData.decodeFromFile("template.data");
    401.         HashMap map = new HashMap();
    402.         for (int i = 0; i < template.length; i++) {
    403.             map.put(template[i], new Character(template[i].code));
    404.         }
    405.         for (int x = 0; x < ii.length; x++) {
    406.             ImageData imageArr = ii[x];
    407.             if (imageArr.w > 15)
    408.                 continue;
    409.             Character c = (Character) map.get(imageArr);
    410.             if (c != null) {
    411.                 list.add(c);
    412.             }
    413.         }
    414.         String s = "";
    415.         System.out.print(num + ":");
    416.         for (Iterator iter = list.iterator(); iter.hasNext();) {
    417.             Character c = (Character) iter.next();
    418.             s += c;
    419.             System.out.print(c);
    420.         }
    421.         System.out.println();
    422.         return s.length() != 0;
    423.     }
    424. }
    复制代码


      
      
       
       

         
       

         
       
      



    源码下载:http://file.javaxxz.com/2014/10/1/151905203.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-4 22:46 , Processed in 0.317776 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表