CSDN新版图形验证码初级识别

 这里的方法只是利用<csdn Blog发表评论验证码识别>思路和方法对CSDN新版特征码进行识别,只对一部分特征码有效。不过通过改进算法,应该可以得到很好的效果。

新版特征码举例如下:



初步分析,该特征码使用以下方式增加识别难度:

  1. 不单纯的背静色

  2. 随机出现的干扰线

  3. 随机出现的干扰点

  4. 不同字符颜色不一样

  5. 字符出现的位置不一样

  6. 字符之间的距离随机,还有可能连在一起。

  7. 使用了斜体字,即使不连接,也不能采用矩形方式获取其中的一个字符

现在开始针对上面的问题进行处理

我们先看一个操作,使用Windows自带的画图把保存的特征码以单色位图的方式保存,

现在看变化:变成,这样1、2、4三点的干扰就没意义了。

下面是放大400%下的效果

这步可以称为单色处理,要在程序中实现这步功能的代码如下

现在来处理干扰点了

这里的干扰点比较少,基本又是单独存在的,处理起来就更简单了。判断某个点上下左右8个位置有几个点是黑点就基本上可以判断了。下面是处理后的效果:

代码:

处理到这里,1-4的干扰基本被去除了。

下面开始截取字符(对应第5点),我这里使用了一个并不完美的办法,先获取每个字符的左右范围,再获取这个字符的上下范围,这样字符所在的矩形框就出来了,这里使用的字符太工整了,接下来识别没什么难度了;

范围确定以后的效果如下:

代码限于篇幅,这部分代码就不贴了。

到目前为止,第6-7点还没有被提及,这就是该特征码难度较高的部分。

比如开头的9张样本中,第2、3行的第三张用默认的单色算法完成以后太失真了

其次字符连在一起给分析字符位置(至少是目前的处理方法)带来很大的难度,下面是2个典型的例子:

这些都要优化算法。

本文未完,请关注该地址:http://blog.csdn.net/Qqwwee_Com/archive/2006/02/09/595607.aspx



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=595607


<script src="http://localhost:82/PromoteIcon.aspx?id=595607" type="text/javascript"></script> [ 收藏到我的网摘]   梦网SSO发表于 2006年02月09日 21:43:00
<script type="text/javascript">function hide(){showComment();}</script>


特别推荐:

#   H_J_H 发表于2006-03-16 12:07:00  IP: 211.100.21.*
TrackBack来自 《CSDN新版图形验证码初级识别 》

CSDN新版图形验证码初级识别

#   Ivony 发表于2006-02-10 23:05:00  IP: 222.240.89.*
强……你在CSDN的地盘破解他的网站……

#   阿9 发表于2006-02-11 13:27:00  IP: 218.80.23.*
真是高人啊 能不能给出完整源代码学习学习啊

#    Snow_Young 发表于2006-02-10 21:14:00  IP: 219.148.90.*
嗯,很不错呢。

#    过客 发表于2006-02-12 10:10:00  IP: 61.51.192.*
说起来,历史上也少有想 CSDN 这样用这么清晰、规整的字体和背景做识别码的。

#   啦了 发表于2006-02-12 21:00:00  IP: 222.241.102.*
对于连在一起的字符可用统计方法分割识别.

#    ghj1976 发表于2006-02-13 09:06:00  IP:
1、这部分验证码代码是我写的。
2、CSDN 计划在今年上班年提供登录、新社区的WEB Service API
3、你可以联系我,在这个登录 Web Service 测试阶段,一起来测试, 我的 邮件: ghj1976@csdn.net

#   Solstice 发表于2006-02-13 01:28:00  IP: 220.166.149.*
我建议CSDN用常用汉字做验证码。

#    test 发表于2006-03-24 12:52:00  IP: 211.90.95.*
test

#    bluebird2 发表于2006-04-05 09:15:00  IP: 222.184.52.*
期待写完

#   lovevsnet 发表于2006-04-06 20:34:00  IP: 218.73.84.*
兄弟,给出全部的识别方法吧
期待!

#   lovevsnet 发表于2006-04-06 20:34:00  IP: 218.73.84.*
兄弟,给出全部的识别方法吧
期待!

#   FarSeek 发表于2006-04-13 11:23:00  IP: 222.79.36.*
Math.Round(((color.R * 0.299) + (color.G * 0.587) + (color.B * 0.114)) / 255)

这句话的颜色值是怎么算的??

#   Qqwwee_Com 发表于2006-04-13 15:20:00  IP: 218.17.96.*
是灰度。

》》》》》==========
FarSeek 发表于2006-04-13 11:23 AM IP: 222.79.36.*
Math.Round(((color.R * 0.299) + (color.G * 0.587) + (color.B * 0.114)) / 255)

这句话的颜色值是怎么算的??

#   FarSeek 发表于2006-04-13 15:34:00  IP: 222.79.36.*
哦..好的谢谢

我现在还有一个问题

你的"CSDN小助手"里面的验证码识别类是在那个地方

我下载回来说CsdnV3.vbproj这个文件有错误打不开

#   FarSeek 发表于2006-04-13 15:36:00  IP: 222.79.36.*
截取字符,先获取每个字符的左右范围,再获取这个字符的上下范围,这个如何获得他的矩形框..我做了好久都没弄出来...正急着不知道如何下手

#   FarSeek 发表于2006-04-14 15:39:00  IP: 222.79.36.*
截取字符,先获取每个字符的左右范围,再获取这个字符的上下范围.获得方法:(VB.Net版)
Private Function AnalyzePicWithSmallPic(ByVal bmp As Bitmap, ByRef X As Integer) As Bitmap 'bmp要传入的图片,X从什么位置开始(这里指的是宽度)
'先获取每个字符的左右范围,再获取这个字符的上下范围
'这里是根据灰度的强弱来判断当前点应该是黑色还是白色
Dim tmepBmp As Bitmap
Dim width As Integer '得到小图片的宽度
Dim height As Integer = 1 '得到小图片的高度
Dim widthX As Integer '得到小图片起始宽的坐标点
Dim heightY As Integer '得到小图片起始高的坐标点
Dim widthEndX As Integer '得到小图片结束宽的坐标点
Dim heightEndY As Integer '得到小图片结束高的坐标点

'记录都没黑点的行
Dim hh As Integer

Dim bb As Boolean = True
Dim wb As Boolean = True
Dim c As Color

Dim mes As String
Dim start As Integer = 2

'得到宽度
For w As Integer = X To bmp.Width - start
wb = True
For h As Integer = start To bmp.Height - start
c = bmp.GetPixel(w, h)
If c.ToArgb = Color.Black.ToArgb And bb Then '找到第一个黑点
widthX = w
bb = False
Else
If c.ToArgb = Color.Black.ToArgb And Not bb Then '找到第一个黑点后,找到此列中所有像素都为白点的列号
wb = False
Exit For
End If
End If
Next
If Not bb And wb Then

#    你好.我有几个关于验证码识别的问题想请教 发表于2006-04-17 01:18:00  IP: 220.188.206.*
你好.我有几个关于验证码识别的问题想请教

我用你提供的vb.代码翻译了一下.代码如下:.但是这个方法在处理i j等有笔画分离的就会被认为是孤立的点.不知道有什么好的算法可以改经么??另外..有些验证骂图片周围有一个黑矿.有些底色和文字颜色是随即的做图片黑 白处理后往往底色变成黑色.文字边成白色.应该如何处理?在黑白颠倒一下?希望能得到你的帮助

//去杂点,只能判断黑白图片的杂点.
public void RemoveMacula(Bitmap Img)
{//这里循环找出每个点的周围8个点,如果周围8个点都是白色的话,这个点就判断为杂点
for (int w = 0; w <= Img.Width - 1; w++)
{
for (int h = 0; h <= Img.Height - 1; h++)
{
int bcount = 0;
if (Img.GetPixel(w, h).ToArgb() == Color.Black.ToArgb())
{
for (int ww = -1; ww <= 1; ww++)
{
for (int hh = -1; hh <= 1; hh++)
{
if ((w + ww) < 0 | (h + hh) < 0 | (w + ww) >= Img.Width | (h + hh) >= Img.Height)
{
bcount += 1;//这里判断处于边缘的点,应为边缘的点没有周围的8个点
}
else if (Img.GetPixel(w + ww, h + hh).ToArgb() == Color.White.ToArgb())
{
bcount += 1;
}
}
}
}
if (bcount > 7)

#   Qqwwee_com 发表于2006-04-17 09:05:00  IP: 218.17.96.*
其中的一个算法而已。
不同的图片有不同的算法,这里提供的是简单和实用的算法。90%都适用。

#    99koo 工作室 发表于2006-04-25 15:36:00  IP: 211.95.87.*
专业图形验证码识别引擎,可识别高难度验证码

http://www.99koo.com/blog/read.php?4

#   Qqwwee_Com 发表于2006-04-25 16:10:00  IP: 218.17.95.*
晕了
广告做到我这里了。。
楼上,esales.163.com老版本的验证码你好象都没办法吧。。

#   ZMS 发表于2006-04-27 20:16:00  IP: 202.102.140.*
请教怎么在调入页面的同时,“同步”得到那个图片呢?

#    请教  发表于2006-05-03 12:29:00  IP: 221.200.217.*
请问vc 或者 vb 也可以做 这样的验证码识别程序吗?

#    六世软件下载站 发表于2006-06-02 10:29:00  IP: 221.222.197.*
牛,

#    举止优雅的猪 发表于2006-06-06 21:43:00  IP: 211.143.181.*
Farseek的代码好像有点问题
我修正了一下
Private Function AnalyzePicWithSmallPic(ByVal bmp As Bitmap, ByVal x As Integer) As Bitmap 'bmp要传入的图片,X从什么位置开始(这里指的是宽度)
'先获取每个字符的左右范围,再获取这个字符的上下范围
'这里是根据灰度的强弱来判断当前点应该是黑色还是白色
Dim tempBmp As Bitmap
Dim width As Integer '得到小图片的宽度
Dim height As Integer '得到小图片的高度
Dim widthX As Integer '得到小图片起始宽的坐标点
Dim heightY As Integer '得到小图片起始高的坐标点
Dim widthEndX As Integer '得到小图片结束宽的坐标点
Dim heightEndY As Integer '得到小图片结束高的坐标点

'记录都没黑点的行
Dim bb As Boolean = True
Dim wb As Boolean = True
Dim c As Color

'得到宽度
For w As Integer = 0 To bmp.Width - 1
wb = True
For h As Integer = 0 To bmp.Height - 1
c = bmp.GetPixel(w, h)
If c.ToArgb = Color.Black.ToArgb And bb Then '找到第一个黑点
widthX = w
bb = False
Else
If c.ToArgb = Color.Black.ToArgb And Not bb Then '找到第一个黑点后,找到此列中所有像素都为白点的列号
wb = False
Exit For
End If
End If
Next
If Not bb And wb And widthX < w Then
widthEndX = w
Exit For
End If
Next
If Not bb And w
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值