热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:opencv验证码识别

本文由编程笔记#小编为大家整理,主要介绍了opencv验证码识别相关的知识,希望对你有一定的参考价值。示例图片:  
本文由编程笔记#小编为大家整理,主要介绍了opencv 验证码 识别相关的知识,希望对你有一定的参考价值。


示例图片 :  技术分享图片

 

主要应用原理为:1

1、先识别出图片中每个像素的数量   例如 红色在200左右

2、将红色的像素单独提出来  这样起到去除噪点的作用

3、分割图片并保存  

4、识别图片

 

具体代码如下:


1 # coding=utf-8
2 # !/usr/bin/python
3 """
4 opencv 验证码识别
5 Created on: 2018/7/31 16:12
6 @author: 虫子慢慢爬
7 Email: [email protected]
8 """
9 # -*- coding=GBK -*-
10
11 from PIL import Image
12 import hashlib
13 import time
14
15 im = Image.open("C:/Users/admin/Desktop/image/p.jpg")
16
17 # (将图片转换为8位像素模式)
18
19 im = im.convert("P")
20
21 # 打印颜色直方图
22
23 print(im.histogram())
24 """颜色直方图的每一位数字都代表了在图片中含有对应位的颜色的像素的数量。
25 ?? 每个像素点可表现256种颜色,你会发现白点是最多
26 (白色序号255的位置,也就是最后一位,可以看到,有625个白色像素)。
27 红像素在序号200左右,我们可以通过排序,得到有用的颜色。
28 """
29 his = im.histogram()
30
31 values = {}
32
33 for i in range(256):
34 values[i] = his[i]
35
36 for j, k in sorted(values.items(), key=lambda x: x[1], reverse=True)[:10]:
37 print(j, k)
38 """
39 我们得到了图片中最多的10种颜色,
40 其中 220 与 227 才是我们需要的红色和灰色,
41 可以通过这一讯息构造一种黑白二值图片
42 """
43 im2 = Image.new("P", im.size, 255)
44
45 for x in range(im.size[1]):
46
47 for y in range(im.size[0]):
48 pix = im.getpixel((y, x))
49 if pix == 225: # these are the numbers to get
50 im2.putpixel((y, x), 0)
51
52 im2.show()
53 # time.sleep(3)
54 """?接下来的工作是要得到单个字符的像素集合,由于例子比较简单,我们对其进行纵向切割:"""
55
56 inletter = False
57
58 foundletter = False
59
60 start = 0
61
62 end = 0
63
64 letters = []
65
66 for y in range(im2.size[0]):
67
68 for x in range(im2.size[1]):
69 pix = im2.getpixel((y, x))
70
71 if pix != 255:
72 inletter = True
73
74 if foundletter == False and inletter == True:
75 foundletter = True
76 start = y
77
78 if foundletter == True and inletter == False:
79 foundletter = False
80 end = y
81 letters.append((start, end))
82
83 inletter = False
84
85 print(letters)
86
87 # [(6, 14), (15, 25), (27, 35), (37, 46), (48, 56), (57, 67)]
88
89 """??得到每个字符开始和结束的列序号。"""
90
91 count = 0
92
93 for letter in letters:
94 m = hashlib.md5()
95
96 im3 = im2.crop((letter[0], 0, letter[1], im2.size[1]))
97 ss1 = str(time.time()) + str(count)
98 print(ss1)
99 m.update(ss1.encode(utf-8))
100 # 对图片进行切割,得到每个字符所在的那部分图片。
101 im3.save("./%s.gif" % (m.hexdigest()))
102
103 count += 1
104 """
105 在这里我们使用向量空间搜索引擎来做字符识别,它具有很多优点:
106
107 不需要大量的训练迭代
108
109 不会训练过度
110
111 你可以随时加入/移除错误的数据查看效果
112
113 很容易理解和编写成代码
114
115 提供分级结果,你可以查看最接近的多个匹配
116
117 对于无法识别的东西只要加入到搜索引擎中,马上就能识别了。
118
119 ??当然它也有缺点,例如分类的速度比神经网络慢很多,它不能找到自己的方法解决问题等等。
120
121 ??向量空间搜索引擎名字听上去很高大上其实原理很简单。拿文章里的例子来说:
122
123 ??你有 3 篇文档,我们要怎么计算它们之间的相似度呢?两篇文档所使用的相同的单词越多,那这两篇文章就越相似!但是这单词太多怎么办,就由我们来选择几个关键单词,选择的单词又被称作特征,每一个特征就好比空间中的一个维度(x,y,z 等),一组特征就是一个矢量,每一个文档我们都能得到这么一个矢量,只要计算矢量之间的夹角就能得到文章的相似度了。
124
125 ??用 Python 类实现向量空间:
126 """
127
128 import math
129
130
131 class VectorCompare:
132
133 # 计算矢量大小
134
135 def magnitude(self, concordance):
136
137 total = 0
138
139 for word, count in concordance.iteritems():
140 total += count ** 2
141
142 return math.sqrt(total)
143
144 # 计算矢量之间的 cos 值
145
146 def relation(self, concordance1, concordance2):
147
148 relevance = 0
149
150 topvalue = 0
151
152 for word, count in concordance1.iteritems():
153
154 if concordance2.has_key(word):
155 topvalue += count * concordance2[word]
156
157 return topvalue / (self.magnitude(concordance1) * self.magnitude(concordance2))
158
159 # ??它会比较两个 python 字典类型并输出它们的相似度(用 0~1 的数字表示)
160
161 """
162 将之前的内容放在一起
163 ??还有取大量验证码提取单个字符图片作为训练集合的工作,但只要是有好好读上文的同学就一定知道这些工作要怎么做,在这里就略去了。可以直接使用提供的训练集合来进行下面的操作。
164
165 ??iconset目录下放的是我们的训练集。
166
167 ??最后追加的内容:
168
169 """
170
171 # 将图片转换为矢量
172
173 def buildvector(im):
174
175 d1 = {}
176
177 count = 0
178
179 for i in im.getdata():
180 d1[count] = i
181
182 count += 1
183
184 return d1
185
186
187 v = VectorCompare()
188
189 icOnset= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, a, b, c, d, e, f, g, h, i, j, k,
190 l, m, n, o, p, q, r, s, t, u, v, w, x, y, z]
191
192 import os
193
194 # 加载训练集
195
196 imageset = []
197
198 for letter in iconset:
199
200 for img in os.listdir(./iconset/%s/ % (letter)):
201
202 temp = []
203
204 if img != "Thumbs.db" and img != ".DS_Store":
205 temp.append(v.buildvector(Image.open("./iconset/%s/%s" % (letter, img))))
206
207 imageset.append({letter: temp})
208
209 count = 0
210
211 # 对验证码图片进行切割
212
213 for letter in letters:
214 m = hashlib.md5()
215
216 im3 = im2.crop((letter[0], 0, letter[1], im2.size[1]))
217
218 guess = []
219
220 # 将切割得到的验证码小片段与每个训练片段进行比较
221
222 for image in imageset:
223
224 for x, y in image.iteritems():
225
226 if len(y) != 0:
227 guess.append((v.relation(y[0], v.buildvector(im3)), x))
228
229 guess.sort(reverse=True)
230
231 print("", guess[0])
232
233 count += 1

 

希望对大家有帮助哦!!


推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • python oj刷题网站_中小学计算机竞赛去哪里刷题?橙旭园OJ系统上线啦!
    原标题:中小学计算机竞赛去哪里刷题?橙旭园OJ系统上线啦!相信许多人在学习完编程之后都会茫然,感觉自己无所不能࿰ ... [详细]
  • 【Python 爬虫】破解按照顺序点击验证码(非自动化浏览器)
    #请求到验证码base64编码json_img_datajson_raw.get(Vimage)#获取到验证码编码 #保存验证码图片到本地defbase64_to_img(bstr ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
author-avatar
好咯午睡了_740
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有