博客园验证码破解成功

博客园的验证码有一个波形变形,对于字符分割带来了一定难度,还好没有产生字符粘连,可以通过字符旋转,来找到最佳旋转角。

1、使用阀值和阀值去噪音

2、进行扭曲,测出那些时可以分割成4个字符的图形,进行学习

3、样本模板尺寸定位6*9,因为验证码可以通过以一个网址重复的到多次,所以我们对每个字符大概学习5000次后,验证码识别率可以大于%95

对于扭曲过的图片,使用神经网络比模板发应该要好很多,改进后将讲解详细算法。

C#相关算法如下:

/// <summary>
/// 正弦曲线Wave扭曲图片
/// </summary>
/// <param name=”srcBmp”></param>
/// <param name=”bXDir”></param>
/// <param name=”nMultValue”>波形的幅度倍数</param>
/// <param name=”dPhase”>波形的起始相位,取值区间[0-2*PI)</param>
/// <returns></returns>
public Bitmap TwistImage(Bitmap srcBmp, bool bXDir, double dMultValue, double dPhase)
{
    System.Drawing.Bitmap destBmp = new Bitmap(srcBmp.Width, srcBmp.Height);

    // 将位图背景填充为白色
    System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(destBmp);
    graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), 0, 0, destBmp.Width, destBmp.Height);
    graph.Dispose();

    double dBaseAxisLen = bXDir ? (double)destBmp.Height : (double)destBmp.Width;

    for (int i = 0; i < destBmp.Width; i++)
    {
        for (int j = 0; j < destBmp.Height; j++)
        {
            double dx = 0;
            dx = bXDir ? (Math.PI * 2 * (double)j) / dBaseAxisLen : (Math.PI * 2 * (double)i) / dBaseAxisLen;
            dx += dPhase;
            double dy = Math.Sin(dx);

            // 取得当前点的颜色
            int nOldX = 0, nOldY = 0;
            nOldX = bXDir ? i + (int)(dy * dMultValue) : i;
            nOldY = bXDir ? j : j + (int)(dy * dMultValue);

            System.Drawing.Color color = srcBmp.GetPixel(i, j);
            if (nOldX >= 0 && nOldX < destBmp.Width
            && nOldY >= 0 && nOldY < destBmp.Height)
            {
                destBmp.SetPixel(nOldX, nOldY, color);
            }
        }
    }

    return destBmp;
}

作者: 4111y80y
所在目录: 验证码识别 at 6月 15th, 2008. Trackback URI: trackback
Tags: , , , ,

No Responses to “博客园验证码破解成功”

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>