1. 实际应用场景与痛点
场景
- 学生上课记手写笔记,课后想转成电子稿复习
- 会议记录用手写白板拍照,需快速整理成 Word/PPT
- 研究人员访谈记录手写,需数字化归档
- 教师批改作业后,将手写评语转成电子文本
痛点
- 手动录入费时费力
- 普通 OCR 对潦草字迹识别率低
- 识别结果没有段落结构,难以直接使用
- 不同设备拍摄角度、光线影响识别效果
- 缺乏一键导出到办公文档的功能
2. 核心逻辑讲解
1. 图像预处理
- 灰度化、二值化、去噪、倾斜校正(OpenCV)
2. 手写 OCR
- 使用 PaddleOCR(对中文手写效果好)或 EasyOCR
3. 文本后处理
- 正则清洗、合并断行
- 基于规则/NLP 模型进行段落拆分(如空行、缩进、标点)
4. 导出办公文档
- 使用
"python-docx" 生成 Word
- 或使用
"python-pptx" 生成 PPT
5. 批量处理
- 支持单张或整个文件夹批量识别
3. 项目结构
handwriting_ocr/
├── ocr_processor.py # OCR 识别与段落拆分
├── preprocess.py # 图像预处理
├── doc_exporter.py # 导出 Word/PPT
├── config.py # 配置参数
├── requirements.txt # 依赖
├── README.md # 使用说明
└── sample_notes/ # 示例手写照片
4. 代码实现
"config.py"
# OCR 配置
OCR_LANG = 'ch' # PaddleOCR 语言
USE_GPU = False # 是否使用 GPU
# 导出配置
EXPORT_FORMAT = 'docx' # 'docx' 或 'pptx'
"preprocess.py"
import cv2
import numpy as np
def preprocess_image(image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 去噪
denoised = cv2.medianBlur(binary, 3)
# 倾斜校正(简单版)
coords = np.column_stack(np.where(denoised > 0))
angle = cv2.minAreaRect(coords)[-1]
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
(h, w) = img.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
return rotated
"ocr_processor.py"
from paddleocr import PaddleOCR
import re
from config import OCR_LANG, USE_GPU
ocr = PaddleOCR(use_angle_cls=True, lang=OCR_LANG, use_gpu=USE_GPU)
def recognize_text(image_path):
processed_img = preprocess_image(image_path)
result = ocr.ocr(processed_img, cls=True)
texts = []
for line in result:
for word_info in line:
texts.append(word_info[1][0])
full_text = ' '.join(texts)
# 简单段落拆分:按连续换行或长停顿
paragraphs = re.split(r'\n\s*\n', full_text)
paragraphs = [p.strip() for p in paragraphs if p.strip()]
return paragraphs
"doc_exporter.py"
from docx import Document
from pptx import Presentation
from config import EXPORT_FORMAT
def export_to_docx(paragraphs, output_path):
doc = Document()
for p in paragraphs:
doc.add_paragraph(p)
doc.save(output_path)
def export_to_ppt(paragraphs, output_path):
prs = Presentation()
blank_slide_layout = prs.slide_layouts[1]
for p in paragraphs:
slide = prs.slides.add_slide(blank_slide_layout)
title = slide.shapes.title
title.text = "笔记段落"
content = slide.placeholders[1]
content.text = p
prs.save(output_path)
def export_document(paragraphs, output_path):
if EXPORT_FORMAT == 'docx':
export_to_docx(paragraphs, output_path)
elif EXPORT_FORMAT == 'pptx':
export_to_ppt(paragraphs, output_path)
主程序
"main.py"
import os
from ocr_processor import recognize_text
from doc_exporter import export_document
def process_folder(input_folder, output_file):
all_paragraphs = []
for fname in os.listdir(input_folder):
if fname.lower().endswith(('.png', '.jpg', '.jpeg')):
path = os.path.join(input_folder, fname)
paras = recognize_text(path)
all_paragraphs.extend(paras)
export_document(all_paragraphs, output_file)
print(f"已导出到 {output_file}")
if __name__ == "__main__":
process_folder("sample_notes", "output.docx")
5.
"requirements.txt"
paddleocr>=2.6.0
opencv-python
python-docx
python-pptx
numpy
6. README.md
# 手写笔记 OCR 转电子文档工具
支持拍照识别手写笔记,自动分段,并导出 Word/PPT。
## 功能
- 图像预处理(去噪、二值化、倾斜校正)
- 手写 OCR(PaddleOCR)
- 段落自动拆分
- 一键导出 .docx 或 .pptx
## 安装
bash
pip install -r requirements.txt
## 使用
1. 将手写照片放入 `sample_notes/` 文件夹
2. 运行:
bash
python main.py
3. 在 `output.docx` 查看结果
## 配置
修改 `config.py` 选择导出格式、语言等。
7. 核心知识点卡片
知识点 说明
PaddleOCR 开源 OCR 引擎,支持中英文及手写
OpenCV 图像预处理,提高 OCR 准确率
段落拆分 基于空行、标点等规则或 NLP 模型
python-docx 生成 Word 文档
python-pptx 生成 PPT 演示文稿
批量处理 遍历文件夹自动化处理
8. 总结
本工具通过 AI OCR + 文本后处理 + 办公文档导出 实现了手写笔记的数字化全流程,解决了手动录入和格式混乱的痛点。
未来可扩展:
- 接入更强大的 NLP 模型进行语义分段
- 增加 PDF 导出
- 开发 Web/GUI 界面方便非技术用户
- 加入手写风格美化(如 LaTeX 公式识别)
如果你需要,还可以集成一个轻量级的 Web 界面(Flask),让用户直接上传照片并下载 Word 文件,这样会更贴近实际办公场景。
利用AI高效解决实际问题,如果你觉得这个工具好用,欢迎关注我!