图像识别预处理(配合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

示例图1

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 pytesseract

image = 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 pytesseract


image = 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 np

def 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 适合复杂处理(如滤波、形态学操作)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值