aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 19538|回复: 17

验证码识别 - 种子填充算法

  [复制链接]

170

主题

2187

回帖

1万

积分

管理员

积分
13251
发表于 2012-10-21 19:38:02 | 显示全部楼层 |阅读模式
测试图片.png


  1. scanImage = function(img,crop){

  2.     var tlines = {};
  3.    
  4.     //首先计算出图片的高度宽度,避免重复的调用
  5.     var w = img.getWidth();
  6.     var h = img.getHeight();

  7.     /*
  8.     作用相当一个开关,首先值为false,但黑点首次被遍历到时。把这个值变为true。
  9.     下次,再找到这个点时忽略。避免重复加入连通线。  
  10.     */
  11.     var tChked ={};
  12.     for(i=0;w;1){
  13.        tChked[ i ]={};
  14.         for(j=0;h;1){
  15.             tChked[ i ][j]=false;
  16.         }
  17.     }
  18.      
  19.     ////-去噪
  20.     img.bpp(1);
  21.     img.bpp(24);
  22.      
  23.     //首先计算出各点的颜色值,避免在循环递归中重复的取
  24.     var tcl={};
  25.     for(i=0;w;1){
  26.         tcl[ i ]={};
  27.         for(j=0;h;1){
  28.             tcl[ i ][j]=img.getPixel(i,j);
  29.         }
  30.     }

  31.    
  32.     /*
  33.     算点数函数
  34.     参数x,y 坐标
  35.     参数tab 所属连通线;
  36.     */
  37.     var function seed(x,y,tab){
  38.    
  39.         //-出界了则返回
  40.         if(x<0 or y<0 or x>w or y>h) {
  41.             return;
  42.         };
  43.               
  44.         //-点的颜色为白色时,返回,不处理。
  45.         if(tcl[x][y]==16777215) {
  46.             return;
  47.         };
  48.         
  49.         //-值为1,则计数加1,返回
  50.         if ( tChked[x][y]) {
  51.             return ;
  52.         }
  53.         else{
  54.             table.insert(tab,{x=x;y=y} );//添加到连通线里
  55.             tChked[x][y]=true;//-当值为0时,把值置为1。
  56.             seed(x+1,y-1,tab);
  57.             seed(x,y-1,tab);
  58.             seed(x-1,y-1,tab);
  59.             seed(x-1,y,tab);
  60.             seed(x+1,y,tab);
  61.             seed(x-1,y+1,tab);
  62.             seed(x,y+1,tab);
  63.             return seed(x+1,y+1,tab); //这里可以用一个尾调用(参考教程中的函数部分),加快递归的速度。
  64.         };
  65.     };
  66.   
  67.     ////遍历图像中的所有点
  68.     for(i=0;w;1){
  69.        for(j=0;h;1){
  70.             //-如果是黑色的点,而且没有被计过数,则调用seed函数。
  71.             if(tcl[ i ][j]==0 and (not tChked[ i ][j])) {        
  72.                 var tab = {}
  73.                 seed(i,j,tab);
  74.                 table.insert(tlines,tab); //添加一条连通线
  75.             };
  76.         };
  77.     };
  78.          
  79.     //现在tlines 里记录了的有的连通线,我们现在需要根据连通线的长度排序  
  80.     var sproc =  function( line ) {  
  81.         return #owner > #line;//长的连通线排到前面
  82.     }
  83.     table.sort(tlines,sproc)
  84.                
  85.     //把图像全部画成白色的点      
  86.     for(i=0;w;1){
  87.         for(j=0;h;1){
  88.             img.setPixel( i , j, 16777215);
  89.         };
  90.     };
  91.          
  92.     //然后把最长的一条连通线画上去
  93.     for(i=1;#tlines[1];1){
  94.        var point = tlines[1][ i ]
  95.        img.setPixel( point.x, point.y , 0);
  96.     }
  97.   
  98.     //如果需要去掉周围的空白
  99.     if(crop){
  100.         var n = #(tlines[1])
  101.             
  102.         //排序最长连通线中的所有坐标点
  103.         var sproc =  function( pt ) {   
  104.             return  (owner.x < pt.x );//*左的排前面
  105.         };
  106.         table.sort(tlines[1],sproc);
  107.         var x,x2 = tlines[1][1].x, tlines[1][n].x;
  108.    
  109.         //排序最长连通线中的所有坐标点
  110.         var sproc =  function( pt ){   
  111.             return ( owner.y < pt.y );//*上的排前面
  112.         };
  113.         table.sort(tlines[1],sproc);
  114.         var y,y2 = tlines[1][1].y, tlines[1][n].y;
  115.         
  116.         img.crop( x,y,x2+1,y2)
  117.     }
  118.    
  119. };

  120. import inet.http;
  121. import soImage;

  122. var img = soImage();
  123. img.setBytes(
  124.         inet.http.get("http://bbs.aardio.com/data/attachment/forum/201210/21/193552w2epoh10qwgqcqxq.png")
  125.     ,"*.png" )
  126.    
  127. img.paint(); //在屏幕上处理前的图像
  128. var w,h = img.getWidth(),img.getHeight()

  129. scanImage(img,true);

  130. img.resize(w,h);
  131. img.paint(); //在屏幕上显示处理后的图像

复制代码

评分

参与人数 3 +170 收起 理由
aaucn + 60 很给力!
cqtts + 20 太需要了这个识别了,感谢老大
ljtnine + 90 很给力!

查看全部评分

6

主题

52

回帖

453

积分

二级会员

积分
453
发表于 2012-10-21 20:40:36 | 显示全部楼层
试验了一下 很快很好用,楼主辛苦了 ,感谢

20

主题

294

回帖

1945

积分

新手入门

积分
1945
发表于 2012-10-21 21:02:48 | 显示全部楼层
mark 收藏。加分。

117

主题

1103

回帖

6572

积分

六级会员

积分
6572
发表于 2012-10-22 07:44:30 | 显示全部楼层
超强

37

主题

147

回帖

1240

积分

四级会员

积分
1240
发表于 2012-10-22 15:17:26 | 显示全部楼层
很好

0

主题

37

回帖

363

积分

二级会员

积分
363
发表于 2012-10-22 16:46:47 | 显示全部楼层
试试看看.

0

主题

35

回帖

512

积分

荣誉会员

积分
512
发表于 2012-10-23 08:50:34 | 显示全部楼层
多谢楼主分享,太强了

23

主题

381

回帖

2240

积分

五级会员

积分
2240
发表于 2012-10-23 11:39:43 | 显示全部楼层
图形处理的好应用。

48

主题

542

回帖

3328

积分

五级会员

积分
3328
发表于 2012-10-24 23:26:06 | 显示全部楼层
谢谢分享

8

主题

18

回帖

302

积分

二级会员

积分
302
QQ
发表于 2012-10-25 11:38:16 | 显示全部楼层
2012-10-25_113655.jpg
为什么我这里偶尔会报错,这个是联通10010.com用户登录的验证码,但是如果最后一位是小写的e的话,就降噪不了了呢?
求解

8

主题

18

回帖

302

积分

二级会员

积分
302
QQ
发表于 2012-10-26 11:04:25 | 显示全部楼层
wisefox 发表于 2012-10-25 11:38
为什么我这里偶尔会报错,这个是联通10010.com用户登录的验证码,但是如果最后一位是小写的e的话,就降噪不了 ...

恩,刚开始没仔细看函数,后来明白了~~感谢

48

主题

542

回帖

3328

积分

五级会员

积分
3328
发表于 2012-10-27 23:07:42 | 显示全部楼层
wisefox 发表于 2012-10-26 11:04
恩,刚开始没仔细看函数,后来明白了~~感谢

能分享下明白的部分吗?我也很想知道为什么

1

主题

28

回帖

228

积分

培训班

积分
228
发表于 2012-10-30 09:42:29 | 显示全部楼层
越来越强大啦

8

主题

56

回帖

464

积分

二级会员

积分
464
发表于 2012-11-17 21:39:04 | 显示全部楼层

好强大的例子啊!马克了!

0

主题

7

回帖

42

积分

新手入门

积分
42
发表于 2013-3-6 21:06:30 | 显示全部楼层
感谢 很好用

1

主题

21

回帖

136

积分

一级会员

积分
136
发表于 2013-4-12 16:10:39 | 显示全部楼层
谢谢楼主,研究研究

3

主题

41

回帖

322

积分

二级会员

积分
322
发表于 2013-11-28 00:12:37 | 显示全部楼层
感谢分享!困绕多时的问题一直放置,现在终于通过种子填充法解决了。aardio真的很强大!

0

主题

11

回帖

81

积分

一级会员

积分
81
发表于 2016-1-9 15:59:08 | 显示全部楼层
怎么才能把结果填到eng里面去呢?
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2023-3-28 14:00 , Processed in 0.081117 second(s), 35 queries .

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

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