简介:本文从OCR检测机制出发,系统讲解“大字藏小字”与“小字藏大字”两种图片隐写思路,通过字号、行距、字距的灵活调节,让自动识别模型产生误判而人类仍可正常阅读。文章给出可复现的参数组合与实现要点,并分析该方法的适用边界与局限性,帮助开发者在文档防自动采集场景中做出合理技术选型。
在文档分享、内容发布、资料流转等场景中,图片往往承载着核心文字信息。然而,随着OCR(光学字符识别)技术的成熟,任何一张包含清晰文字的图片,都可以在几秒内被自动提取为可编辑文本。对于需要控制内容传播范围的场景——例如内部资料预览、付费内容试读、版权素材展示——这种自动化采集能力带来了实实在在的困扰。
一个自然的思路是:能否在保留人类可读性的前提下,让OCR模型“看不见”或“看错”图中的文字?
本文讨论的正是这一类技术:通过排版层面的隐写手法,使OCR的检测与识别流程产生误判,而人眼阅读几乎不受影响。需要提前说明的是,该方法属于“对抗性排版”范畴,其有效性依赖于当前OCR模型的通用处理流程,并非绝对安全手段。
要理解这种方法,先要理解OCR的基本工作流程。典型OCR系统包含两个关键阶段:
许多OCR系统为了提升效率,会在检测阶段加入“去重”或“已处理区域跳过”的逻辑:如果某个区域已经被判定为文字并完成识别,后续扫描时可能不再重复处理。换言之,让OCR识别出一些文字,反而可能使它忽略同一区域内的其他文字。
基于这一观察,可以构造两种互补的隐写方式:
两种方式没有绝对优劣,需要根据目标OCR的检测偏好进行试错选择。核心调节参数只有三个:字号、行间距、字间距。
“大字藏小字”的思路是:用超大字号字符占据画面主要区域,在其笔画间隙或行间填充小字号文本。人眼在正常观看距离下,会优先注意到大字,但仔细看仍能辨认小字;OCR则容易把大字区域当作一个整体文本块处理,小字因尺寸过小或与大字重叠而被忽略。
根据实践经验,以下参数组合具有较好的对抗效果:
| 大字字号 | 小字字号 | 行间距 | 字间距 |
|---|---|---|---|
| 300px | 12px | 1px | 1px |
| 400px | 12px | 1px | 1px |
| 200px | 12px | 1px | 1px |
| 400px | 30px | 0px | 0px |
参数说明:
早期实现采用“全局从上到下、从左到右”的顺序填充小字,这会导致小字在跨越大字区域时出现断裂,人眼识别困难。更优的做法是按大字逐字填充:以每个大字字符为单位,在其周围或内部按顺序放置小字。这样小字的阅读路径更连续,人眼体验明显改善。
如果构造的是“大字中藏小字”的图片,那么当OCR输出中检测到小字内容时,说明对抗失败;当OCR只输出大字内容、小字未被识别时,说明对抗成功。实际测试中,可以用一段已知文本作为小字内容,检查OCR结果是否包含该文本。
某些OCR系统对小字号文本的检测非常敏感,能够准确识别密集的小字区域。此时“大字藏小字”可能失效,因为小字反而被优先识别。这时应改用“小字藏大字”:让画面主体由小字构成,大字被拆解或弱化,使OCR在识别小字后“认为”该区域已处理完毕,从而忽略大字结构。
对于“小字藏大字”的图片,如果OCR输出中检测到大字内容,则对抗失败;如果只输出小字内容,则对抗成功。同样可以用已知文本进行验证。
以下为构造“大字藏小字”图片的简化流程,不依赖特定图像库名称,仅表达逻辑:
# 伪代码:大字藏小字def create_steganographic_image(big_text, small_text, params):canvas = create_blank_canvas(width, height)# 第一步:绘制大字for char in big_text:draw_char(canvas, char,font_size=params.big_size,position=next_position())# 第二步:按大字逐字填充小字small_index = 0for char in big_text:region = get_char_region(char)while small_index < len(small_text):draw_char(canvas, small_text[small_index],font_size=params.small_size,position=region.next_slot(),line_spacing=params.line_spacing,char_spacing=params.char_spacing)small_index += 1if region.is_full():breakreturn canvas
关键控制点:
该方法有效的核心前提是:目标OCR系统的检测与识别流程相对固定,且没有针对此类隐写术进行专门训练。如果OCR模型在训练数据中包含了大量类似样本,或者采用了多尺度、多轮检测策略,对抗效果会大幅下降。
这种方法的设计目标从一开始就是防止自动OCR识别,而不防止人类阅读。事实上,任何能够看到图片的人类,都可以直接读取其中的文字,无需OCR。因此,它适用于“需要让人看到、但不希望被机器批量提取”的场景,而不能用于真正的保密。
有人可能会想到:先对图片加高斯模糊,再让OCR识别。但模糊处理需要人类判断“哪里有大字”才能有针对性地操作,模型自身不会主动做这种判断。如果模型不加区分地对整图模糊,正常文章的截图也会被破坏,导致什么都识别不出来。而一旦有人类参与判断,直接阅读即可,OCR就失去了意义。
不同OCR系统的检测阈值不同,同一组参数在A系统上成功,在B系统上可能失败。因此实际应用中需要准备多组参数,通过自动化测试找到对目标系统有效的组合。这也意味着该方法不是“一次配置永久有效”,而需要持续维护。
如果要在实际项目中应用这类技术,建议考虑以下几点:
本文围绕“如何避免图片中的文字被OCR识别”这一技术问题,介绍了基于排版隐写的两种思路:大字藏小字与小字藏大字。其核心机制是利用OCR检测流程中的“已处理区域跳过”逻辑,通过字号、行距、字距的精细调节,使自动识别产生漏检或误判,而人类阅读不受影响。
该方法不是万能钥匙,它的有效性建立在目标OCR流程固定、且未针对此类样本训练的前提之上。在实际使用中,需要结合具体场景进行参数试错和效果验证。对于开发者而言,理解其原理和边界,比记住某组具体参数更有价值。