纪念馆档案数字化培训:手把手教你搭建本地OCR识别系统

一、环境搭建与基础配置

在开始纪念馆档案数字化之前,必须先构建一个稳定、高效的本地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. 验证预处理效果

纪念馆档案数字化培训:手把手教你搭建本地OCR识别系统

为了确保预处理逻辑没有破坏图像内容,我们可以添加一段可视化代码。在 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("未找到包含该关键词的档案。") ```

实操落地步骤总结

  1. 目录准备:在电脑上新建一个文件夹,将上述代码分别保存为 preprocessing.py, ocr_engine.py, db_manager.py, batch_process.py, search_tool.py
  2. 数据准备:在同级目录下新建 archive_images 文件夹,放入待识别的档案扫描件(JPG或PNG格式)。
  3. 路径修正:打开 ocr_engine.py,确认第5行的 tesseract_cmd 路径与你实际安装路径一致。如果是Mac用户,通常为 /usr/local/bin/tesseract
  4. 执行处理:在CMD中进入该目录,运行 python batch_process.py。观察控制台输出,等待所有图片处理完毕。
  5. 检索验证:运行 python search_tool.py,输入档案中出现的任意文字(如“纪念馆”、“1980年”等),验证是否能准确检索出对应文件名。
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统