阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。
把图片 DPI 从 72 改成 300,文件属性看起来专业了,文字边缘却没有变清楚。DPI 是物理尺寸换算信息,像素才是图像实际携带的采样点。两者有关联,但改元数据不会凭空增加字形细节。
先问像素,再问输出尺寸
同样宽度的图,可以通过不同 DPI 标记对应不同打印宽度。OCR 的输入限制通常还涉及总像素、长边和文件体积,不能只检查文件属性里的一个 DPI 值。压缩后的字节大小也不能直接代表解码内存需求。
对比两个只有 DPI 不同的样本
from io import BytesIO
from PIL import Image
image = Image.new("RGB", (600, 300), "white")
def encode(dpi):
stream = BytesIO()
image.save(stream, format="PNG", dpi=(dpi, dpi))
stream.seek(0)
decoded = Image.open(stream)
decoded.load()
return decoded
low, high = encode(72), encode(300)
assert low.size == high.size == (600, 300)
assert low.tobytes() == high.tobytes()
assert low.info["dpi"][0] < high.info["dpi"][0]
assert image.width * image.height == 180000
assert 600 / 300 == 2.0
最后一行表示在 300 DPI 假设下,六百像素对应两英寸。PNG 的 DPI 保存可能涉及单位转换与舍入,不应断言读取值与写入值逐位完全相等。这里比较大小关系,并直接检查像素没有变化。
对输入预算使用正确指标
指标
能说明什么
不能说明什么
总像素
基础解码规模
字符是否足够清晰
DPI 元数据
物理尺寸换算
实际新增细节
文件字节数
上传和存储负担
解码后的完整内存量
字符局部高度
字形采样情况
所有页面都同样可读
放大与重新扫描是不同动作
如果原图已经把细小笔画压成同一个像素,插值放大无法恢复原始信息。能重新扫描时,应从采集质量入手;无法重扫时,再比较不同预处理方案。任何“识别提升”都需要在相同标注样本上测量。
评估文档翻译先统一输入
使用
OmniDoc(产品入口)
处理扫描件时,记录像素尺寸和来源质量,有助于比较不同文件的结果。不要仅凭两个文件都标着 300 DPI 就认为条件相同。清晰的输入说明,也能帮助团队决定哪些页需要人工补审。
参考:
Pillow Image
。
- 1 -
更新于 2026-10-08