搜索
查看: 13502|回复: 17

[源码分享] 验证码识别 - 种子填充算法

    [复制链接]

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 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.whttp;
  121. import soImage;

  122. var img = soImage();
  123. img.setBytes(
  124.         inet.whttp().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

主题

59

帖子

441

积分

二级会员

Rank: 3Rank: 3

积分
441
发表于 2012-10-21 20:40:36 | 显示全部楼层

试验了一下 很快很好用,楼主辛苦了 ,感谢

试验了一下 很快很好用,楼主辛苦了 ,感谢
回复

使用道具 举报

20

主题

325

帖子

1945

积分

新手入门

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

mark 收藏。加分。{:lol}

mark 收藏。加分。
回复

使用道具 举报

117

主题

1237

帖子

6592

积分

六级会员

Rank: 9Rank: 9Rank: 9

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

超强

超强
回复

使用道具 举报

37

主题

184

帖子

1240

积分

四级会员

Rank: 6Rank: 6

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

很好

很好
回复

使用道具 举报

0

主题

42

帖子

363

积分

二级会员

Rank: 3Rank: 3

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

试试看看.

试试看看.
回复

使用道具 举报

0

主题

35

帖子

510

积分

荣誉会员

Rank: 8Rank: 8

积分
510
发表于 2012-10-23 08:50:34 | 显示全部楼层

多谢楼主分享,太强了

多谢楼主分享,太强了
回复

使用道具 举报

23

主题

411

帖子

2240

积分

五级会员

Rank: 8Rank: 8

积分
2240
发表于 2012-10-23 11:39:43 | 显示全部楼层

图形处理的好应用。

图形处理的好应用。
回复

使用道具 举报

48

主题

593

帖子

3336

积分

五级会员

Rank: 8Rank: 8

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

谢谢分享{:3_59:}

谢谢分享
回复

使用道具 举报

8

主题

26

帖子

294

积分

二级会员

Rank: 3Rank: 3

积分
294
QQ
发表于 2012-10-25 11:38:16 | 显示全部楼层

[attach]2545[/attach] 为什么我这里偶尔会报错,这个是联通10010.com用户登录的验证码,但是如果最后一位是小写的e的话,就降噪不了了

2012-10-25_113655.jpg
为什么我这里偶尔会报错,这个是联通10010.com用户登录的验证码,但是如果最后一位是小写的e的话,就降噪不了了呢?
求解

点评

你有点误解,种子填充算法是连通线检测,对于你贴出来的图片,那就是去掉最后的e, 算法需要活学活用,硬套上去不行的。  发表于 2012-10-25 11:56
回复

使用道具 举报

8

主题

26

帖子

294

积分

二级会员

Rank: 3Rank: 3

积分
294
QQ
发表于 2012-10-26 11:04:25 | 显示全部楼层

[quote][size=2][color=#999999]wisefox 发表于 2012-10-25 11:38[/color] [url=forum.ph

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

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

使用道具 举报

48

主题

593

帖子

3336

积分

五级会员

Rank: 8Rank: 8

积分
3336
发表于 2012-10-27 23:07:42 | 显示全部楼层

[quote][size=2][color=#999999]wisefox 发表于 2012-10-26 11:04[/color] [url=forum.ph

wisefox 发表于 2012-10-26 11:04
恩,刚开始没仔细看函数,后来明白了~~感谢

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

使用道具 举报

1

主题

30

帖子

227

积分

培训班

积分
227
发表于 2012-10-30 09:42:29 | 显示全部楼层

越来越强大啦

越来越强大啦
回复

使用道具 举报

8

主题

65

帖子

465

积分

二级会员

Rank: 3Rank: 3

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

{:3_41:} 好强大的例子啊!马克了!


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

使用道具 举报

0

主题

7

帖子

42

积分

新手入门

Rank: 1

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

感谢 很好用

感谢 很好用
回复

使用道具 举报

1

主题

23

帖子

136

积分

一级会员

Rank: 2

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

谢谢楼主,研究研究

谢谢楼主,研究研究
回复

使用道具 举报

3

主题

46

帖子

321

积分

二级会员

Rank: 3Rank: 3

积分
321
发表于 2013-11-28 00:12:37 | 显示全部楼层

感谢分享!困绕多时的问题一直放置,现在终于通过种子填充法解决了。aardio真的很强大!

感谢分享!困绕多时的问题一直放置,现在终于通过种子填充法解决了。aardio真的很强大!
人能走多远,这话不要问双脚而是要问志向;人能攀多高,这事不是要问双手而要问意志。
回复

使用道具 举报

0

主题

11

帖子

81

积分

一级会员

Rank: 2

积分
81
发表于 2016-1-9 15:59:08 | 显示全部楼层

怎么才能把结果填到eng里面去呢?

怎么才能把结果填到eng里面去呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2018-10-22 05:56 , Processed in 0.093750 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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