Mac环境下Python识别图形验证码教程
本文详细介绍在Mac OS 10.14环境下使用Python识别图形验证码的完整流程。重点讲解pytesseract的安装配置,以及利用PIL进行灰度化和二值化处理,结合OpenCV进行去干扰线操作,从而提升验证码识别准确率。
前言
环境准备与工具选择
近期致力于研究验证码识别技术,特此整理安装与使用的详细步骤。尽管此前对验证码破解有一定了解,但多属简单尝试且未留存记录,导致后续使用时需重新检索资料,效率较低。因此,本文旨在记录研究过程中的关键节点,以便日后复用。
本文主要聚焦于图形验证码的识别研究,未来将根据实际情况不定期拓展相关内容。
经网络检索多种图形验证码识别方案,目前主流模块主要为pytesseract和tesserocr。由于在Mac环境下安装tesserocr时遭遇诸多错误且难以解决,最终决定采用pytesseract作为识别工具。
下文将详细记录安装及使用过程,实验系统环境为mac os 10.14。
安装依赖库
安装tesserocr
brew install tesserocr
由于pytesseract依赖tesserocr,因此首要步骤是安装tesserocr软件。随后需安装Python相关的依赖包。
安装python所需要的包
pip3 install pytesseract
pip3 install pillow
pytesseract用于识别图片中的文字,但验证码识别难度各异,通常需对图片进行预处理。此步骤需借助图像处理模块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模块的open()函数打开后,返回图像对象的模式均为“RGB”。若为灰度图像,无论格式如何,打开后模式为“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 -*-
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()
总结
以上所述为在Mac环境下使用Python识别图形验证码的功能介绍,希望能对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!若本文对您有帮助,欢迎转载,请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









