图像识别预处理(配合pytesseract使用)
一、灰度转换和二值化处理
1. 灰度转换(Grayscale Conversion)
灰度转换是把彩色图像转变为灰度图像的过程。在灰度图像里,每个像素仅用一个数值来体现亮度,这个数值的范围是 0(代表黑色)到 255(代表白色),中间值则表示不同程度的灰色。
在 Python 的 PIL 库中,im.convert(‘L’)就实现了这种转换。转换后的图像保留了原图中所有的亮度信息,从纯黑到纯白有着连续的灰度变化。
2. 二值化处理(Binarization)
二值化处理是将图像转换为仅包含两种颜色(通常是黑色和白色)的过程。在二值图像中,每个像素的值只能是 0(黑色)或者 255(白色),不存在中间的灰度值。
二值化一般是先把图像转为灰度图,再依据一个设定的阈值对像素进行分类。当像素值大于阈值时,就设为 255(白色);小于阈值时,设为 0(黑色)。
3. 两者的主要区别
灰度转换 | 二值化处理 |
---|---|
每个像素有 256 种可能的灰度值 | 每个像素只有 2 种取值(0 或 255) |
保留了原图的亮度信息 | 丢失了原图的亮度信息,仅保留黑白对比 |
图像呈现为不同深浅的灰色 | 图像呈现为纯粹的黑白效果 |
二、pytesseract
- PyTesseract 可以直接处理原始图像,但对质量较差的图片(如模糊、有噪点、光照不均),预处理能显著提升识别准确率。高质量图像(清晰、无噪点、光照均匀),低质量图像(扫描件、手机拍摄、光照不均)。
- 默认配置是针对标准印刷体文本优化的,而验证码这类特殊文本需要定制参数才能正常工作。
1、安装准备
(1)安装tesseract OCR并配置系统环境变量,教程自行百度
(2)因为我用pycharm,所以直接在pycharm的terminal模块键入如下命令即可
- pytesseract
pip install pytesseract -i https://pypi.tuna.tsinghua.edu.cn/simple
- cv2
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
2、配置参数
在使用 PyTesseract 进行 OCR 时,合理配置参数是提高识别准确率的关键。
Tesseract 常用参数的详细解释和适用场景
3、预处理的常见方法
测试图片:captcha2.png
(1)灰度转换
将彩色图像转为灰度图,减少数据维度
from PIL import Image
im = Image.open('./Data/captcha2.png')
# 把彩色图像转化为灰度图像
imgry = im.convert('L')
imgry.show()
(2)二值化处理
将图像转为黑白二值图,突出文本轮廓
import pytesseract
from PIL import Image
im = Image.open('./Data/captcha2.png')# 把彩色图像转化为灰度图像。RBG转化到HSI彩色空间,采用I分量
imgry = im.convert('L')
imgry.show()# 二值化处理写法1
# 把像素点大于阈值的设置,1,小于阈值的设置为0。生成一张查找表,再调用point()进行映射。
threshold = 140
table = []
for i in range(256):if i < threshold:table.append(0)else:table.append(1)
out = imgry.point(table, '1')
out.show()# # 二值化处理写法2:匿名函数
# im_gary = im.point(lambda x: 0 if x<143 else 255) #二值化处理
# im_gary.show()# 配置参数(仅识别数字和小写字母)
# 默认配置是针对标准印刷体文本优化的,而验证码这类特殊文本需要定制参数才能正常工作
config = r'--oem 3 --psm 8 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz'
text = pytesseract.image_to_string(out, config=config)
text = text.replace(' ', '').replace('\n', '') #这里因为识别出来的文字可能会有空格和回车
print(text.strip())
(3)降噪处理(OpenCV)
使用 OpenCV 去除噪点(如椒盐噪声)
import cv2
import pytesseractimage = cv2.imread('./Data/captcha2.png') # 读取原始图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 灰度转换
blur = cv2.GaussianBlur(gray, (5, 5), 0) # 高斯模糊降噪# 自适应阈值
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
"""
cv2.threshold() 返回两个值:
(1)第一个值:计算得到的阈值(Otsu 算法自动计算的阈值)。
(2)第二个值:阈值处理后的二值化图像。
在 Python 中,_ 是一个惯用的占位符,表示 “这个变量我不关心,不需要使用”。cv2.THRESH_BINARY + cv2.THRESH_OTSU:阈值类型,结合了两种模式:
(1)cv2.THRESH_BINARY:二值化模式(超过阈值设为最大值,否则设为 0)
(2)cv2.THRESH_OTSU:Otsu 自适应阈值算法,自动计算最佳阈值。
"""# 展示图像
cv2.imshow('原始图像', image)
cv2.imshow('灰度图', gray)
cv2.imshow('高斯模糊', blur)
cv2.imshow('二值化结果', binary)# text = pytesseract.image_to_string(binary) # 根据需要选择配不配置参数# 配置参数(仅识别数字和小写字母)
# 默认配置是针对标准印刷体文本优化的,而验证码这类特殊文本需要定制参数才能正常工作
config = r'--oem 3 --psm 8 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz'
text = pytesseract.image_to_string(binary, config=config)print(text.strip()) #text.strip()用于移除字符串开头和结尾的空白字符cv2.waitKey(0) # 确保图像窗口保持打开状态,直到用户手动关闭。
cv2.destroyAllWindows()# 关闭所有 OpenCV 窗口,释放系统资源,通常在程序结束前调用。
处理过程中显示的图像,依次为:二值化结果、高斯模糊、灰度图、原始图像
(4)调整图像尺寸与锐化
- 调整图像尺寸
Tesseract 对高度约为 30-50 像素的字符识别效果最佳。若原始图像字符过小(如验证码),放大后能显著提升准确率。 - 锐化
增强边缘对比度:使字符边缘更清晰,减少模糊,帮助 Tesseract 更好地识别字符边界。
抵消缩放带来的模糊:放大操作可能导致轻微模糊,锐化可部分恢复细节
from PIL import Image
from PIL import ImageFilter
import pytesseractimage = Image.open('./Data/captcha2.png')
# 放大2倍,使用 LANCZOS 重采样算法
# Tesseract 对高度约为 30-50 像素的字符识别效果最佳。若原始图像字符过小(如验证码),放大后能显著提升准确率。
image = image.resize((image.width * 2, image.height * 2), Image.Resampling.LANCZOS)# # 缩放示例:缩小50%
# image = image.resize((image.width // 2, image.height // 2), Image.LANCZOS)image.show() #显示图像# 锐化:增强边缘对比度:使字符边缘更清晰;抵消缩放带来的模糊:放大操作可能导致轻微模糊,锐化可部分恢复细节
sharpened = image.filter(ImageFilter.SHARPEN)
sharpened.show() #显示图像
4、预处理流程示例
import cv2
import pytesseract
import numpy as npdef preprocess_image(image_path):# 读取图像image = cv2.imread(image_path)# 转为灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 降噪(高斯模糊)blur = cv2.GaussianBlur(gray, (5, 5), 0)# 自适应阈值二值化binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]# 去除小噪点:先腐蚀去除小噪点,再膨胀恢复主要物体的大小和形状# 创建2x2的结构元素(Kernel)kernel = np.ones((2, 2), np.uint8)# 对二值化图像执行开运算MORPH_OPEN# (开运算(Opening):先腐蚀后膨胀,用于去除小噪点并保持物体形状。闭运算(Closing):先膨胀后腐蚀,用于填充物体内部的小孔)# iterations:迭代次数cleaned = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=1)return cleaned# 预处理图像
processed_image = preprocess_image('./Data/captcha2.png')
cv2.imshow('处理结果', processed_image)# 使用PyTesseract识别
config = r'--oem 3 --psm 8 -c tessedit_char_whitelist=0123456789abcdefghijklmnopqrstuvwxyz'
text = pytesseract.image_to_string(processed_image, config=config)
print(text)cv2.waitKey(0) # 确保图像窗口保持打开状态,直到用户手动关闭。
cv2.destroyAllWindows()# 关闭所有 OpenCV 窗口,释放系统资源,通常在程序结束前调用。
三、总结
- 预处理不是必需的,但能提升识别准确率,尤其是对低质量图像。
- 常用操作:灰度转换、二值化、降噪、缩放、锐化。
- 工具选择:PIL 适合基础操作,OpenCV 适合复杂处理(如滤波、形态学操作)