当前位置: 首页 > news >正文

图像识别预处理(配合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 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 适合复杂处理(如滤波、形态学操作)

相关文章:

  • 一个典型的Qt界面拆分(解耦)方案
  • figma MCP + cursor如何将设计稿生成前端页面
  • 链游技术破壁:NFT资产确权与Play-to-Earn经济模型实战
  • 【数据结构】B树
  • TP6 实现一个字段对数组中的多个值进行LIKE模糊查询(OR逻辑)
  • 【nano与Vim】常用命令
  • K8S认证|CKS题库+答案| 3. 默认网络策略
  • 无需域名,直接加密IP的SSL方案
  • 【Survival Analysis】【机器学习】【3】 SHAP可解釋 AI
  • DDD架构实战 领域层 事件驱动
  • MCP Server 之旅第 5 站:服务鉴权体系解密
  • vanna+deepseek+chainlit 实现自然语言转SQL的精度调优
  • 构建 MCP 服务器:第 4 部分 — 创建工具
  • 【零基础 快速学Java】韩顺平 零基础30天学会Java[学习笔记]
  • 打造你的 Android 图像编辑器:深入解析 PhotoEditor 开源库
  • 用设计模式重新思考(类FSM)验证:从混乱到优雅
  • ES6——数组扩展之Set数组
  • [TIP] Ubuntu 22.04 配置多个版本的 GCC 环境
  • 第7篇:中间件全链路监控与 SQL 性能分析实践
  • 如何理解 IP 数据报中的 TTL?
  • 日本 男女做受网站/长沙建站seo公司
  • 个人定制网站怎么做/汕头网站建设方案优化
  • 项目的网站是用JSP做的吗/优化营商环境心得体会个人
  • 济南城市建设学院网站/网络推广业务
  • 天津网站建站公司/seo优化服务
  • 企业网站服务费怎么做记账凭证/今日头条新闻