寒夜听雨【程序开发专栏】

C#、ASP.NET、SQL SERVER、PowerBuilder技术交流
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

网页验证码识别-验证码的特征码

Posted on 2008-07-28 14:06  寒夜听雨【Gary】  阅读(2306)  评论(0编辑  收藏  举报

1、下载远程图片
2、灰度转换
3、分割图片
4、按灰度得到分割图片的特征码

(改图取的验证码特征码不是很准确:)呵呵)
有颜色的是原网站取得的图片
灰色的是灰度转换后的图片
下面是分割后的图片
下面列表框是特征码
灰度转换 是博客园里元宝的代码

 

         /// <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];

            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);

                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;
        }



能不能获得准确获得验证码还是要灰度转换的时候灰度值取得适中,能够准确分割就能取得正确的特征码。对于一般的图片验证码识别就非常简单了。