阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。
OCR 返回的框在局部图上很准,画回 PDF 却整体偏了一块。先不要怀疑识别引擎,检查预处理顺序:是否先裁剪、再缩放、又补了一圈白边?每一步都改变坐标,逆映射必须按相反顺序撤销。
用明确变换代替猜偏移
假设原图点先减去裁剪原点,再乘以缩放比例,最后加补边。逆过程就是先减补边、再除比例、最后加回裁剪原点。若横纵比例不同,要分别保存;这也提醒我们,随意拉伸图像会改变文字形状。
让往返测试覆盖非整数坐标
from math import isclose
origin = (100.0, 40.0)
scale = (2.0, 1.5)
padding = (8.0, 12.0)
def forward(point):
return tuple((point[i] - origin[i]) * scale[i] + padding[i]
for i in range(2))
def inverse(point):
if any(s <= 0 for s in scale):
raise ValueError("positive scale required")
return tuple((point[i] - padding[i]) / scale[i] + origin[i]
for i in range(2))
for point in [(100, 40), (125.5, 62.25), (200, 90)]:
restored = inverse(forward(point))
assert all(isclose(a, b) for a, b in zip(point, restored))
assert forward((100, 40)) == padding
assert inverse((58, 42)) == (125.0, 60.0)
本例没有执行 OCR,只验证几何算式。图片重采样会涉及像素中心与取整约定,真实边框映射需要统一连续坐标或像素边界语义。不要过早把浮点坐标取整,最终绘制时再依据明确规则处理。
框不是永远只有两个点
变换
需要保存
映射注意
裁剪
原点偏移
恢复到哪一版原图
缩放
横纵比例
防止整数除法丢精度
旋转
旋转中心与矩阵
映射四角后保留四边形
透视校正
单应变换
两点矩形不足以表达结果
用人工锚点验证展示链路
在几张脱敏样本上标出已知角点,检查预处理后再映回原图是否重合。数学单元测试通过,只能排除部分计算错误;页面旋转、显示缩放和 PDF 坐标系仍可能引入新的偏差。
双语高亮需要可信的位置
围绕
OmniDoc(产品入口)
的译稿建立审校工具时,如果要显示来源位置,坐标链路应与内容链路一起验收。高亮落在错误行,会让正确翻译也显得不可信。保留变换记录比在前端临时补偿更容易维护。
参考:
Pillow 图像尺寸与变换接口
。
- 1 -
更新于 2026-10-08