OCR 与图像

OCR 做过缩放和裁剪,识别框怎样映射回原文

OCR 返回的框在局部图上很准,画回 PDF 却整体偏了一块。先不要怀疑识别引擎,检查预处理顺序:是否先裁剪、再缩放、又补了一圈白边?每一步都改变坐标,逆映射必须按相反顺序撤销。

阅读文本 / 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