拍摄纸张时形成梯形,会让 OCR 的字行和字号不一致。四点透视变换可以把选定纸张角点映射到矩形,适合先整理清晰、平整的文档照片。它不会恢复被遮住的字,也不能修好模糊或折皱。
先确定四个角与输出比例
准备 document.jpg,用图片编辑器读取纸张四角的原图像素坐标,按左上、右上、右下、左下顺序记录。本例四点是自制几何图的坐标,实际照片必须替换。不要把四点按 x 大小简单排序,倾斜照片可能因此交叉。

python -m pip install opencv-python-headless numpy
示例输出 360×240,只适合相应宽高比例的横向文档;真实 A4 或其他页面应按实际宽高比例设尺寸。输出比例错误会让字形被拉伸,影响识别。
计算变换并检查角点映射
保存为 rectify_document.py,替换 source 和输出尺寸,运行 python rectify_document.py。本地已用自制梯形图验证四角映射和输出尺寸;未执行真实扫描件 OCR,未测量识别率变化。
import cv2
import numpy as np
image = cv2.imread("document.jpg")
if image is None:
raise ValueError("document.jpg cannot be read")
# Replace these example corners with corners in your original image.
# Order: top-left, top-right, bottom-right, bottom-left.
source = np.float32([[30, 40], [350, 20], [380, 250], [20, 280]])
w, h = 360, 240
target = np.float32([[0, 0], [w-1, 0], [w-1, h-1], [0, h-1]])
matrix = cv2.getPerspectiveTransform(source, target)
rectified = cv2.warpPerspective(image, matrix, (w, h))
mapped = cv2.perspectiveTransform(source[None, :, :], matrix)[0]
assert np.allclose(mapped, target, atol=1e-3)
assert cv2.imwrite("document_rectified.png", rectified)
print("output_width_height", (w, h), "corners_passed")
输出图怎样验收
打开 document_rectified.png,检查四边是否完整、文字行是否更水平、字形是否明显变宽或变窄。再把同一段原图和矫正图交给相同 OCR 配置,逐字核对结果,避免同时换引擎造成无法归因。
corners_passed 只证明这四个坐标按矩阵到达目标角点;选错角或把文本裁掉,断言依然可能通过。因此一定回看页面内容与边缘。
黑边与文字扭曲怎么处理
- 出现黑边:核对源坐标是否超出原图,是否把图片外的区域映射进来。
- 页面交叉或严重扭曲:检查角点顺序,四点必须围绕同一张纸。
- 字行仍弯曲:纸张曲面不满足单平面假设,应重拍或采用适合的去弯曲方案。
这个脚本不自动检测纸张轮廓。先手工点四角建立可核对的基线,再决定是否增加自动边缘检测。
资料与适用范围
本文依据 2026 年 10 月 1 日读取的项目资料编写。安装后请记录实际依赖版本;版本升级时先用小样本核对接口和输出。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30836.html