/scan-ocr-skill — 扫描件/图片 OCR 识别
将扫描版 PDF 或图片文件识别为可用的正文文字,处理双栏/表格/手写体等复杂版面。
触发条件
- 用户提供了扫描版 PDF(文字无法直接复制)
- 用户提供了图片文件(JPG/PNG/TIFF)
- 用户提供的 PDF 经 pdf-extract-skill 验证为纯图片扫描件
使用方式
/scan-ocr-skill <文件路径>
工作流程
阶段 1:图像预处理
| 步骤 | 工具 | 作用 |
|---|---|---|
| 格式统一 | PyMuPDF / PIL | 将 PDF 每页转为 PNG 图片 |
| 去噪 | OpenCV adaptiveThreshold |
清除噪点,提升识别率 |
| 倾斜校正 | OpenCV 轮廓检测 | 修正扫描歪斜的页面 |
| 锐化 | PIL / OpenCV | 增强文字边缘,提高识别精度 |
| 灰度化 | OpenCV cvtColor |
转为灰度图(省算力) |
推荐参数:
import cv2
img = cv2.imread('page.png', cv2.IMREAD_GRAYSCALE)
# 去噪+二值化
processed = cv2.adaptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 21, 10)
阶段 2:OCR 识别
优先:本地 OCR(Tesseract)
# 安装
pip install pytesseract pymupdf opencv-python pillow
# Windows 额外安装 Tesseract-OCR
# 下载地址:https://github.com/UB-Mannheim/tesseract/wiki
import pytesseract
import cv2
img = cv2.imread('processed.png', cv2.IMREAD_GRAYSCALE)
text = pytesseract.image_to_string(img, lang='chi_sim+eng',
config='--psm 4 --oem 3')
备选:云端 OCR(API)
当本地 Tesseract 识别率低于 70% 时,提示用户可使用:
- 腾讯云 OCR(高精度印刷体)
- 百度 OCR(通用文字识别)
- Google Cloud Vision(多语言支持)
> ⚠️ 云端 API 会将文件内容上传到第三方服务器,使用前必须获得用户明确授权。
阶段 3:版面分析(高级)
| 版面类型 | 检测方法 | 处理策略 |
|---|---|---|
| 单栏 | 行高均匀 | 直接按行识别 |
| 双栏 | 检测纵向空白分割线 | 先切栏再逐栏识别 |
| 表格 | 检测网格线 | 使用 pytesseract.image_to_data 保留表格结构 |
| 带图注 | 图片与文字交替 | 图片转存为独立文件,文字段落合并 |
双栏切分参考逻辑:
# 找到中间分割线(纵向投影空白区)
def split_two_columns(img):
proj = img.sum(axis=0) # 垂直投影
mid = len(proj) // 2
# 找中间区域最低谷
left_min = min(proj[:mid//2])
right_min = min(proj[mid//2:mid])
split_point = mid # 简化实现
return img[:, :split_point], img[:, split_point:]
阶段 4:后处理与清洗
- 换行合并:段落中间因扫描产生的软换行(行尾无句号且下一行首字母小写)→ 合并为一行
- 脚注分离:识别页脚区域(页面底部 5% 高度)并从正文中剔除
- 乱码过滤:删除无法识别的 Unicode 替代字符(
\ufffd) - 标点还原:英文/数字后缺少标点 → 补全句号(可选)
输出格式
与 pdf-extract-skill 完全对齐,结构如下:
# 《书名》正文提取(OCR)
- 原始文件:<file_path>
- 识别时间:<YYYY-MM-DD HH:MM>
- 总页数:<N> 页
- 识别页数:<M> 页
- 文件类型:扫描件 PDF / 图片
- OCR 引擎:Tesseract v5 / 云端 API
- 识别方式:单栏 / 双栏 / 表格
---
## 第一章 <标题>
<正文内容>
...
适用条件
- ✅ 扫描版 PDF(纸质书扫描)
- ✅ 拍照版 PDF(手机拍摄)
- ✅ JPG/PNG 图片
- ✅ 双栏/表格混合版面
- ❌ 纯文字型 PDF(请使用 pdf-extract-skill,效率更高)
- ❌ 手写笔记图片(识别率低,需人工转录)
常见失败与处理
| 症状 | 原因 | 处理方式 |
|---|---|---|
| 识别率低于 50% | 图片过暗/过曝 | 预处理加 CLAHE 直方图均衡化 |
| 双栏识别错乱 | 未正确切分栏目 | 手动指定分割线坐标 |
| 表格识别成乱码 | 表格线干扰 | 用表格专用 PSM 模式(--psm 6) |
| 繁体字识别差 | 缺繁体语言包 | 安装 chi_tra+eng 语言包 |
依赖
pip install pytesseract pymupdf opencv-python pillow
> ⚠️ Windows 用户需额外安装 Tesseract-OCR 引擎:
> https://github.com/UB-Mannheim/tesseract/wiki
五要素笔记模板
识别完成后,生成 Layer 1 文献笔记草稿:
来源:《书名》P.<页码>(OCR识别)
原文精华:<核心段落,50-200字>
识别疑问:<识别可能有误的地方>
关联概念:<与哪些已知概念有关>
行动指引:<读完后要做什么>