博客园验证码破解成功
博客园的验证码有一个波形变形,对于字符分割带来了一定难度,还好没有产生字符粘连,可以通过字符旋转,来找到最佳旋转角。
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;
}


