1. 工具准备
- Tesseract-OCR引擎
该引擎由惠普公司开发,2005年开源,之后由Google开发维护。可以用于识别简单的验证码。
Linux下安装:sudo apt-get tesseract-ocr
Windows下安装:Tesseract-OCR下载链接
Python pytesseract 库
pytesseract 是对 Tesseract-OCR 的一个封装,方便我们在 Python 中调用 Tesseract-OCR 引擎。可以直接通过pip安装。PIL(Python Imaging Library)/Pillow
PIL(Python Imaging Library)是Python常用的图像处理库,而Pillow是PIL的一个友好Fork,提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。目前PIL只支持python2,而Pillow可以支持python3。安装PIL比较麻烦,推荐使用Pillow,可以直接通过pip或者apt install来安装。
2. 识别思路
首先对图片做二值化来降噪处理,去掉图片中的噪点,干扰线等。然后将图片中的单个字符切分出来。最后识别每个字符。
图片的处理,我采用 Python 标准图像处理库 PIL。图片分割,我暂时采用谷歌开源库 Tesseract-OCR。字符识别则使用 pytesseract 库。
3. 代码实现
3.1 获取并打开图片
获取图片验证码,你可以通过使用网络请求库下载。我为了方便,将图片下载到本地并放在项目目录下。
from PIL import Image
'''
获取图片
'''
def getImage():
fileName = '16.jpg'
img = Image.open()
# 打印当前图片的模式以及格式
print('未转化前的: ', img.mode, img.format)
# 使用系统默认工具打开图片
# img.show()
return img
3.2 预处理
这一步主要是将图片进行降噪处理, 把图片从 "RGB" 模式转化为 "L" 模式,也就是把彩色图片变成黑白图片。再处理掉背景噪点,让字符和背景形成黑白的反差。
'''
1) 将图片进行降噪处理, 通过二值化去掉后面的背景色并加深文字对比度
'''
def convert_Image(img, standard=127.5):
'''
【灰度转换】
'''
image = img.convert('L')
'''
【二值化】
根据阈值 standard , 将所有像素都置为 0(黑色) 或 255(白色), 便于接下来的分割
'''
pixels = image.load()
for x in range(image.width):
for y in range(image.height):
if pixels[x, y] > standard:
pixels[x, y] = 255
else:
pixels[x, y] = 0
return image
打开彩色图片,PIL 会将图片解码为三通道的 “RGB” 图像。调用 convert('L') 才会把图片转化为黑白图片。其中模式 “L” 为灰色图像, 它的每个像素用 8 个bit表示, 0 表示黑, 255 表示白, 其他数字表示不同的灰度。
在 PIL 中,从模式 “RGB” 转换为 “L” 模式是按照下面的公式转换的:
L = R 的值 x 299/1000 + G 的值 x 587/1000+ B 的值 x 114/1000
图像的二值化,就是将图像上的像素点的灰度值两极分化(设置为 0 或 255,0表示黑,255表示白),也就是将整个图像呈现出明显的只有黑和白的视觉效果。目的是加深字符与背景的颜色差,便于 Tesseract 的识别和分割。对于阈值的选取,我采用比较暴力的做法,直接使用 0 和 255 的平均值。
3.3 识别
经过上述处理,图片验证码中的字符已经变成很清晰了。
最后一步是直接用 pytesseract 库识别。
import pytesseract
'''
使用 pytesseract 库来识别图片中的字符
'''
def change_Image_to_text(img):
'''
如果出现找不到训练库的位置, 需要我们手动自动
语法: tessdata_dir_config = '--tessdata-dir "<replace_with_your_tessdata_dir_path>"'
'''
testdata_dir_config = '--tessdata-dir "C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"'
textCode = pytesseract.image_to_string(img, lang='eng', config=testdata_dir_config)
# 去掉非法字符,只保留字母数字
textCode = re.sub("\W", "", textCode)
return textCode
Tesseract-ORC 默认是没有指定安装路径。我们需要手动指定本地 Tesseract 的路径。不然会报出这样的错误:
FileNotFoundError: [WinError 2] 系统找不到指定的文件
具体解决方案是:
使用文本编辑器打开 pytesseract 库的 pytesseract.py
文件,一般路径如下:
D:\software\python\Lib\site-packages\pytesseract\pytesseract.py
将 tesseract_cmd
修改成你电脑本地的 Tesseract-OCR 的安装路径。
# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
tesseract_cmd = 'D:\software\Tesseract-OC\tesseract.exe'
总结
Tesseract-ORC可以用于识别简单的验证码,对于复杂的验证码可以考虑使用神经网络自己训练验证码库。