环境准备与工具安装
在进行档案数字化处理之前,必须搭建一个稳定且高效的Python环境。本文基于Windows 10/11系统操作,使用Python 3.9版本进行演示。所有操作均经过验证,可直接复制命令执行。
安装核心依赖库
打开命令行工具(CMD或PowerShell),依次执行以下命令安装所需的Python库。这些库分别用于图像处理、OCR识别以及数据导出。
pip install opencv-python pillow pytesseract pandas openpyxl
参数说明:
- opencv-python:用于读取图像、灰度化、二值化等预处理操作,提升识别率。
- pillow:图像格式转换与基础处理库。
- pytesseract:Google Tesseract-OCR的Python封装包,是识别的核心。
- pandas与openpyxl:用于将识别后的文本结构化存储为Excel文件。
安装Tesseract-OCR引擎
Python库只是接口,真正的识别逻辑依赖于Tesseract引擎。必须下载并安装Windows版本的二进制文件。
下载地址:https://github.com/UB-Mannheim/tesseract/wiki
进入页面后,下载tesseract-ocr-w64-setup-5.3.3.20231005.exe(或最新稳定版)。安装时,路径中不能包含中文或空格,建议保持默认路径:C:\Program Files\Tesseract-OCR。
安装过程中,在"Choose Components"界面,务必勾选Additional language data(download),并在展开列表中找到Chinese (Simplified)(简体中文)和English进行勾选。这一步至关重要,否则无法识别中文内容。
图像预处理核心算法
直接对扫描件进行识别,准确率通常很低。为了降低劳动强度,必须减少人工纠错的工作量,这就需要对图像进行预处理。我们将编写一个函数,完成灰度化、去噪和二值化操作。
预处理代码实现

在项目目录下创建ocr_tool.py文件,写入以下代码。这段代码会将彩色扫描图转换为高对比度的黑白图像,显著提高OCR的精准度。
```python
import cv2
import numpy as np
def preprocess_image(image_path):
读取图像
image = cv2.imread(image_path)
if image is None:
print(f"错误:无法读取图像 {image_path}")
return None
1. 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
2. 去噪处理
使用双边滤波保留边缘的同时去除噪声
denoised = cv2.bilateralFilter(gray, 9, 75, 75)
3. 自适应阈值二值化
这一步比简单的固定阈值更有效,能处理光照不均的扫描件
binary = cv2.adaptiveThreshold(
denoised, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
4. 形态学操作(可选,用于去除细小噪点)
kernel = np.ones((1, 1), np.uint8)
processed = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
return processed
```
OCR识别核心逻辑配置
配置Tesseract路径和识别参数是落地的关键。如果路径配置错误,程序会报错找不到tesseract.exe。我们需要在代码中显式指定路径。
初始化配置
继续在ocr_tool.py中添加以下初始化代码。请根据实际安装路径修改tesseract_cmd。
```python
import pytesseract
import os
指定tesseract.exe的绝对路径
如果安装时修改了路径,请务必在此处同步修改
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
配置识别参数
--psm 6: 假设图像为统一的文本块
--oem 3: 使用默认的LSTM OCR引擎
custom_config = r'--psm 6 --oem 3'
```
批量处理与数据导出
单张识别意义不大,我们需要实现遍历文件夹、批量识别并自动汇总到Excel的功能。这是真正替代人工复制粘贴的核心步骤。
完整批处理脚本编写
将以下逻辑整合到脚本中。该脚本会读取scans文件夹下的所有jpg/png图片,识别后保存为result.xlsx。
```python
def batch_process_images(input_folder, output_excel):
results = []
supported_ext = ('.jpg', '.jpeg', '.png', '.bmp', '.tiff')
检查输入文件夹是否存在
if not os.path.exists(input_folder):
os.makedirs(input_folder)
print(f"已创建输入文件夹:{input_folder},请放入图片后重新运行。")
return
files = [f for f in os.listdir(input_folder) if f.lower().endswith(supported_ext)]
if not files:
print("输入文件夹中没有找到支持的图片文件。")
return
print(f"开始处理,共发现 {len(files)} 个文件...")
for filename in files:
file_path = os.path.join(input_folder, filename)
1. 预处理
processed_img = preprocess_image(file_path)
if processed_img is None:
continue
2. 识别文本 (中英文混合)
lang='chi_sim+eng' 表示同时识别简体中文和英文
try:
text = pytesseract.image_to_string(processed_img, lang='chi_sim+eng', config=custom_config)
except Exception as e:
print(f"识别 {filename} 时出错: {e}")
text = "识别失败"
去除首尾多余的空白字符
clean_text = text.strip()
3. 收集结果
results.append({
'文件名': filename,
'识别内容': clean_text
})
print(f"已完成: {filename}")
4. 导出Excel
if results:
df = pd.DataFrame(results)
df.to_excel(output_excel, index=False, engine='openpyxl')
print(f"处理完成!结果已保存至:{output_excel}")
else:
print("没有生成有效数据。")
if __name__ == "__main__":
定义输入文件夹和输出文件名
input_dir = "scans"
output_file = "digitization_result.xlsx"
batch_process_images(input_dir, output_file)
```
实操落地与避坑指南
代码编写完成后,按照以下步骤即可直接运行。
目录结构准备
在代码文件同级目录下,创建一个名为scans的文件夹。将需要数字化的档案图片全部放入该文件夹。确保图片清晰度在300 DPI以上,模糊图片会导致识别率大幅下降。
运行脚本
在命令行中进入项目目录,执行:
python ocr_tool.py
常见问题处理
如果在运行过程中遇到TesseractNotFoundError,请检查代码中tesseract_cmd的路径是否正确,路径中是否包含中文。如果识别出的内容乱码,通常是字符集问题,请确保安装时下载了chi_sim语言包,并在代码中正确指定了lang='chi_sim+eng'。如果识别率依然不理想,可以调整preprocess_image函数中的cv2.adaptiveThreshold参数,或者尝试先对图片进行锐化处理。