阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。
一张透明背景的文字 PNG,在网页里看着正常,送入某个处理流程后却变成黑底。透明像素的 RGB 值并不是最终显示颜色。直接删除 alpha 通道,相当于忽略合成过程,结果可能与用户看到的图完全不同。
先合成,再转成 RGB
如果业务规定 OCR 输入使用白底,就先创建不透明白色背景,将 RGBA 图合成上去,再转换 RGB。这里的白底是一项明确输入策略;对浅色文字、彩色纸张或其他视觉语义,仍需先确认是否适用。
用完全透明与不透明像素对照
from PIL import Image
source = Image.new("RGBA", (2, 1), (0, 0, 0, 0))
source.putpixel((1, 0), (0, 0, 0, 255))
wrong = source.convert("RGB")
background = Image.new("RGBA", source.size, (255, 255, 255, 255))
correct = Image.alpha_composite(background, source).convert("RGB")
assert wrong.getpixel((0, 0)) == (0, 0, 0)
assert correct.getpixel((0, 0)) == (255, 255, 255)
assert correct.getpixel((1, 0)) == (0, 0, 0)
assert correct.mode == "RGB"
assert source.mode == "RGBA"
这是两个像素的合成教学例子。它说明透明背景处理顺序,并不证明任何 OCR 引擎的识别结果。真实输入还可能是带透明索引的
P
模式图片,通常需要先统一到 RGBA,再走相同合成步骤。
不同模式需要显式处理
输入
推荐检查
常见错误
RGBA
alpha 通道与背景策略
直接丢掉透明通道
调色板 PNG
是否存在透明索引
只检查模式名有没有 A
普通 RGB
原始背景颜色
没有必要假造透明层
半透明笔画
合成后边缘与对比
强制阈值导致笔画断裂
保留原图有实际价值
白底版本应作为派生产物,不覆盖源文件。若后续发现浅灰签章变得难辨,需要回到原件比较,而不是用已经处理过的图再处理一次。处理清单应记录背景色、输入输出模式和尺寸。
让识别与翻译基于用户真正看到的页面
向
OmniDoc(产品入口)
提交图像或扫描文档之前,可以用这项检查消除显示与像素之间的落差。译后再核对正文、印章与数字区域。输入视觉状态一致,才更容易判断后续差异来自哪里。
参考:
Pillow Image 合成接口
。
- 1 -
更新于 2026-10-08