1、下载远程图片
2、灰度转换
3、分割图片
4、按灰度得到分割图片的特征码
![](https://www.cnblogs.com/images/cnblogs_com/hyty/Image00000.jpg)
(改图取的验证码特征码不是很准确:)呵呵)
有颜色的是原网站取得的图片
灰色的是灰度转换后的图片
下面是分割后的图片
下面列表框是特征码
灰度转换 是博客园里元宝的代码
/// <summary>
/// 灰度转换,逐点方式
/// </summary>
public void GrayByPixels()
{
for (int i = 0; i < bmpobj.Height; i++)
{
for (int j = 0; j < bmpobj.Width; j++)
{
int tmpValue = GetGrayNumColor(bmpobj.GetPixel(j, i));
bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue));
}
}
}
图片分割
public Bitmap[] GetSplitPicsByBlankCol(int RowNum, int dgGrayValue)
{
if (RowNum == 0)
return null;
int singW = bmpobj.Width / RowNum;
Bitmap[] PicArray = new Bitmap[RowNum];
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Rectangle cloneRect;
int MinCol = 0,OldCol=0;
int Points,MinPoints;
for (int j = 0; j < RowNum-1; j++)
{
MinPoints=bmpobj.Height;
for (int k = j * singW; k < (j + 1) * singW + singW/2; k++) //寻找最小点数列
{
Points = 0;
for (int i = 0; i < bmpobj.Height; i++)
{
if (bmpobj.GetPixel(k, i).R < dgGrayValue) //计数
Points++;
}
if (Points < MinPoints)
{
if (k - j * singW > singW / 2) //字符后半部
{
MinPoints = Points;
MinCol = k;
}
}
}
if (MinCol - OldCol + 1 <= singW / 2) //宽度不足一半
MinCol = (j + 1) * singW;
//提取小块图
if (MinPoints > 0) //有交叉点
cloneRect = new Rectangle(OldCol, 0, MinCol - OldCol+1, bmpobj.Height);
else
cloneRect = new Rectangle(OldCol, 0, MinCol-OldCol, bmpobj.Height);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
OldCol=MinCol;
PicArray[j] = bmpobj.Clone(cloneRect, bmpobj.PixelFormat);//复制小块图
}
cloneRect = new Rectangle(OldCol, 0, bmpobj.Width - OldCol, bmpobj.Height);
PicArray[RowNum-1] = bmpobj.Clone(cloneRect, bmpobj.PixelFormat);//最后一个
return PicArray;
}
能不能获得准确获得验证码还是要灰度转换的时候灰度值取得适中,能够准确分割就能取得正确的特征码。对于一般的图片验证码识别就非常简单了。