当前位置: 首页 > 编程日记 > 正文

python 验证码识别示例(二) 复杂验证码识别

在这篇博文中手把手教你如何去分割验证,然后进行识别。

一:下载验证码

验证码分析,图片上有折线,验证码有数字,有英文字母大小写,分类的时候需要更多的样本,验证码的字母是彩色的,图片上有雪花等噪点,因此识别改验证码难度较大

二:二值化和降噪:

三: 切割:

四:分类:

五:   测试识别率

              

六:总结:

综合识别率在70%左右,对于这个识别率我觉得还是挺高的,因为这个验证码的识别难度还是很大

代码:

一.  下载图片:

#-*-coding:utf-8-*-
import requestsdef spider():url = "https://www.epailive.com/basic/captcha?ran=0.22070346581876787"for i in range(1, 101):print("正在下载的张数是:",i)with open("./1__get_image/{}.png".format(i), "wb") as f:f.write(requests.get(url).content)
spider()

二: 验证码二值化和降噪:

#-*-coding:utf-8-*-
# coding:utf-8
import sys, os
from PIL import Image, ImageDraw# 二值数组
t2val = {}def twoValue(image, G):for y in range(0, image.size[1]):for x in range(0, image.size[0]):g = image.getpixel((x, y))if g > G:t2val[(x, y)] = 1else:t2val[(x, y)] = 0# 根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 <N <8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点
# G: Integer 图像二值化阀值
# N: Integer 降噪率 0 <N <8
# Z: Integer 降噪次数
# 输出
#  0:降噪成功
#  1:降噪失败
def clearNoise(image, N, Z):for i in range(0, Z):t2val[(0, 0)] = 1t2val[(image.size[0] - 1, image.size[1] - 1)] = 1for x in range(1, image.size[0] - 1):for y in range(1, image.size[1] - 1):nearDots = 0L = t2val[(x, y)]if L == t2val[(x - 1, y - 1)]:nearDots += 1if L == t2val[(x - 1, y)]:nearDots += 1if L == t2val[(x - 1, y + 1)]:nearDots += 1if L == t2val[(x, y - 1)]:nearDots += 1if L == t2val[(x, y + 1)]:nearDots += 1if L == t2val[(x + 1, y - 1)]:nearDots += 1if L == t2val[(x + 1, y)]:nearDots += 1if L == t2val[(x + 1, y + 1)]:nearDots += 1if nearDots < N:t2val[(x, y)] = 1def saveImage(filename, size):image = Image.new("1", size)draw = ImageDraw.Draw(image)for x in range(0, size[0]):for y in range(0, size[1]):draw.point((x, y), t2val[(x, y)])image.save(filename)for i in range(1, 101):path = "1__get_image/" + str(i) +  ".png"image = Image.open(path)image = image.convert('L')twoValue(image, 198)clearNoise(image, 3, 1)path1 = "2__erzhihua_jiangzao/" + str(i) + ".jpg"saveImage(path1, image.size)

三:  切割验证码:

#-*-coding:utf-8-*-from PIL import Imagedef smartSliceImg(img, outDir, ii,count=4, p_w=3):''':param img::param outDir::param count: 图片中有多少个图片:param p_w: 对切割地方多少像素内进行判断:return:'''w, h = img.sizepixdata = img.load()eachWidth = int(w / count)beforeX = 0for i in range(count):allBCount = []nextXOri = (i + 1) * eachWidthfor x in range(nextXOri - p_w, nextXOri + p_w):if x >= w:x = w - 1if x < 0:x = 0b_count = 0for y in range(h):if pixdata[x, y] == 0:b_count += 1allBCount.append({'x_pos': x, 'count': b_count})sort = sorted(allBCount, key=lambda e: e.get('count'))nextX = sort[0]['x_pos']box = (beforeX, 0, nextX, h)img.crop(box).save(outDir + str(ii) + "_" + str(i) + ".png")beforeX = nextXfor ii in  range(1, 101):path = "2__erzhihua_jiangzao/" + str(ii) + ".jpg"img = Image.open(path)outDir = '3__qiege/'smartSliceImg(img, outDir, ii,count=4, p_w=3)

四: 训练:

#-*-coding:utf-8-*-import numpy as np
import os
import timefrom PIL import Image
from sklearn.externals import joblib
from sklearn.neighbors import KNeighborsClassifierdef load_dataset():X = []y = []for i in "23456789ABVDEFGHKMNPRSTUVWXYZ":target_path = "fenlei/" + iprint(target_path)for title in os.listdir(target_path):pix = np.asarray(Image.open(os.path.join(target_path, title)).convert('L'))X.append(pix.reshape(25 * 30))y.append(target_path.split('/')[-1])X = np.asarray(X)y = np.asarray(y)return X, ydef check_everyone(model):pre_list = []y_list = []for i in "23456789ABCDEFGHKMNPRSTUVWXYZ":part_path = "part/" + ifor title in os.listdir(part_path):pix = np.asarray(Image.open(os.path.join(part_path, title)).convert('L'))pix = pix.reshape(25 * 30)pre_list.append(pix)y_list.append(part_path.split('/')[-1])pre_list = np.asarray(pre_list)y_list = np.asarray(y_list)result_list = model.predict(pre_list)acc = 0for i in result_list == y_list:print(result_list,y_list,)if i == np.bool(True):acc += 1print(acc, acc / len(result_list))X, y = load_dataset()
knn = KNeighborsClassifier()
knn.fit(X, y)
joblib.dump(knn, 'yipai.model')
check_everyone(knn)

五:模型测试:

# -*- coding: utf-8 -*-import numpy as np
from PIL import Image
from sklearn.externals import joblib
import ostarget_path = "1__get_image/"
source_result = []
for title in os.listdir(target_path):source_result.append(title.replace('.png',''))def predict(model):predict_result = []for q in range(1,101):pre_list = []y_list = []for i in range(0,4):part_path = "part1/" + str(q) + "_" + str(i) + ".png"# print(part_path)pix = np.asarray(Image.open(os.path.join(part_path)))pix = pix.reshape(25 * 30)pre_list.append(pix)y_list.append(part_path.split('/')[-1])pre_list = np.asarray(pre_list)y_list = np.asarray(y_list)result_list = model.predict(pre_list)print(result_list,q)predict_result.append(str(result_list[0] + result_list[1] + result_list[2] + result_list[3]))return predict_resultmodel = joblib.load('yipai.model')
predict_result = predict(model)
# print(source_result)
# print(predict_result)

相关文章:

★核心关注点_《信息系统项目管理师考试考点分析与真题详解》

★核心关注点_《信息系统项目管理师考试考点分析与真题详解》真诚感谢你选用《信息系统项目管理师考试考点分析与真题详解》作为高级项管的辅导用书。对于使用该书的读者们&#xff0c;在备考2012.5.26信息系统项目管理师考试之下午案例分析和论文写作考试时&#xff0c;以下一…

告别低分辨率网络,微软提出高分辨率深度神经网络HRNet | CVPR 2019

来源 | 微软研究院AI头条&#xff08;ID&#xff1a;MSRAsia&#xff09;作者简介&#xff1a;孙可&#xff0c;中国科学技术大学信息学院在读博士生&#xff0c;目前在微软亚洲研究院视觉计算组实习&#xff0c;导师是王井东和肖斌老师。他的研究兴趣包括人体姿态估计、语义分…

sudo提权实战讲解 对用户对组的权限配置分析

Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要&#xff0c;再来提升权限执行。 sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码&#xff0c;就可以…

【Qt】在Ubuntu16.04中安装QSerialPort模块

1、问题描述 在pro中添加&#xff1a;QT serialport 编译时报错&#xff1a;Project ERROR Unknown module(s) in QT:serialport 2、解决方法 安装QSerialPort模块库 sudo apt-get install libqt5serialport5-dev

Velocity文档(3)

2019独角兽企业重金招聘Python工程师标准>>> velocity.properties 的一些配置项 velocimcro.library属性&#xff1a;指定自己的模板库&#xff0c;多个模板库以逗号分隔。默认情况下&#xff0c;velocity查找唯一的一个库&#xff1a;VM_global_library.vmvelocima…

Java 24岁!Google加持的Kotlin真能取代它?

作者 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;1995 年 5 月 23 日&#xff0c;Sun 公司在 Sun world 会议上正式宣布了 Java 的到来&#xff0c;从此一代编程语言界的翘楚就此诞生。而在不断地迭代与适配中&#xff0c;今时今日&#xff0c;Java 以需…

三,ES6中需要注意的特性(重要)

-----书接上文&#xff0c;前文中我们总结了关于JS的组成部分以及如何快速开展学习JS&#xff0c;相信已经有很多朋友掌握到这些方法。接下来就从更深的ECMAScript开始说起。 1.什么是ES6? ECMAScript(European Computer Manufacturers Association) 6: 是JavaScript语言的下一…

【SVN】在阿里云上创建svn服务器

1、创建用户及相关设置 阿里云搭建ubuntu18.04工作台&#xff0c;默认只有root超级用户。为了安全起见&#xff0c;我们使用普通用户来创建svn&#xff1a; useradd hello // 创建用户hello mkdir -p /home/hello // 在hello用户的根目录 cd /home/hello chown hello . // 设…

【转】on delete cascade

关系表的级联更新&#xff1a; on update cascade on delete cascade 是级联删除的意思 意思是 当你更新或删除主键表时&#xff0c;那么外键表也会跟随一起更新或删除 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSER…

倒计时1天!CTA核心技术及应用峰会报名通道即将关闭(附参会攻略)

全球智能化趋势当前&#xff0c;人工智能技术正蓬勃发展。为了直击开发者在机器学习与人工智能技术研究与落地过程中的痛点与瓶颈&#xff0c;深入解析机器学习和知识图谱技术在行业中的实践和落地。2019 年 5 月 26 - 27 日&#xff0c;由中国 IT 社区 CSDN 与数字经济人才发展…

【Qt】在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效的解决方法

1、问题描述 Win10操作系统环境下,在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效。 2、原因分析 Ctrl+Shift+f快捷键在各种输入法中,常用来做中文简体和繁体输入的切换。QtCreator中该快捷键失效的的原因,多半是因为和输入法的快捷键冲突。可以在输入法的快捷…

Python修行之字符串(一):连接、切割、大小写、排版

字符串:1.是由一个个字符组成有序的序列&#xff0c;是字符的集合2.字符串是不可变对象3.使用单引号、双引号、三引号引住的字符序列4.python3中、字符串就是unicode类型、在2中分两种一种unicode一种非unicode字符串元素访问--下标:1.字符串支持使用索引访问2.有序的字符集合&…

UI自动化测试随笔

昨天给开发的同事讲我们正在做的自动化测试&#xff0c;同事问了句&#xff1a;为什么API的测试不需要写代码了&#xff0c;而UI的测试还需要写那么多代码呢&#xff1f; 能不写代码么&#xff1f; 目前我们的自动化测试的现状&#xff1a; 目前主要覆盖两个部分&#xff1a;A…

【跃迁之路】【554天】程序员高效学习方法论探索系列(实验阶段311-2018.08.13)...

(跃迁之路)专栏 【跃迁之路】奖励金计划正式开始 从2018.7.1起&#xff0c;【跃迁之路】奖励金计划正式起航&#xff0c;从今以后&#xff0c;&#xff0c; 每月1日&#xff0c;我会将自己个人上月收入的1%计入【跃迁之路】奖励金池&#xff0c;积累到足够金额后&#xff0c;将…

TensorFlow 2.0来了,为什么他却说“深度学习框架之争,现在谈结果为时尚早”?...

记者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;半个多世纪前&#xff0c;浙江大学老校长竺可桢曾有两个非常经典的教育问题&#xff1a;“诸位在校&#xff0c;有两个问题应该自己问问&#xff0c;第一&#xff0c;到浙大来做什么&#xff1f;第二&#…

【FFmpeg】ffmpeg工具源码分析(一):main函数

ffmpeg工具经常用来转换、生成媒体文件,下面是它的源码分析(一):main函数 ffmpeg版本:4.2.1 int main(int argc, char **argv) {int i, ret;BenchmarkTimeStamps ti; # 用于基准测试init_dynload(); # 初始化动态库加载路径,只在win3

Android之传感器(一)

传感器的种类&#xff1a;1. 动作传感器加速度传感器、重力传感器和陀螺仪&#xff08;判断手机姿态&#xff09;等2. 位置传感器方向传感器和磁力传感器3. 环境传感器温度传感器 、压力传感器和亮度传感器 使用传感器的方法&#xff1a;1. 获取SensorManager对象SensorManage…

【Qt】Qt单例模式三种实现

1、饿汉式 在头文件中:将构造函数私有化,并创建静态函数instance来获取实例 class A : public QObject {Q_OBJECT public:static A* instance(QObject *parent = nullptr);private:explicit A(QObject *parent = nullptr); }

程序员敲代码时,戴着耳机究竟在听什么?

今天&#xff0c;某妹子突然凑到我的耳边轻声说&#xff1a;“我们公司的程序员&#xff0c;清一色的戴着耳机&#xff0c;你说他们是不是故意不想听我们提的需求&#xff1f;”我很方&#xff0c;因为我也喜欢戴耳机。&#xff08;思考ing&#xff09;思考了一秒钟后&#xff…

关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题

关于Oracle.ManagedDataAccess数据库表加字段后&#xff0c;必须重启的问题&#xff0c;解决方法如下&#xff1a;在数据库连接字串中&#xff0c;增加一个参数&#xff1a;Metadata Poolingfalse如“Data Source(DESCRIPTION(ADDRESS_LIST(ADDRESS(PROTOCOLTCP)(HOST1.1.6.200…

配置导出MOSS2010列表数据到Excel并根据列表记录自动刷新数据

第一章 简介 场景描述 根据最近客户的需求&#xff0c;他们需要自动维护MOSS2010列表数据导出到Excel的数据实时同步&#xff0c;就是列表添加记录后&#xff0c;导出的Excel列表自动同步数据过来。 第二章 配置方法 1. 打开MOSS2010站点http://moss:8001的要导出的列表 2. 点【…

一个让Python代码运行更快的最佳方式!

作者 | Serdar Yegulalp译者 | 姜松浩&#xff0c;责编 | 屠敏转载自 CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Python因其强大、灵活且易于使用等特性&#xff0c;而赢得了声誉。这些优点使其在各种各样的应用程序、工作流程和领域中得到了广泛应用。但是就语言的设…

《Python基础教程第二版》第五章-条件、循环和其他语句(一)

print和import print打印多个表达式&#xff0c;用逗号,隔开 print abc:, 42, nonono #输出在每个参数之间添加空格 print在结尾处加上逗号,,接下来的语句会与前一条语句打印在同一行 print hello, print word! #hello word! import从模块中导入函数 import module from module…

【Qt】QStackedWidget:将多个窗口控件放入堆中,每次只显示一个窗口控件

1、简介 QStackedWidget可以容纳多个窗口控件,每次只显示其中一个。例如:登录页面、各种功能页面等不同时显示的窗口,可以放入QStackedWidget中。 2、demo // 创建三个页面 QWidget *firstPageWidget = new QWidget; QWidget *secondPageWidget = new QWidget; QWidget *…

Android模仿iPhone View旋转刷新数据动画详解

因为小马很喜欢在不同的页面之间跳转时加点好玩的动画&#xff0c;今天无意间看到一个动画效果感觉不错&#xff0c;几种效果图如下&#xff0c;既然好玩就写在博客中&#xff0c;直接说就是&#xff1a;该效果类似于iPhone中View的切换动画效果&#xff0c;今天就只介绍上面展…

【SQL】sql语句LEFT JOIN(拼接表)详解

1、语法 SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_nametable2.column_name;2、说明 按照一定规则&#xff0c;将表table1和表table12拼接起来。下面以学生管理系统为例&#xff0c;学生管理系统数据库各表如下 课程表&#xff1a; 学生表 成绩…

找啊找啊找木偶,图灵奖得主G. Hinton第一篇论文曝光!

作者 | Geoffrey Hinton 译者 | 李倩编辑 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;摘要针对在具有重叠结构的透明矩形中寻找木偶这一问题&#xff0c;Hinton大神想到使用松弛算法&#xff0c;通过从冲突局部解释网络中提取全局最佳图形的方式找木偶。介…

终于,「最近邻搜索」有通用方法了

作者&#xff1a;Kevin Hartnett 编译&#xff1a;Bing 如果你打算开一家咖啡馆&#xff0c;你一定想知道&#xff1a;“附近最近的一家咖啡馆在哪&#xff1f;”了解这些信息有助于应对商业竞争。 这种现象是计算机科学中广泛研究的问题&#xff0c;称为“最近邻搜索”。它的问…

tar自动打包指定文件夹中的文件到指定目录

这是我离开上一家公司&#xff0c;到XX人寿保险公司的第一个工作内容&#xff0c;很简单&#xff0c;可以减少每天重复的工作量。写一个脚本&#xff0c;将指定文件夹下的所有文件打包成以日期命名的格式并存放到其父目录中&#xff0c;自动检测该压缩包&#xff0c;保留时间为…

【SQL】sql语句GROUP BY

1、语法 SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name;2、说明 先对数据集分组&#xff0c;再根据规则批量处理每组数据。 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组&#xff0c;所谓的分组就是将…