验证码识别处理--基于java(二)

先给出要处理的验证码地址(地址后面为随机数字,便于生成不同的验证码)
http://vote.sun0769.com/include/ ... 1025&rid=866359

 
(图标应该为bmp的,因为论坛限制,给存为jpg格式上传了)

看到此验证码,开始想到的步骤就是二值化、去干扰线,分割字符,在做样品对比
但在用画图打开多个验证码图片后有新的想法
(放大到800%,开启网格线,因论坛图片限制,左右两侧空白有剪切掉,实际上就是看到每个单元格就是一个像素点)
 

观察图像后发现,只有0~9共10个数字,且无变形无偏斜,在多个验证码中都保持大小一致,验证码中字体颜色和干扰线颜色一致,且和背景色对比鲜明

如果把10个数字裁剪下来,然后将每个数字对应字符点阵和验证码图象中字符点阵匹配像素进行对比,可按百分比或完全一致来判断每个数字在验证码中是否存在及存在的坐标点位置,这样可无视干扰线存在
 

以下是代码

  1. import inet.http; 
  2. import soImage;
  3. import console;
  4. math.randomize();

  5. //创建图像
  6. var img1 = soImage();
  7. var img2 = soImage();

  8. //内存加载图像文件
  9. img2.setBytes(
  10.     inet.http().get("http://vote.sun0769.com/include/captcha.asp?s=signup1025&rid="++math.random(100000,999999))
  11.           ,"*.bmp"
  12. );

  13. img2.paint();        
  14. //首先计算出图片的高度宽度
  15. var w2 = img2.getWidth();
  16. var h2 = img2.getHeight();
  17.         
  18. //遍历图像中的所有点,将验证码字体改为黑色(像素点是从0开始的)
  19. for(o=0;w2-1;1){
  20.     for(p=0;h2-1;1){
  21.         if(img2.getPixel(o,p)!=15527662 and img2.getPixel(o,p)!=14679807) {        
  22.                   img2.setPixel(o,p,0);//黑色
  23.         }
  24.     }
  25. }

  26. var tab={};
  27. for(x=0;9;1){        
  28.         img1.load(io.fullpath("/res/"++x++".bmp"));

  29.         var w1 = img1.getWidth();
  30.         var h1 = img1.getHeight();

  31.         //将img1中黑色字体位置写入到数组中,便于和img2图像对比
  32.         var tab1={};
  33.         for(i=0;w1-1;1){
  34.                 for(j=0;h1-1;1){        
  35.                         if(img1.getPixel(i,j)==0){
  36.                         table.push(tab1,{i;j})
  37.                         }
  38.                 }
  39.         }
  40.     //对比黑点,以左上角的坐标点为参考,满足完全重合条件的坐标点记录到tab2中
  41.         var tab2={};
  42.         for(m=0;w2-w1;1){
  43.                 for(n=0;h2-h1;1){                        
  44.                         for(k=1;#tab1;1){
  45.                                 if(img2.getPixel(m+tab1[k][1]-1,n+tab1[k][2]-1)!=0 and k<#tab1){
  46.                                         break 1;
  47.                                 }
  48.                                 elseif(img2.getPixel(m+tab1[#tab1][1]-1,n+tab1[#tab1][2]-1)==0 and k==#tab1){
  49.                                     table.push(tab2,{m;n})
  50.                                 }        
  51.                         }
  52.                 }
  53.         }

  54.         if(#tab2>=1){
  55.                 for(z=1;#tab2;1){
  56.                         table.push(tab,{x;tab2[z][1]})
  57.                 }
  58.         }

  59. }
  60. //按坐标点的X轴大小重新排序
  61. table.sort(tab,function(b){
  62.     return owner[2] < b[2]
  63. });

  64. var captcha='';
  65. for(y=1;#tab;1){
  66.         captcha = captcha ++tab[y][1];
  67. }

  68. console.log(captcha)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值