zoukankan      html  css  js  c++  java
  • 图形识别简单去色

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

    而获取特征去干扰颜色是个大问题.有的网站做的很好.比如百度贴吧,例如地址是
    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


    有什么好的想法好的思路,还望大家指点
  • 相关阅读:
    nodejs中exports与module.exports的区别
    Webpack--自学笔记
    cookie、sessionStorage、localStorage 详解
    JavaScript中URL的解码和编码
    javascript中怎么判断对象{}为空
    关于获取、设置css样式封装的函数入门版
    多行文本溢出显示省略号(…)
    前端优化的问题
    volatile
    MySQL(六) decimal数据默认处理
  • 原文地址:https://www.cnblogs.com/birdshover/p/629405.html
Copyright © 2011-2022 走看看