图形识别简单去色

最近在用脚指头想怎么做图形识别.图形识别确实很有难度.不过大部分图形的识别都是不难的.主要在于如何获取特征.

而获取特征去干扰颜色是个大问题.有的网站做的很好.比如百度贴吧,例如地址是
http://post.baidu.com/cgi-bin/genimg?91647C2AB18B9A40CE2720CD224E6EB24489D2AFF2D9BB2001D3F806FB1E3E8E700721061042B3F4A939B8AE3CFC460801E89A9CA0DC7A69599AE489DABB
图形字符总是3M36,但是位置一直变.http://post.baidu.com/cgi-bin/genimg?后面的参数应该是加密数据.每次改变图片地址.而且虽然图形自由两种颜色,但是干扰得非常好.

对于颜色乱七杂八的色彩有些反而是很好过滤的.比如CSDN的论坛登陆验证码.例如地址
http://passport.csdn.net/ShowExPwd.aspx?DateTime=2007-1-24 16:23:53&strimg=0.8194541912990922

不知道日期后面的参数有什么用,http://passport.csdn.net/ShowExPwd.aspx?DateTime=2007-1-24照样可以抓取到图形的.但是这个抓出来颜色很杂.
1         public Stream ReuestImage()
2         {
3             HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create("http://passport.csdn.net/ShowExPwd.aspx?DateTime=2007-1-24");
4             hwr.ContentType = "application/x-www-form-urlencoded";
5             hwr.Method = "GET";
6             HttpWebResponse hw = (HttpWebResponse)hwr.GetResponse();
7             return hw.GetResponseStream();
8         }

 1         /// <summary>
 2         /// 加载图形,象素转换为数组
 3         /// </summary>
 4         private void Load()
 5         {
 6             MyNet mn = new MyNet();
 7             bt = (Bitmap)Bitmap.FromStream(mn.ReuestImage());
 8             //bt = (Bitmap)Bitmap.FromFile("c:/tt.bmp");
 9             int x = bt.Width;
10             int y = bt.Height;
11             pixColor = new Color[x , y];
12 
13             for (int i = 0; i < x; i++)
14             {
15                 for (int k = 0; k < y; k++)
16                 {
17                     pixColor[i,k] = bt.GetPixel(i, k);
18                 }
19             }
20         }

这样就抓出来图象,并且把每个象素点存放成数组了

我想了个简单的办法,用ColorTranslator.ToHtml把pixColor的每个点转换为#000000样式的颜色.去掉#
然后分成3份.

 1             for (int i = 0; i < pixColor.GetLength(0); i++)
 2             {
 3                 for (int j = 0; j < pixColor.GetLength(1); j++)
 4                 {
 5                     string s = ColorTranslator.ToHtml(pixColor[i, j]).Remove(0,1);
 6                     string s1 = s.Remove(2);
 7                     string s2 = s.Remove(02).Remove(2);
 8                     string s3 = s.Remove(04);
 9 
10                     if (Convert.ToInt32(s1, 16+ Convert.ToInt32(s2, 16+ Convert.ToInt32(s3, 16< 408)
11                         bt.SetPixel(i, j, Color.White);
12                     else
13                         bt.SetPixel(i,j,Color.Black);
14                 }
15             }

分成3份后,转换为十进制.然后3个加起来和136*3比较
为什么是136*3呢?因为Convert.ToInt32("88", 16) = 136   //十六进制转换10进制
也就是相当于把#888888颜色标记成408.而如果Convert.ToInt32(s1, 16+ Convert.ToInt32(s2, 16+ Convert.ToInt32(s3, 16) < 408 就默认为浅颜色,而设置为白色bt.SetPixel(i, j, Color.White);
否则就是深颜色,设置为黑色bt.SetPixel(i,j,Color.Black);

以下是抓取处理后的几张效果图
csdncode.gif


有什么好的想法好的思路,还望大家指点
posted @ 2007-01-24 17:00  Birdshover  阅读(4721)  评论(20编辑  收藏  举报