图形识别简单去色

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

而获取特征去干扰颜色是个大问题.有的网站做的很好.比如百度贴吧,例如地址是
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 阅读(2365) 评论(19)  编辑 收藏 所属分类: Thinking about develop

  回复  引用    
#1楼 2007-01-24 17:09 | rr [未注册用户]
后面的日期或者随机的字符串是用来防止浏览器缓存图片造成刷新后图片不更新的
  回复  引用  查看    
#2楼 2007-01-24 17:20 | 随心所欲      
可以判断出来文字?
  回复  引用  查看    
#3楼 [楼主]2007-01-24 17:26 | BirdsHover      
@随心所欲
识别文字需要另外的算法了.识别算法很复杂
  回复  引用    
#4楼 2007-01-24 17:36 | contra_plus [未注册用户]
怎么把处理后的图中的内容提取成文本?

  回复  引用  查看    
#5楼 2007-01-24 17:53 | T.t.T!Ck.      
AspriseOCR

对于图形识别比较准备..可以看一下
  回复  引用  查看    
#6楼 2007-01-24 18:01 | 亚历山大同志      
以后验证码自动生成会动的gif,看怎么自动截
  回复  引用  查看    
#7楼 2007-01-24 18:11 | Ariel Y.      
会动的GIF也是一帧一帧的,没区别,如果还是现实一样的数字的话,提供了更多的信息,反而更好识别了。
  回复  引用  查看    
#8楼 2007-01-24 19:16 | 亚历山大同志      
你知道那一帧是完整的code么?生成渐变加随机位移的gif图像我不觉得还能识别
  回复  引用  查看    
#9楼 [楼主]2007-01-24 19:24 | BirdsHover      
识别是肯定能识别的,只是速度问题.取象素叠加还是能做到的
最主要的就是如何简化图形,简化后的图形能减少很多运算.只要你能简化,就肯定能识别的
  回复  引用    
#10楼 2007-01-24 19:33 | zitiger [未注册用户]
如果一个白点没有紧挨其他白点,那么这个白点应该是没有用的点


假定一个白点(a)紧挨白点(b),b 紧挨c,那么我们称a可以到达c

如果一个点可以到达其他点的数量很小,那么这个点肯定是噪点

  回复  引用  查看    
#11楼 2007-01-24 20:23 | 随心所欲      
图片比较大的话,你的数组就得很大。这个是不是有点浪费?
有没有模糊化(取样本)的算法?

  回复  引用  查看    
#12楼 [楼主]2007-01-24 20:30 | BirdsHover      
@随心所欲
事实上,网站开发从数据库读出来的数据要不这里的数组占用内存多很多.如果对于干净的图片,没有任何干扰.比如白底黑字的可以采用更加高效的处理办法.
模糊化取样本也是建立在分析色彩的前提下的
  回复  引用    
#13楼 2007-01-24 22:27 | eee [未注册用户]
搞这个东东,最好用什么腐蚀算法预处理一下,呵呵
  回复  引用    
#14楼 2007-01-25 09:04 | 革命老前辈 [未注册用户]
没意义
  回复  引用    
#15楼 2007-01-25 15:34 | 图形识别 [未注册用户]
@革命老前辈
怎么叫没意义?
举个简单的例子,交管便有通过摄像头识别车牌号来确认车牌和车是否相符的,只不过是功能是否达到要求的问题。

  回复  引用  查看    
#16楼 [楼主]2007-01-25 22:57 | BirdsHover      
图形识别具有很大意义的.比如做地图,GIS系统,扫描文件直接转换文字等很多场合都有用.
LZ,想做发贴机器人,哈哈哈,赞,,,
  回复  引用  查看    
#18楼 [楼主]2007-01-27 18:49 | BirdsHover      
以前做过发帖机器人,不过很难写出模糊处理的程序来
  回复  引用    
#19楼 2008-02-11 20:31 | 台州拉 [未注册用户]
图形的比较麻烦

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-02-01 11:24 编辑过


相关链接: