这里的方法只是利用<csdn Blog发表评论验证码识别>思路和方法对CSDN新版特征码进行识别,只对一部分特征码有效。不过通过改进算法,应该可以得到很好的效果。
新版特征码举例如下:
初步分析,该特征码使用以下方式增加识别难度:
-
不单纯的背静色
-
随机出现的干扰线
-
随机出现的干扰点
-
不同字符颜色不一样
-
字符出现的位置不一样
-
字符之间的距离随机,还有可能连在一起。
-
使用了斜体字,即使不连接,也不能采用矩形方式获取其中的一个字符
现在开始针对上面的问题进行处理
我们先看一个操作,使用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
CSDN新版图形验证码初级识别
2、CSDN 计划在今年上班年提供登录、新社区的WEB Service API
3、你可以联系我,在这个登录 Web Service 测试阶段,一起来测试, 我的 邮件: ghj1976@csdn.net
期待!
期待!
这句话的颜色值是怎么算的??
》》》》》==========
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)
这句话的颜色值是怎么算的??
我现在还有一个问题
你的"CSDN小助手"里面的验证码识别类是在那个地方
我下载回来说CsdnV3.vbproj这个文件有错误打不开
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
我用你提供的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)
不同的图片有不同的算法,这里提供的是简单和实用的算法。90%都适用。
http://www.99koo.com/blog/read.php?4
广告做到我这里了。。
楼上,esales.163.com老版本的验证码你好象都没办法吧。。
我修正了一下
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