Post

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.