加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C#识别验证码

(2012-03-26 21:11:22)
标签:

验证码

识别

c

图片

杂谈

分类: C#
以天涯博客里的评论验证码为例,说明验证码识别的基本思路和方法: 
http://www.outdovote.cn/images/documents/image001.gif  
(网页截图) 

第一步、获取验证码图片 
C#可以用HttpWebRequest类GET验证码的网址,得到返回的数据流,再将数据流值赋给Bitmap变量。在Winform里放一个PictureBox控件,将它的Image属性指定为Bitmap变量,就可以显示出验证码图片了。 
也可以使用Bitmap的Save方法将图片保存成Bmp档案。 
C# code
Stream resStream = response.GetResponseStream();//得到验证码数据流 Bitmap sourcebm = new Bitmap(resStream);//初始化Bitmap图片
在Photoshop中将验证码图片放大1600%,如下: 
http://www.outdovote.cn/images/documents/image003.jpg  

第二步、将验证码图片去色(将彩色转换为灰度) 
去色是为了进一步做成黑白双色图片。 
C# code
Color c = sourcebm.GetPixel(x、y); int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);//转换灰度的算法 sourcebm.SetPixel(x、y、Color.FromArgb(luma、luma、luma));
http://www.outdovote.cn/images/documents/image005.jpg 

第三步、去杂色,转换为黑白图片 
从灰度图片中可以看出,数字的颜色比较深,而杂色都是比较浅,所以可以设定一个临界颜色值,颜色高于或等于这个值的设置为白色,低于这个值的设置为黑色。 
C# code
Color c = sourcebm.GetPixel(x、y); if (c.R >= critical_value) sourcebm.SetPixel(x、y、Color.FromArgb(255255255));
http://www.outdovote.cn/images/documents/image007.jpg 
C# code
else sourcebm.SetPixel(x、y、Color.FromArgb(000));
http://www.outdovote.cn/images/documents/image005.jpg 

第四步、动态得到每个数字的边界 
http://www.outdovote.cn/images/documents/image009.jpg  

C# code
for (int x = 0; x < sourcebm.Width; x++) { myColumn = true; for (int y = 0; y < sourcebm.Height; y++) { Color c = sourcebm.GetPixel(x、y); if (c.R == 0 && charStart == false)//第一次出现黑点 { widthStartX[charNum] = x; charStart = true; break; } if (c.R == 0 && charStart == true)//后续出现黑点 { myColumn = false; break; } } if (myColumn == true && charStart == true && widthStartX[charNum] < x)//如果当列没有黑点并且前面出现过黑点还没结束 { widthEndX[charNum] = x - 1; charStart = false; charNum++; } if (charStart == true && myColumn == false && x == (bmp.Width - 1))//如果开始出现黑点了,并且最后一列也有黑点 { widthEndX[charNum] = x; charStart = false; charNum++; } }
五、得到每个字符的特征码 
在每个字符的边界内,检测每个像素,如果象素为白色则为「0」,如果象素为黑色则为「1」,将「0」「1」连起来就是该数字或字符的特征码。 
C# code
Color c = sourcebm.GetPixel(x、y); if (c.R == 0) str = str + "1"; else str = str + "0";

六、完成验证码图片的识别 
将获取的特征码和对应的数字或字符保存起来,下次再将新获取的特征码跟保存的特征码对比,如果相同则提取对应的数字或字符,完成验证码的识别。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有