前言

  • 最近在研究验证码相关的操作,所以准备记录下安装以及使用的过程。虽然之前对验证码的破解有所了解的,但是之前都是简单使用之后就不用了,没有记录一个详细的过程,所以后面再用起来也要重新从网上查找资料比较麻烦,所以这里准备对研究过程的关键点做一个记录。

首先这篇文章,主要是研究图形验证码,后期会不定时拓展内容。

在网上查了很多版本的图形验证码识别,目前看到最多的两个模块是pytesseract和tesserocr,但是因为我这里安装tesserocr的时候各种出错,所以最终我锁定了使用pytesseract。

那么接下来,就记录下安装以及使用过程。这里的系统环境是mac os 10.14.

安装tesserocr

brew install tesserocr

因为pytesseract依赖于tesserocr所以首先需要先安装tesserocr这个软件。接下来就是安装python相关的包

安装python所需要的包

pip3 install pytesseract
pip3 install pillow

安装pytesseract是ocr识别图片上的字,因为验证码的识别难度高低不同,所以在这个过程中需要对图片做一定的处理,这就需要使用处理图片的模块pillow。

一个简单的demo

import pytesseract
from PIL import Image
import os def binarizing(img, threshold):
"""传入image对象进行灰度、二值处理"""
pixdata = img.load()
w, h = img.size
# 遍历所有像素,大于阈值的为黑色
for y in range(h):
for x in range(w):
if pixdata[x, y] < threshold:
pixdata[x, y] = 0
else:
pixdata[x, y] = 255
return img _temp = os.path.dirname(__file__)
file_path = os.path.join(_temp, 'code2.jpg')
print("file_path", file_path)
image = Image.open(file_path)
image = image.convert('L')
threshold = 157
table = []
# 接下来是二值化处理
# 遍历所有像素,大于阈值的为黑色,threshold是阀值
image = binarizing(image, threshold)
result = pytesseract.image_to_string(image)
print(result)

示例中的图片

需要用到的图像知识:

对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是“RGB”。而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为“L”也就是我们说的灰度化的一个操作。除此之外,还有其他的模式,不过我们在处理验证码的时候是将其转为灰度模式,所以就不强调其他的模式了。

模式“L”

模式“L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。在PIL中,从模式“RGB”转换为“L”模式是按照下面的公式转换的:

L = R * 299/1000 + G * 587/1000+ B * 114/1000

通过灰度化之后的图片变为



灰度化我们还要对其进行二值化操作

二值化操作

二值化故名思议,就是整个图像所有像素只有两个值可以选择,一个是黑(灰度为0),一个是白(灰度为255)。二值化的好处就是将图片上的有用信息和无用信息区分开来,比如二值化之后的验证码图片,验证码像素为黑色,背景和干扰点为白色,这样后面对验证码像素处理的时候就会很方便。对于简单的图形验证码,到这里基本上就够了,但是如果有干扰线,还要进行除干扰线的操作。

对应的代码为

def binarizing(img, threshold):
"""传入image对象进行灰度、二值处理"""
pixdata = img.load()
w, h = img.size
# 遍历所有像素,大于阈值的为黑色
for y in range(h):
for x in range(w):
if pixdata[x, y] < threshold:
pixdata[x, y] = 0 #小于阀值设为0,0是黑色
else:
pixdata[x, y] = 255 0 #大于阀值设为255,255是白色
return img

此时的图片效果为



可以看到图片变得锐化了很多,这个时候再去识别就比较好识别了。

去干扰线

常见的4邻域、8邻域算法。所谓的X邻域算法,可以参考手机九宫格输入法,按键5为要判断的像素点,4邻域就是判断上下左右,8邻域就是判断周围8个像素点。如果这4或8个点中255的个数大于某个阈值则判断这个点为噪音,阈值可以根据实际情况修改。

使用cv2处理

除此之外还可以使用cv2模块进行处理。

安装

 pip install opencv-python

代码示例

# -*- coding: utf-8 -*-
# @时间 : 2020-01-08 18:01
# @作者 : 陈祥安
# @文件名 : cv2_demo.py
# @公众号: Python学习开发 import cv2
import numpy as np
import os _temp = os.path.dirname(__file__)
file_path = os.path.join(_temp, 'code2.jpg') def remove_noise(img, k=4):
###8领域过滤
img2 = img.copy() # img处理数据,k过滤条件
w, h = img2.shape def get_neighbors(img3, r, c):
count = 0
for i in [r - 1, r, r + 1]:
for j in [c - 1, c, c + 1]:
if img3[i, j] > 10: # 纯白色
count += 1
return count # 两层for循环判断所有的点
for x in range(w):
for y in range(h):
if x == 0 or y == 0 or x == w - 1 or y == h - 1:
img2[x, y] = 255
else:
n = get_neighbors(img2, x, y) # 获取邻居数量,纯白色的邻居
if n > k:
img2[x, y] = 255
return img2 img = cv2.imread(file_path) # 将图片灰度化处理,降维,加权进行灰度化c
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
t, gray2 = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY)
cv2.imshow('threshold', gray2)
result = remove_noise(gray2)
cv2.imshow('8neighbors', result) cv2.waitKey(0) #cv2.destroyAllWindows()

参考资料

https://www.jb51.net/article/141428.htm

https://blog.csdn.net/icamera0/article/details/50843172

https://www.jb51.net/article/174093.htm

mac使用python识别图形验证码的更多相关文章

  1. Python识别网站验证码

    http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内 ...

  2. python爬虫20 | 小帅b教你如何使用python识别图片验证码

    当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 ...

  3. python 识别图片验证码报IOError

    说一下困扰了我一周的问题:识别图片验证码 本来我按照安装步骤(http://www.cnblogs.com/yeayee/p/4955506.html?utm_source=tuicool&u ...

  4. python 生成图形验证码

    文章链接:https://mp.weixin.qq.com/s/LYUBRNallHcjnhJb1R3ZBg 日常在网站使用过程中经常遇到图形验证,今天准备自己做个图形验证码,这算是个简单的功能,也适 ...

  5. 利用pytesser识别图形验证码

    简单识别 1.一般思路 验证码识别的一般思路为: 图片降噪 图片切割 图像文本输出 1.1 图片降噪 所谓降噪就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只剩下需要识别的文字,让图片变 ...

  6. 利用python生成图形验证码

    validCode.py import random from io import BytesIO from PIL import Image, ImageDraw, ImageFont def ge ...

  7. Python 代码实现验证码识别

    Python 代码实现验证码识别 测试开发社区  1周前 源 /  j_hao104 一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… ...

  8. Python脚本破解图形验证码(tesserocr和pytesseract)

    在学习之前,我们先了解OCR.tesseract.tesserocr.pytesseract和opencv这几个跟图片处理有关的库. OCR(Optical Character Recognition ...

  9. 爬虫(十二):图形验证码的识别、滑动验证码的识别(B站滑动验证码)

    1. 验证码识别 随着爬虫的发展,越来越多的网站开始采用各种各样的措施来反爬虫,其中一个措施便是使用验证码.随着技术的发展,验证码也越来越花里胡哨的了.最开始就是几个数字随机组成的图像验证码,后来加入 ...

随机推荐

  1. Serverless助力AI计算:阿里云ACK Serverless/ECI发布GPU容器实例

    ACK Serverless(Serverless Kubernetes)近期基于ECI(弹性容器实例)正式推出GPU容器实例支持,让用户以serverless的方式快速运行AI计算任务,极大降低AI ...

  2. @noi.ac - 488@ cleaner

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小Q计划在自己的新家中购置一台圆形的扫地机器人.小Q的家中有一个 ...

  3. AtCoder Beginner Contest 075 C Bridge(割边)

    求割边个数.Tarjan的板子.. #include <bits/stdc++.h> using namespace std; const int MAXN = 55; const int ...

  4. Element-ui学习笔记1

    1.col,row布局注意事项 el-row el-col gutter就是css,span的时候宽度是按boder-box来计算. 将 type 属性赋值为 'flex',可以启用 flex 布局, ...

  5. win10访问Microsoft数据库问题总结

    今天突然接到任务 把15年的一个wpf项目倒腾出来,根据客户要求微调界面效果 翻扯项目历史记录,找到最后一版的项目,不过历经三载,开发时的环境和现在的环境略有差距 原来:win7 64位   vs20 ...

  6. 基于jQuery+JSON的省市联动效果

    省市区联动下拉效果在WEB应用中使用非常广泛,尤其在一些会员信息系统.电商网站最为常见,开发者一般使用AJAX实现无刷新下拉联动. 本文将讲述利用jQuery插件,通过读取JSON数据,实现无刷新动态 ...

  7. java代码注释:单行//,多行/* */,文档注释/** */

    1.单行注释      //: //后到本行结束的所有字符会被编译器忽略; 2.多行注释     /* */: /*  */之间的所有字符会被编译器忽略 3.文档注释     /** */: 在/** ...

  8. origin/HEAD -> origin/master 这个分支是干嘛的啊

    ➜ sso git:(master) ✗ git branch -r origin/4.0 origin/HEAD -> origin/master origin/master origin/H ...

  9. HTML让文字在图片上显示的几种方法

    第一种方式是image 作为背景图片,即:background:url("......."); 第二种方式是将img块与文字块(文字块采用span标签显示)放在同一个div 中,然 ...

  10. H3C 基本的局域网间路由