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: 891915210[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

希望对大家有帮助哦!!

原文地址:https://www.cnblogs.com/bianzhiwei/p/9397136.html

时间: 2024-10-07 21:05:21

opencv 验证码 识别的相关文章

常见验证码的弱点与验证码识别

http://drops.wooyun.org/tips/141 常见验证码的弱点与验证码识别 insight-labs · 2013/06/08 11:36 0x00 简介 验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助. 全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing t

ubuntu 安装(install) pwntcha[一个做"验证码识别"的开源程序]

一.安装 1. sudo apt-get install libsdl1.2-dev libsdl1.2debian sudo apt-get install libsdl1.2-dev(比较大,10M左右) sudo apt-get install libsdl-image1.2-dev sudo apt-get install libsdl-mixer1.2-dev sudo apt-get install libsdl-ttf2.0-dev sudo apt-get install lib

Python验证码识别--利用pytesser识别简单图形验证码

一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等. 在破解验证码中需要用

转:常见验证码的弱点与验证码识别

常见验证码的弱点与验证码识别 验证码作为一种辅助安全手段在Web安全中有着特殊的地位,验证码安全和web应用中的众多漏洞相比似乎微不足道,但是千里之堤毁于蚁穴,有些时候如果能绕过验证码,则可以把手动变为自动,对于Web安全检测有很大的帮助. 全自动区分计算机和人类的图灵测试(英语:Completely Automated Public Turing test to tell Computers and Humans Apart,简称CAPTCHA),俗称验证码,是一种区分用户是计算机和人的公共全

[blog]验证码识别--资料收集

证码识别--资料收集 一.验证码基础知识 验证码设计的目的就是区分“人”和“机器”,所以它在被设计的时候,主要的目的就是防止被采用就是自动识别出来.所以作为破解者来说,一开始就是处于劣势地位的.当然这使得验证码的破解变成了一项结合图像识别.模式识别的猜谜解题活动. 验证码的识别很难达到100%.因为在现实生活中,人也可能是识别错误的,所以当错误发生的时候,验证码识别系统会再提供一个新的验证码.如果单次识别有50%的识别成功率(也就是50%的失败率),那么连续三次的总体成功率就可以达到0.875(

JAVA验证码识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本

JAVA验证识别:基于jTessBoxEditorFX和Tesseract-OCR训练样本 工具准备: jTessBoxEditorFX下载:https://github.com/nguyenq/jTessBoxEditorFX Tesseract-OCR下载:https://sourceforge.net/projects/tesseract-ocr/ 主要步骤: JTessBoxEditorFX,Tesseract-OCR(环境变量配置)下载,jar包准备(maven,见下面pom文件) 下

Python验证码识别:利用pytesser识别简单图形验证码

一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域--    简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等. 在破解验证码中

Python 代码实现验证码识别

Python 代码实现验证码识别 测试开发社区  1周前 源 /  j_hao104 一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.

车牌识别及验证码识别的一般思路

http://www.pin5i.com/showtopic-22246.html 描述一下思路及算法. 全文分两部分,第一部分讲车牌识别及普通验证码这一类识别的普通方法,第二部分讲对类似QQ验证码,Gmail验证码这一类变态验证码的识别方法和思路. 一.车牌/验证码识别的普通方法 车牌.验证码识别的普通方法为: (1)      将图片灰度化与二值化 (2)      去噪,然后切割成一个一个的字符 (3)      提取每一个字符的特征,生成特征矢量或特征矩阵 (4)      分类与学习.