Python实现验证码识别

1. 前言

验证码是一个常见的安全措施,能够在很大程度上防止机器人或自动化程序对我们的网站进行攻击。验证码就是一段有意义又复杂的文本,用于防止自动化程序的攻击。现在大部分的网站都会使用验证码来保证安全,验证码有很多种形式,比如常见的数字、字母、图像等等。

这篇文章中,我们将会使用Python实现验证码识别。具体来说,我们将会使用Python中的第三方库 Tesseract,配合Python代码来实现验证码的识别。

2. Tesseract介绍

Tesseract 是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,能够识别多种语言。Tesseract最初由HP实验室开发,后来由Google接手维护,现在已经成为最受欢迎的OCR引擎之一。

Tesseract支持多种语言,包括英文、中文、日文等等,而且它还有很好的错误容忍度。也就是说,即使图像质量不高,Tesseract仍然能够正确地识别出验证码上的文本。

3. 安装Tesseract

在使用Tesseract之前,我们需要先安装它。下面是安装Tesseract的步骤:

3.1 Windows

如果你使用Windows操作系统,你可以从以下网站下载安装文件:https://github.com/UB-Mannheim/tesseract/wiki

下载完之后,双击运行安装程序,按照提示逐步进行安装。安装完成后,我们需要将Tesseract添加到系统环境变量中。

首先,打开“控制面板” -> “系统与安全” -> “系统” -> “高级系统设置”,在“高级”选项卡中,点击“环境变量”按钮。

在下图所示的窗口中,找到“系统变量”部分,选择“Path”变量,然后点击“编辑”按钮。

在下图所示的窗口中,点击“新建”按钮,然后输入Tesseract的安装路径(比如:“C:\Program Files (x86)\Tesseract-OCR”),点击“确定”按钮。在所有打开的窗口中,再次点击“确定”按钮。

至此,Tesseract就已经成功地安装和配置好了。

3.2 Ubuntu

如果你使用Ubuntu操作系统,你可以使用命令行来安装Tesseract。具体来说,打开终端,输入以下命令即可:

sudo apt-get update

sudo apt-get install tesseract-ocr

sudo apt-get install libtesseract-dev

在执行完以上命令之后,Tesseract就已经安装成功了。

4. 验证码识别

在安装完Tesseract并且配置好环境之后,我们就可以开始使用它来识别验证码了。

首先,我们需要安装Python中的一个名为pytesseract的库,它能够让Python与Tesseract之间进行交互。安装pytesseract命令如下所示:

pip install pytesseract

4.1. 识别数字验证码

下面我们先以数字验证码为例,来演示一下如何使用Tesseract和Python来识别验证码。

我们先定义一个Python函数,使用pytesseract来识别数字验证码。代码如下所示:

import pytesseract

from PIL import Image

# 识别数字验证码

def recognize_captcha(captcha):

# 加载图片

image = Image.open(captcha)

# 将图片转化为灰度图像

image = image.convert('L')

# 对图片进行二值化处理

threshold = 127

image = image.point(lambda x: 0 if x < threshold else 255)

# 识别验证码

text = pytesseract.image_to_string(image)

# 去掉识别结果中的空格和换行符

text = text.replace(' ', '').replace('\n', '')

return text

上面的代码中,我们首先使用Pillow库的Image模块来加载验证码图片。然后,我们将图片转换为灰度图像,并对其进行二值化处理。最后,我们使用pytesseract来识别验证码,并返回识别结果。

接下来,我们来测试一下这个函数的功能。我们先准备一张数字验证码图片,如下所示:

下面是使用上述Python代码来识别上图中的数字验证码的结果:

text = recognize_captcha('captcha.jpg')

print(text)

输出结果:

123456

从输出结果可以看出,我们成功地识别出来了数字验证码上的文本“123456”。

4.2. 识别字母与数字混合的验证码

下面我们来尝试一下,如何使用Tesseract和Python来识别字母与数字混合的验证码。

我们依然可以使用上面的Python代码来识别验证码,不过我们需要对验证码的预处理稍作修改。下面是新的Python代码:

import pytesseract

from PIL import Image

# 识别字母与数字混合的验证码

def recognize_captcha(captcha):

# 加载图片

image = Image.open(captcha)

# 将图片转化为灰度图像

image = image.convert('L')

# 对图片进行二值化处理

threshold = 127

image = image.point(lambda x: 0 if x < threshold else 255)

# 对图片进行降噪处理

for i in range(0, image.size[0]):

for j in range(0, image.size[1]):

count = 0

if image.getpixel((i, j)) == 0:

if image.getpixel((i-1, j-1)) == 255:

count = count + 1

if image.getpixel((i-1, j)) == 255:

count = count + 1

if image.getpixel((i-1, j+1)) == 255:

count = count + 1

if image.getpixel((i, j-1)) == 255:

count = count + 1

if image.getpixel((i, j+1)) == 255:

count = count + 1

if image.getpixel((i+1, j-1)) == 255:

count = count + 1

if image.getpixel((i+1, j)) == 255:

count = count + 1

if image.getpixel((i+1, j+1)) == 255:

count = count + 1

if count > 4:

image.putpixel((i, j), 255)

# 识别验证码

text = pytesseract.image_to_string(image)

# 去掉识别结果中的空格和换行符

text = text.replace(' ', '').replace('\n', '')

return text

上面的代码比之前的代码多了一段降噪处理的代码。这是因为字母与数字混合的验证码通常会在图像中添加噪点,因此我们需要对图像进行降噪处理,以提高验证码识别的准确率。

接下来,我们来测试一下这个新函数的功能。我们先准备一张字母与数字混合的验证码图片,如下所示:

下面是使用上面的Python代码来识别上图中的验证码的结果:

text = recognize_captcha('captcha.jpg')

print(text)

输出结果:

8Wj6H4

从输出结果可以看出,我们成功地识别出来了字母与数字混合的验证码上的文本“8Wj6H4”。

4.3. 调整tesseract配置

在某些情况下,我们无法正确识别验证码中的文本。这可能是由于Tesseract的配置文件中的默认参数不适用于我们的验证码。因此,我们需要调整Tesseract的配置文件,以提高识别准确率。

具体来说,我们可以通过设置tessedit_char_whitelist参数来指定Tesseract只识别哪些字符。例如,如果只需要识别数字和字母,我们可以将tessedit_char_whitelist参数设置为“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”,如下所示:

import pytesseract

from PIL import Image

# 调整tesseract配置并识别字母与数字混合的验证码

def recognize_captcha(captcha):

# 加载图片

image = Image.open(captcha)

# 将图片转化为灰度图像

image = image.convert('L')

# 对图片进行二值化处理

threshold = 127

image = image.point(lambda x: 0 if x < threshold else 255)

# 对图片进行降噪处理

for i in range(0, image.size[0]):

for j in range(0, image.size[1]):

count = 0

if image.getpixel((i, j)) == 0:

if image.getpixel((i-1, j-1)) == 255:

count = count + 1

if image.getpixel((i-1, j)) == 255:

count = count + 1

if image.getpixel((i-1, j+1)) == 255:

count = count + 1

if image.getpixel((i, j-1)) == 255:

count = count + 1

if image.getpixel((i, j+1)) == 255:

count = count + 1

if image.getpixel((i+1, j-1)) == 255:

count = count + 1

if image.getpixel((i+1, j)) == 255:

count = count + 1

if image.getpixel((i+1, j+1)) == 255:

count = count + 1

if count > 4:

image.putpixel((i, j), 255)

# 识别验证码

tessdata_dir_config = r'--tessdata-dir "D:\Program Files (x86)\Tesseract-OCR\tessdata"'

text = pytesseract.image_to_string(image, lang='eng', config=tessdata_dir_config + r' --psm 7 --oem 3 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')

# 去掉识别结果中的空格和换行符

text = text.replace(' ', '').replace('\n', '')

return text

上述代码中,我们使用tessdata_dir_config参数来指定Tesseract的配置文件所在的目录。然后,我们将tessedit_char_whitelist参数设置为数字和字母,以便只识别这些字符。

总结

通过本文,我们了解到Tesseract是如何识别验证码的,以及如何使用 Python 和Tesseract来识别验证码。

实际的场景中,验证码种类多样,复杂度也各异,上述方法不能涵盖所有种类的验证码。但是,借助Python的灵活性,我们可以结合多种算法和技术来提高验证码识别的准确率,并且一定要注意保护验证码的安全和隐私。

后端开发标签