最近因为项目的缘故,用到了一些图片识别的应用,去网上找了一下关于验证码识别的源代码

发现有一个较为简单的代码:http://www.cnblogs.com/yuanbao/archive/2007/09/25/905322.html

仔细看了一下他的代码,发现这只是针对于特定的网站的,非常规则的验证码识别,

限制条件:

1)验证码必须是特定的个数

2)验证码必须非常规则

3)不可以有扰乱的线条

而我需要用到的是去搞定商城里面的价格,因为价格的话需要给消费者看,所以没有加入扰乱的线条,并且他们的数字也比较规则,这样的话,2,3条就不用考虑了,而价格的数字的个数是不定的,所以我们需要改写一下他的源代码就可以了!

这个是我改写之后的代码,说明的话都在里面做了!

using System;using System.Collections.Generic;using System.Text;using System.Drawing;

namespace Pmars{class MyImage    {//需要进行分析的图片        private Bitmap bmpobj;//需要继承并且重写的数字比对串,在子类里面需要用到这个去比对数字        public Dictionary<string, char> numDic = new Dictionary<string, char>();

//得到图片中某一点的灰度数值        private int GetGrayNumColor(System.Drawing.Color posClr)        {return (posClr.R * 19595 + posClr.G * 38469 + posClr.B * 7472) >> 16;        }

//进行灰度处理        private 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));                }            }        }

//得到一个图片的01代码序列        private string GetSingleBmpCode(Bitmap singlepic, int dgGrayValue)        {            Color piexl;string code = "";for (int posy = 0; posy < singlepic.Height; posy++)for (int posx = 0; posx < singlepic.Width; posx++)                {                    piexl = singlepic.GetPixel(posx, posy);if (piexl.R < dgGrayValue)    // Color.Black )                        code = code + "1";else                        code = code + "0";                }return code;        }

//从一个图片里面得到几个分开的数字小图片        private Bitmap[] GetPicValidByValue(int dgGrayValue)        {            List<Bitmap> PicList = new List<Bitmap>();            Rectangle cloneRect;int posx1 = bmpobj.Width, posy1 = bmpobj.Height, posx2 = 0, posy2 = 0;bool cut = false; int last = -1, lastx = 0;for (int j = 0; j < bmpobj.Width; j++)      //找有效区            {                cut = false;for (int i = 0; i < bmpobj.Height; i++)                {int pixelValue = bmpobj.GetPixel(j, i).R;if (pixelValue < dgGrayValue)     //根据灰度值                    {if (posx1 > j) posx1 = j;if (posy1 > i) posy1 = i;

if (posx2 < j) posx2 = j;if (posy2 < i) posy2 = i;                        cut = true;                    }                };

if (cut)continue;if (last + 1 == j)                {                    last++;continue;                }

                cloneRect = new Rectangle(posx1, posy1, posx2 - posx1 + 1, posy2 - posy1 + 1);                lastx = j; last = j; posx1 = bmpobj.Width; posy1 = bmpobj.Height; posx2 = 0; posy2 = 0;                PicList.Add(bmpobj.Clone(cloneRect, bmpobj.PixelFormat));//复制小块图            };

return PicList.ToArray();        }

//得到一个图片的数字串        private string GetPicNumber()        {            GrayByPixels(); //灰度处理            Bitmap[] pics = GetPicValidByValue(128); //得到有效值            StringBuilder sb = new StringBuilder();char c;for (int i = 0; i < pics.Length; ++i)            {string code = GetSingleBmpCode(pics[i], 128);   //得到代码串                if (numDic.TryGetValue(code, out c))                {                    sb.Append(c);                }            }return sb.ToString();        }

//外部调用,得到一个图片的数字串        public string GetPicNum(Bitmap pic)        {            bmpobj = new Bitmap(pic);    //转换为Format32bppRgb            return GetPicNumber();        }

//外部调用,得到一个图片的数字串(重载)        public string GetPicNum(string fileName)        {            bmpobj = new Bitmap(fileName);return GetPicNumber();        }

//输出在一幅图里面找到的数字,测试或者找到数字比对串时用        private void TestNumber()        {            GrayByPixels(); //灰度处理            Bitmap[] pics = GetPicValidByValue(128); //得到有效值            for (int i = 0; i < pics.Length; ++i)            {string code = GetSingleBmpCode(pics[i], 128);   //得到代码串                Console.WriteLine(i);                Console.WriteLine(code);            }        }

//外部调用,输出在一幅图里面找到的数字,测试或者找到数字比对串时用        public void TestNum(Bitmap pic)        {            bmpobj = new Bitmap(pic);    //转换为Format32bppRgb            TestNumber();        }

//外部调用,输出在一幅图里面找到的数字,测试或者找到数字比对串时用(重载)        public void TestNum(string fileName)        {            bmpobj = new Bitmap(fileName);            TestNumber();        }    }}

基类建好之后我们只需要针对某一特定的网站去分析其图片中数字的对比字符串就可以了,利用基类里面的TestNum就可以了!

在此,为了说明这段代码的用法,我用京东商城的价格图片作为试验品(PS:工作中,我可没有做这些^v^)

首先我手动的下载了几张价格图片,这个在实际应用中可以直接用代码去下载,并且测试了其数字串,代码和结果显示在下面

DirectoryInfo dInfo = new DirectoryInfo(@"D:/Images");MyImage test = new MyImage();foreach(var file in dInfo.GetFiles()){       Console.WriteLine(file.FullName);       test.TestNum(file.FullName);}

这里面的01代码就是我所谓的 对比的数字串 了!

将他们提取出来,去给基类里面的numDic赋值就可以了

下面是京东商城的类的代码,其中给numDic赋值了

    class JingdongImage : MyImage    {public JingdongImage()        {            numDic.Add("111011111101111110111011111000111001111111001110000111000111110", '¥');            numDic.Add("011110110011110011110011110011110011110011011110", '0');            numDic.Add("01101110011001100110011001101111", '1');            numDic.Add("011110110011000011000110001100011000110000111111", '2');            numDic.Add("011110110011000011001110000011000011110011011110", '3');            numDic.Add("000010000110001110010110100110111111000110000110", '4');            numDic.Add("011111011000011000011110000011000011110011011110", '5');            numDic.Add("001110011000110000111110110011110011110011011110", '6');            numDic.Add("111111000011000110000110001100001100011000011000", '7');            numDic.Add("011110110011110011011110110011110011110011011110", '8');            numDic.Add("011110110011110011110011011111000011000110011100", '9');            numDic.Add("1111", '.');        }    }

并且最终测试的代码和结果如下:

DirectoryInfo dInfo = new DirectoryInfo(@"D:/Images");JingdongImage test = new JingdongImage();foreach(var file in dInfo.GetFiles()){       Console.WriteLine(file.FullName);       Console.WriteLine(test.GetPicNum(file.FullName));}

需要提到的是,在这里,图片的名称就是下载时候的价格,这个不是我假写的(- -)

总结:这个方法去找价格,或者说是识别简单的图片是可以的,前提是他们不要做过多的改变。。。。

写在这里,记录一下!

转载于:https://www.cnblogs.com/wifi/archive/2011/12/02/2272413.html

简单的图片识别,源代码相关推荐

  1. python简单图片识别_用Python进行简单的图片识别(1)

    起因是这样的,我想买一个定焦镜头,但也不是必需品,可以长期观望购买.最初的想法是,写个程序,每天爬一下各大电商网站的价格,或者直接爬etao把该镜头的价格记录下来,突然有一个惊爆的低价,就发邮件通知. ...

  2. 利用EasyDL制作一个简单的图片识别小项目

    主要是利用EasyDL制作一个简单的傻瓜式猫狗图片识别,利用EasyDL,只需要几步简单的点击即可 *主要的步骤: 1.准备数据 2.训练模型 3.部署 4.H5 * 1.首先创建两个文件夹cat和d ...

  3. 百度AI 图片识别学习笔记(1)——简单的图片识别接口使用

    仅以此记录自己的Python学习过程和图片识别学习过程. 参考资料 百度AI网址https://ai.baidu.com/ 开发环境PyCharm Python版本Python3.7 首先需要一个百度 ...

  4. 【Python】Python简单的图片识别

    具体想要实现上面的代码需要安装两个包和一个引擎 在安装之前需要先安装好Python,pip并配置好环境变量 1.第一个包: pytesseractpip install pytesseract 若是出 ...

  5. 图片识别工具Tesseract介绍和python搭配使用

    Tesseract介绍和Python的搭配使用 一.Tesseract介绍.下载指南 1.了解Tesseract工具 2.下载地址 3.请注意!!! 二 .环境搭建 2.1 版本3.05安装 2.2 ...

  6. 基于face_recognition实现图片识别

    Face Recognition 是一个基于 Python 的人脸识别库,它还提供了一个命令行工具,让你通过命令行对任意文件夹中的图像进行人脸识别操作. 该库使用 dlib 顶尖的深度学习人脸识别技术 ...

  7. 如何把表格做成源代码_他来了,他来了,文字、表格、公式图片识别神器V0.1测试版...

    他来了,他来了,Mathpix拜拜了~~~ 文字.表格.公式图片识别神器V0.1测试版 俺不是标题党!!! 开发背景 日常工作中经常遇到大量的图片版文本.表格.公式需要编辑: 用手敲?也太OUT了吧, ...

  8. 超级简单的人脸识别接口, 根据图片URL返回人脸信息(坐标,宽高,人脸图URL, base64)

    功能描述 传入图片进行人脸检测和人脸分析,返回值是一段 JSON,可包含所识别到的人脸坐标.宽高.性别.年龄.Base64编码.人脸图片URL. 接口使用简单,提交识别图URL即可返回人脸识别结果. ...

  9. Python OpenCV 图片滑块验证码 滑块图片验证码 快速自动识别方案 代码简单 模板匹配识别 识别成功率达90%+

    前言 通过上一篇的文章大家已经对图片滑块验证码已经有了初步的了解,图片滑块验证码的核心关键在于图片识别接下来接入讲解.因为初版滑块图片识别虽然能识别验证码,通过一些策略调整也相对提高了一些图片识别率, ...

最新文章

  1. 最大化_成本最小化与利润最大化
  2. Java设计模式——原型模式
  3. 从客户端(Content=EM STRONG U 这是测试这...)中检测到有潜在危险的Request.Form 值。...
  4. Qt creator5.7 OpenCV249之高斯滤波(含源码下载)
  5. IDEA代码自动换行
  6. Android SDK Manager配置
  7. 支付宝用户可直接签署器官捐献,How about 微信?
  8. 第一次用AX2009正式版!
  9. php number_format 通过千位分组来格式化数字
  10. POJ P3764 The xor-longest Path
  11. 弘辽科技:淘宝评分飘绿四大原因及快速提高评分之解决技巧
  12. 地下城php补丁怎么用,dnf技能补丁怎么用到WeGame(附其使用教程)
  13. 推荐一款串口调试助手(win10,无广告,功能齐全,操作简单)
  14. Ubuntu 使用XCB
  15. 简单实用计划提醒便签软件 界面简洁功能一目了然
  16. 机器学习之模型评估方法总结
  17. Win10 新版Edge浏览器Flash Player不兼容,总是显示flash与地区不兼容(完美解决)
  18. web漏洞之文件上传漏洞
  19. android指南针闪退,互动课堂及视频闪退修复方案(KB3132372)
  20. 黄仁勋骗过了全世界,三个多月都没人发觉!皮衣是假的厨房是假的,连他自己都是假的...

热门文章

  1. 将图像DN值定标维热辐射强度之后,可用Planck函数求解出星上亮度温度
  2. fio模拟mysql写入速度_fio 测试工具
  3. 浅谈如何开一场 Chat
  4. Python斐波拉契数列
  5. 第四部分、JEECG-BOOT 微服部署文档
  6. 管理规划:目标是什么?
  7. mysql时间函数详解
  8. C++中的typeid关键字
  9. Carla 开源自动驾驶仿真软件使用指南 [AD simulator]
  10. fiddler 抓取手机上点击微信公众号的链接