2020年春运正式启动了,很多还在外地打工的朋友都还没有抢到票,其中就是我们的码农朋友,但是码农朋友平时都在写代码,没有时间抢票怎么办?这个时候就可以充分的利用自身优势了,用Python识别12306验证码来帮我们抢票,希望对大家有用。

如何让机器去识别?

(1) 基于图像识别

按照人类正常的思维习惯,想要选出符合标签的子图,就必须得判断出每张子图里的主体是什么。

所以,让机器去识别12306验证码的过程如下:

识别标签

识别每一张子图的主体

判断哪几张子图的主体和标签相符

在讲述该部分的内容之前,我想先安利下吴军大大的《数学之美》。

当时恰好在拜读此书,书中提到了自然语言处理(NLP)发展的2个阶段:“用电脑模拟人脑”到“基于数学模型和统计”。由此,我开始思考是否可以基于统计来实现12306验证码的识别。

再次回到本文开头的那张验证码图片,可以发现8张子图中有2张符合标签的“樱桃”图片,另有6张与标签毫无相关的图片,所以猜想:

如果能获得足够数量相同标签的12306验证码,那么正确的图片(即符合标签的图片)会大量重复出现

既然是猜想,自然需要实践的验证。

撸起袖子开始干!

Step1:写个小爬虫,从12306上爬取50,000张验证码,按1~50000进行编号

Step2:截取12306验证码标签区域(编号和原验证码图片保持一致),将标签图片丢给百度OCR接口,利用返回的文本信息进行自动分类,结果表明共有80个不同的类别

from aip import AipOcr

def baiduOCR(imagePath):

with open(imagePath, 'rb') as fp:

image = fp.read()

result = client.basicAccurate(image) # 每天500次免费调用额度

# result = client.basicGeneral(image) # 每天50000次免费调用额度

if 'words_result' in result:

temp = '\n'.join([w['words'] for w in result['words_result']])

# 修正常见的OCR错误

textOCR = temp.replace(',','').replace('一','').replace('/','').replace('-','').replace('^','').replace('A','').replace(u'呖',u'日历').replace(u'平',u'斗').replace(u'姗',u'珊').replace(u'痴',u'狮').replace(u'捉',u'报').replace(u'凤',u'风')

return textOCR

Step3:分割每张验证码上的8张子图,并存入对应标签的文件夹

举个栗子:“篮球”标签文件夹里的子图

Step4:图片查重

关于图片查重有好多种方法(具体原理可查阅以下“maggie”的回答),本文使用的是均值哈希(hash_size=16),通过计算2张图片的汉明距离(Hamming Distance)是否小于5来判定两图片是否一致。

PS:Python已有图像哈希库,安装后直接调用均值哈希算法即可。

pip install imagehash

具体步骤如下(以“篮球”标签为例):

1、新建“aHashDict”字典(key:保存图片的均值哈希值;value:以list形式保存对应图片的文件名)

2、遍历“篮球”文件夹内每一张图片,计算每张图片的均值哈希值

3、若图片哈希值与aHashDict字典中已有的key的汉明距离都不小于5,则说明该图片并未在此前出现过,则新建key,value对;若图片哈希值与某一key的汉明距离小于5,则说明该图片在此前出现过,故找到上述key对应的value,将图片的文件名添加进列表

from PIL import Image

import imagehash

def findSimilarImg(aHashDict, filename):

# 计算待检验图片的均值哈希(aHash)

img = Image.open(filename)

aHash = str(imagehash.average_hash(img,hash_size=16))

for k in aHashDict.keys():

# 计算汉明距离

temp = int(aHash, 16) ^ int(k, 16)

hammingDist=bin(temp).count('1')

# 判断两图片是否一致

if hammingDist < 5:

aHashDict[k].append(filename)

break

举个栗子,对“篮球”标签文件夹里的所有图片进行上述操作后,读取aHashDict来显示重现次数大于5的图片,如下视频所示,可看到满足上述要求的图片无一例外都是篮球!!!由此基本验证了我最开始的猜想是正确的!Bingo!!!

重点来了

有人会问了,前面讲了辣么多,可是还没提到怎么识别12306验证码呀!!!

不要急,其实12306验证码识别的核心内容都已经讲了,最关键的还是那句话:

如果能获得足够数量相同标签的12306验证码,那么正确的图片(即符合标签的图片)会大量重复出现

那么怎么做呢?

获取待验证的12306验证码

识别验证码的标签

读取对应标签的aHashDict字典

截取验证码上的8张子图,并计算每张子图均值哈希值(aHash)

对每一张子图的aHash与上述字典的所有key值计算汉明距离,如果与某key值的汉明距离小于5且该key值对应value的列表长度大于3(即训练样本里的重现次数大于3次),则说明该图片很有可能是正确的图片,pick it!!!

进行了100次12306验证码测试,排除1次无法识别标签的情况,共有99次有效测试,成功次数为80次,成功率为80.81%!!!

以上就是12306验证码图像识别程序源码,仅供学习使用哦。更多python教程尽在PS下。

python判断图片是不是火车票_12306验证码图像识别程序源码-Python识别12306验证码 - PS下...相关推荐

  1. 分享Python采集的77个PHP整站程序源码

    Python采集的77个PHP整站程序源码下载链接:百度网盘 请输入提取码 提取码:pdwa ULCms(Unlimited Cms) V1.0 RC Build 20080926 DiY-Page ...

  2. [附源码]计算机毕业设计Python+uniapp基于Android 工厂考勤系统4h291(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android 工厂考勤系统4h291(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境 ...

  3. [附源码]计算机毕业设计Python+uniapp基于Android的自来水收费系统3e359(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android的自来水收费系统3e359(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环 ...

  4. [附源码]计算机毕业设计Python+uniapp基于Android的校园考勤APPo0400(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android的校园考勤APPo0400(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环 ...

  5. [附源码]计算机毕业设计Python+uniapp基于MVVM在线电影购票APP05s75(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于MVVM在线电影购票APP05s75(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配 ...

  6. [附源码]计算机毕业设计Python+uniapp基于Android的减肥菜谱APPn0n19(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android的减肥菜谱APPn0n19(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环 ...

  7. [附源码]计算机毕业设计Python基于Web的软考题库平台(程序+源码+LW文档)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+N ...

  8. [附源码]计算机毕业设计Python儿童早教课程管理系统论文2022(程序+源码+LW文档)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+N ...

  9. 基于python+django学生信息管理系统设计与实现(含程序源码和毕业设计)

    摘要 随着互联网技术的加快发展,计算机电脑硬件也在不断的迭代升级,而每年大学生不断的扩招,学院的增加,对于信息平台的管理需求也越来越多.选用B/S架构模式,可以更好的服务于学生信息化的管理,这是因为C ...

  10. 用python语言写了一套在线算命程序 源码,可以测试一下精准度

    AI智能解析,探究缠乱你的疑惑 让你更了解自己,让未知更清晰 相由心生,境随心转.面相学通过观察面部特征来解码人生命运, AI面相手相分析命运探究所小程序 则利用人工智能深度神经网络学习技术 与人脸识 ...

最新文章

  1. 昨夜,5G R16标准正式冻结!5G物联网扬帆起航
  2. DB2数据导入导出的小结
  3. ATP检查的一些TIPS
  4. spring学习(35):c名称空间注入
  5. python变量标识符_简谈-Python的注释、变量类型、标识符及关键字
  6. Matlab--三维散点插值成曲面
  7. 雷电交加,雨水倾泻--北京
  8. 状态模式(Unity中使用)
  9. 《使命召唤7:黑色行动》有什么简单办法进入僵尸模式
  10. tensorflow之softmax
  11. Eclipse使用之添加字体
  12. 台达服务器AB和B2系列区别,台达A2与B2伺服的区别
  13. 社区护理 100404
  14. esp8266教程:网络基础知识
  15. 你还不明白如何解决分布式Session?看这篇就够了!
  16. linux vi编辑(20160628)
  17. 编程心得分享,送给刚入门学编程的小伙伴
  18. css背景渐变(灰色渐变背景)
  19. 操作系统原理:哲学家就餐经典问题
  20. c语言最大字符1025,leetcode1025(除数博弈)--C语言实现

热门文章

  1. 如何用cocos2d-x来开发简单的Uphone游戏:(一) 下载安装和HelloWorld
  2. 阿里研究员玄难:如何做电商中台
  3. Google TPU的发展历程与思考(一)
  4. itext设置字体间距_设计时sketch中字体行高到底该如何设置
  5. 超燃动态可视化条形图源码及效果图_HTML5大数据可视化效果(一)彩虹爆炸图...
  6. linux java 自动安装_Centos7 linux 卸载自带安装的jdk 并yum自动安装jdk1.8
  7. 检察机关认定河北涞源反杀案为正当防卫 决定不起诉女生父母
  8. 【人工智能】重磅发布人工智能与机器学习全景式概览
  9. 【 學習心得 笔记 1】大疆技术总监:如何用六年成为一个全能的机器人工程师
  10. can收发器TJA1043