一、环境搭建与基础配置
在开始纪念馆档案数字化之前,必须先构建一个稳定、高效的本地OCR识别环境。本指南采用Python作为开发语言,结合Tesseract-OCR引擎,实现完全离线的档案文字识别能力。
1. 安装Python运行环境
请前往Python官网下载Windows x64可执行安装包。直接访问 https://www.python.org/downloads/ 下载最新版(建议3.9及以上版本)。安装时,务必勾选底部的 "Add Python to PATH" 选项,这能避免后续手动配置环境变量的麻烦。安装完成后,打开CMD命令行窗口,输入 python --version,若显示版本号则说明安装成功。
2. 安装Tesseract-OCR引擎
Tesseract是OCR的核心引擎。对于Windows用户,请勿下载源码自行编译,直接下载编译好的安装包。访问 https://github.com/UB-Mannheim/tesseract/wiki,点击 "tesseract-ocr-w64-setup-5.x.x.exe" 进行下载。安装过程中,在"Choose Components"界面,务必展开"Additional language data",勾选 Chinese (Simplified) 和 English,否则无法识别中文内容。安装路径建议保持默认,即 C:\Program Files\Tesseract-OCR。
3. 安装Python依赖库
在CMD中执行以下命令,安装图像处理库及OCR接口库。不要使用清华源或阿里源镜像,直接使用官方源以确保版本兼容性:
```bash
pip install pytesseract pillow opencv-python
```
安装完毕后,我们需要编写一个简单的测试脚本来验证环境。新建文件 test_env.py,输入以下代码:
```python
import pytesseract
import cv2
指定Tesseract路径,Windows用户必须配置,Mac/Linux用户若配置了环境变量可省略
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
尝试获取版本号
try:
print(pytesseract.get_tesseract_version())
print("环境配置成功!")
except Exception as e:
print(f"环境配置失败: {e}")
```
二、档案图像预处理模块开发
纪念馆的纸质档案往往存在发黄、字迹模糊或盖章干扰等问题。直接进行OCR识别准确率极低,必须进行图像预处理。我们将编写一个脚本,实现灰度化、二值化和降噪处理。
1. 编写预处理核心代码
创建文件 preprocessing.py。该模块将接收一张图片路径,返回处理后的OpenCV图像对象。请直接复制以下完整代码:
```python
import cv2
import numpy as np
def preprocess_image(image_path):
"""
对档案图像进行预处理:灰度 -> 去噪 -> 二值化
"""
1. 读取图像
img = cv2.imread(image_path)
if img is None:
raise FileNotFoundError(f"无法读取图片: {image_path}")
2. 转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
3. 去噪处理(双边滤波在保持边缘清晰度的同时去除噪点)
d=9, sigmaColor=75, sigmaSpace=75 是针对文档扫描优化的参数
denoised = cv2.bilateralFilter(gray, 9, 75, 75)
4. 自适应阈值二值化
这一步比简单的固定阈值更能应对光照不均的旧档案
blockSize=11, C=2 是常用的文档处理参数
binary = cv2.adaptiveThreshold(
denoised, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
5. 反色处理(Tesseract默认识别白底黑字,如果是黑底白字需要反转)
这里我们假设扫描件是白底黑字,如果识别结果为空,可尝试 bitwise_not
binary = cv2.bitwise_not(binary)
return binary
```
2. 验证预处理效果

为了确保预处理逻辑没有破坏图像内容,我们可以添加一段可视化代码。在 preprocessing.py 底部添加:
```python
if __name__ == "__main__":
import os
请确保当前目录下有一张名为 test.jpg 的测试图片
if os.path.exists("test.jpg"):
result_img = preprocess_image("test.jpg")
cv2.imwrite("processed_test.jpg", result_img)
print("预处理完成,已生成 processed_test.jpg,请对比查看。")
else:
print("请先在目录下放置一张名为 test.jpg 的图片进行测试。")
```
三、OCR识别与文本提取实战
环境准备就绪且图像预处理逻辑验证通过后,我们进行核心的文字提取工作。针对档案中常见的宋体、楷体混排情况,我们需要指定正确的识别参数。
1. 配置识别参数
创建文件 ocr_engine.py。Tesseract的识别效果高度依赖 --oem(OCR引擎模式)和 --psm(页面分段模式)。对于标准档案文档,psm 6(假设为统一的文本块)效果最佳。
```python
import pytesseract
from preprocessing import preprocess_image
硬编码Tesseract路径,防止环境变量缺失导致报错
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
配置识别参数
--oem 3: 使用默认的LSTM神经网络引擎
--psm 6: 假设图像为统一的文本块
custom_config = r'--oem 3 --psm 6'
def extract_text_from_image(image_path, lang='chi_sim+eng'):
"""
从图像中提取文字
:param image_path: 图片路径
:param lang: 语言包,chi_sim(简体中文) + eng(英文)
:return: 识别出的文本字符串
"""
try:
1. 获取预处理后的图像
processed_img = preprocess_image(image_path)
2. 执行识别
image_to_string 会直接返回文本
text = pytesseract.image_to_string(
processed_img,
lang=lang,
config=custom_config
)
return text.strip()
except Exception as e:
print(f"识别 {image_path} 时出错: {e}")
return ""
if __name__ == "__main__":
测试单张图片识别
result = extract_text_from_image("test.jpg")
print("识别结果如下:")
print("-" 30)
print(result)
print("-" 30)
```
四、批量档案处理与归档系统
实际工作中,我们需要处理成百上千张扫描件。手动单张处理效率极低。下面我们将构建一个简单的批量处理脚本,并利用Python内置的 sqlite3 数据库建立本地检索索引,实现“图片转文字”并“入库”的全流程。
1. 建立本地档案数据库
创建文件 db_manager.py。我们将创建一个名为 archives.db 的数据库文件,包含 文件名、识别内容、处理时间 三个字段。
```python
import sqlite3
import datetime
def init_db():
"""初始化数据库,创建表"""
conn = sqlite3.connect('archives.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS archives (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL,
content TEXT,
process_time TEXT
)
''')
conn.commit()
conn.close()
def save_record(filename, content):
"""保存单条识别记录"""
conn = sqlite3.connect('archives.db')
cursor = conn.cursor()
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute('''
INSERT INTO archives (filename, content, process_time)
VALUES (?, ?, ?)
''', (filename, content, current_time))
conn.commit()
conn.close()
初始化数据库
init_db()
```
2. 编写批量处理主程序
创建文件 batch_process.py。该脚本将扫描指定文件夹下的所有 .jpg 和 .png 文件,调用OCR引擎,并将结果自动存入数据库。
```python
import os
import glob
from ocr_engine import extract_text_from_image
from db_manager import save_record
def batch_folder_process(folder_path):
"""
批量处理文件夹下的所有图片
"""
支持 jpg, png, jpeg 格式
search_pattern = os.path.join(folder_path, ".jpg")
image_files = glob.glob(search_pattern)
image_files.extend(glob.glob(os.path.join(folder_path, ".png")))
image_files.extend(glob.glob(os.path.join(folder_path, ".jpeg")))
print(f"在目录 {folder_path} 中发现 {len(image_files)} 个图片文件。")
for idx, image_file in enumerate(image_files):
filename = os.path.basename(image_file)
print(f"[{idx+1}/{len(image_files)}] 正在处理: {filename} ...")
提取文字
text_content = extract_text_from_image(image_file)
if text_content:
存入数据库
save_record(filename, text_content)
print(f" -> 成功识别并存入数据库,字数: {len(text_content)}")
else:
print(f" -> 识别失败或内容为空")
if __name__ == "__main__":
请将此处修改为你的档案图片存放的实际文件夹路径
target_folder = r"./archive_images"
if os.path.exists(target_folder):
batch_folder_process(target_folder)
print("所有任务处理完毕!")
else:
print(f"错误:目录 {target_folder} 不存在,请创建目录并放入图片。")
```
五、简易检索查询工具
数据入库后,我们需要一个工具来快速查询档案内容。我们继续使用 sqlite3 提供一个命令行查询工具。
创建文件 search_tool.py:
```python
import sqlite3
def search_archives(keyword):
"""在数据库中搜索关键词"""
conn = sqlite3.connect('archives.db')
cursor = conn.cursor()
使用LIKE进行模糊查询
query = "SELECT filename, content, process_time FROM archives WHERE content LIKE ?"
cursor.execute(query, (f'%{keyword}%',))
results = cursor.fetchall()
conn.close()
return results
if __name__ == "__main__":
print("=== 档案检索系统 ===")
key = input("请输入检索关键词: ")
if key:
data = search_archives(key)
if data:
print(f"\n找到 {len(data)} 条相关记录:\n")
for row in data:
print(f"文件: {row[0]}")
print(f"时间: {row[2]}")
仅显示关键词前后的部分内容作为预览
content_preview = row[1].replace('\n', ' ')[:100] + "..."
print(f"摘要: {content_preview}")
print("-" 40)
else:
print("未找到包含该关键词的档案。")
```
实操落地步骤总结
- 目录准备:在电脑上新建一个文件夹,将上述代码分别保存为
preprocessing.py, ocr_engine.py, db_manager.py, batch_process.py, search_tool.py。
- 数据准备:在同级目录下新建
archive_images 文件夹,放入待识别的档案扫描件(JPG或PNG格式)。
- 路径修正:打开
ocr_engine.py,确认第5行的 tesseract_cmd 路径与你实际安装路径一致。如果是Mac用户,通常为 /usr/local/bin/tesseract。
- 执行处理:在CMD中进入该目录,运行
python batch_process.py。观察控制台输出,等待所有图片处理完毕。
- 检索验证:运行
python search_tool.py,输入档案中出现的任意文字(如“纪念馆”、“1980年”等),验证是否能准确检索出对应文件名。