OCR 与图像

裁得越紧越好?OCR 的边缘文字也需要留空间

表格单元格裁得很紧,文字旁边一点空白都没有,识别效果未必更好。更重要的是,裁剪与补边改变了坐标原点。如果不保存这些变化,后续把识别结果画回整页时,就会出现看似随机的偏移。

阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。 表格单元格裁得很紧,文字旁边一点空白都没有,识别效果未必更好。更重要的是,裁剪与补边改变了坐标原点。如果不保存这些变化,后续把识别结果画回整页时,就会出现看似随机的偏移。 空白边距是输入策略 Pillow 的 ImageOps.expand 可以在图像外添加边框。边框宽度应通过自己的样本验证,不能把某个固定像素值当成所有 OCR 引擎的要求。本文只是用小图展示补边与坐标平移,不测识别准确率。 明确一个像素从哪里移动到哪里 from PIL import Image, ImageOps crop = Image.new("L", (20, 10), 255) crop.putpixel((0, 0), 0) padding = 4 padded = ImageOps.expand(crop, border=padding, fill=255) assert padded.size == (28, 18) assert padded.getpixel((padding, padding)) == 0 assert padded.getpixel((0, 0)) == 255 crop_origin = (100, 50) def back_to_page(x, y): return x - padding + crop_origin[0], y - padding + crop_origin[1] assert back_to_page(4, 4) == (100, 50) assert back_to_page(14, 9) == (110, 55) assert crop.size == (20, 10) 样本假设只发生裁剪和等宽补边,没有缩放、旋转或透视变换。若管线包含更多步骤,需要保存完整变换链,而不是在最终坐标上凭感觉加减几个数字。 裁剪边界怎样验收 检查项 观察方法 失败处理 字符未被切断 对照原页放大查看 扩大裁剪区域 边框未盖住文字 对比像素与尺寸 修正补边实现 原点记录正确 用已知角点回映射 检查操作顺序 空白内出现识别框 查看是否为噪声 不直接认作正文 别把区域裁剪等同于内容理解 一个紧邻金额的货币符号可能位于裁剪区外。OCR 即使准确识别了数字,业务字段也仍然不完整。裁剪规则要考虑标签与单位,而不只是文字黑色像素的外接矩形。 翻译审查保留上下文 使用 OmniDoc(产品入口) 处理扫描材料时,若自己先做区域预处理,应保留整页与裁剪来源。审校不只需要知道某个词怎么翻,还需要知道它属于表头、脚注还是正文。适当边距和来源坐标都是减少歧义的实用信息。 参考: Pillow ImageOps.expand 。 - 1 -
更新于 2026-10-08