0801OCR识别验证码
用tesserocr对一个非常简单的验证码识别实例
前置工作
- retrying:提供了一些装饰器,方便配置重试机制。安装:
pip3 install retrying
- Pillow:Python的一个支持图像处理的库。安装:
pip3 install Pillow
- Numpy:Python中的一个科学计算库(文档、中文教程)。安装:
pip3 install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
- Tesserocr(文档):是Python的一个 OCR识别库,它的核心是Tesseract
- Mac下安装
1 2 3 4 5 6 7 8
#ImageMagick是一款免费开源的图片编辑软件。既可以通过命令行使用,也可以通过C/C++、Java、Python或Ruby调用库编程来完 brew install tesseract #brew install imagemagick brew install tesseract-lang #brew install tesseract --all-languages pip3 install tesserocr #配置环境变量 export TESSDATA_PREFIX="/usr/local/share/tessdata"
图片干扰处理。
实例中验证造成干扰的点,其颜色大多比文本的颜色更浅,因此可通过颜色将造成干扰的点排除掉:先将图片转换成8位的黑白图,再通过一个阈值过滤掉干扰点。
Image.mode 属性(PIL的Image)定义了图片的类型和像素的位宽
mode值 | 含义 |
---|---|
1 | 像素用1位表示,Python 中表示为 True 或 False,即二值化。 |
L | 像素用8位表示,取值 0~255,表示灰度图像,数字越小,颜色越黑。 |
P | 像素用8位表示,即调色板数据 |
RGB | 像素用 3x8位表示,即真彩色 |
RGBA | 像素用 4x8 位表示,即有透明通道的真彩色。 |
CMYK | 像素用 4x8 位表示,即印刷四色模式。 |
YCbCr | 像素用 3x8 位表示,即彩色视频格式。 |
I | 像素用 32 位整型表示。 |
F | 像素用 32 位浮点型表示。 |
去干扰代码
1
2
3
4
5
6
7
8
9
from PIL import Image
import numpy as np
import tesserocr
def preprocess(image):
image = image.convert('L') #L:像素用8位表示,取值[0,255].即灰度图片。数值越小,颜色越黑(下面的where用到)
array = np.array(image) #转换成Numpy数组
array = np.where(array > 50, 255, 0)#>50的设置成255(白色),否则设置成0(黑色).也就是将图片完全黑白画
image = Image.fromarray(array.astype('uint8'))#
return image
pytesseract:
同样是基于tesseract的ocr(识别貌似比tesserocr好很多)
Mac下安装
1
2
3
4
5
6
brew install tesseract
brew install tesseract-lang
pip3 install pytesseract
#配置环境变量
export TESSDATA_PREFIX="/usr/local/share/tessdata"
实例中的干扰用pytesseract不用做处理就可识别
1
captcha=pytesseract.image_to_string(image, lang='chi_sim+eng') #lang参数可不传。chi_tra=繁体中文
This post is licensed under CC BY 4.0 by the author.