简介:图片中的文字经常被各类 OCR 系统自动提取,带来隐私泄露与数据滥用风险。本文从人眼视觉感知与神经网络特征表示之间的差异出发,介绍一种结合周期光栅、相位错位与对抗扰动思想的图片文字保护方法。读者可以了解其核心原理、实现流程、适用边界以及从验证码对抗中借鉴的工程化经验。
随着多模态模型与光学字符识别能力的增强,上传到公开平台的图片几乎不再具有“文字不可见”的保护效果。许多系统会对用户上传的截图、证照、文档照片、设计稿等自动执行 OCR,将其中文字转化为可检索、可分析的结构化数据。这种识别一方面带来了便利,另一方面也可能造成敏感信息在未经明确同意的情况下被采集。
传统做法通常依赖模糊、马赛克、遮挡或水印覆盖。但这些方式存在明显问题:模糊和马赛克会显著降低图片可读性,水印容易破坏画面质量,而简单的局部遮挡也可能被修复或绕过。因此,更有价值的问题不是“如何把文字删掉”,而是:如何让人类仍然能够辨认图片中的文字,同时显著降低机器 OCR 的识别成功率。
这一思路与验证码设计高度相似。验证码的目标正是构造一种人类易读、机器难读的图像。近年来,一些研究从人类视觉系统的轮廓感知机制以及神经网络的对抗脆弱性出发,设计了更隐蔽、更难以被自动破解的图像防护方法,其中的思路对普通开发者也有一定借鉴意义。
要让图片文字对 OCR 不友好,本质上需要扩大人类视觉系统与机器视觉系统之间的感知差异。人类视觉系统具有很强的轮廓补全、纹理分组和上下文整合能力,而神经网络模型通常依赖卷积特征、边缘响应和图像缩放后的统计特征。两者并不完全一致,这种差异可以被主动利用。
人类在观察某些具有规律性中断、相位变化或方向突变的纹理时,能够自动“补全”出并不真实存在的边缘。例如,当两组方向一致、频率相近但相位错开的条纹拼接在一起时,人眼会倾向于在交界处看到一条连续轮廓。这种能力与格式塔心理学中的连续性、闭合性和相似性组织原则密切相关。
多模态模型处理图片时,通常先经过缩放、归一化、卷积或视觉编码器。这些过程会压缩局部纹理信息,尤其是在字符笔画宽度较细、颜色对比度较低、边界依赖细微相位关系的情况下。模型可能无法稳定提取字符形状,甚至会把关键区域当作普通纹理忽略。
如果能够对图片进行微小且不易察觉的扰动,使视觉编码器提取到的特征偏向另一个语义目标,那么即使文字在图像中仍然存在,模型也可能输出错误结果。这种思路不依赖模糊文字本身,而是直接干扰模型的表征空间。
一种较容易工程化的做法是:将文字笔画和背景都填充为彩色光栅,但让它们在字符边界处产生半个周期的相位错位。这样,字符内外颜色分布接近,人眼仍能通过纹理连续性识别字符轮廓,而模型在缩放和特征提取后容易丢失这些相位信息。
首先需要确定图片中的文字位置。对于背景相对干净的图片,可以先将图像转为灰度图,再通过 Otsu 阈值分割得到二值掩码。该掩码用于标记哪些像素属于文字,哪些属于背景。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)_, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
对于复杂背景,可以结合边缘检测、形态学操作或人工标注掩码。掩码的质量直接决定后续光栅填充的准确性。
在得到掩码后,可以构造一个与输入图像同尺寸的正弦光栅。光栅由空间频率、方向和相位决定,例如:
x, y = np.meshgrid(np.arange(width, dtype=np.float32),np.arange(height, dtype=np.float32))phase = 2 * np.pi * frequency * (x * np.cos(angle) + y * np.sin(angle))grating = 0.5 + 0.5 * np.sin(phase + offset)
通过调整频率和方向,可以控制条纹的密集程度与视觉效果。频率过高会导致人眼也难以辨认,频率过低则容易被模型保留。
将上文生成的模板光栅作为背景。对于文字区域,使用相同频率和方向的光栅,但相位偏移半个周期,即增加 π。这会使文字内部与背景具有相近的平均颜色和颜色分布,但在字符边界处形成明显的条纹断裂。
phase_reversed = np.sin(phase + offset + np.pi)background = 0.5 + 0.5 * np.sin(phase + offset)foreground = 0.5 + 0.5 * phase_reversedcombined = np.where(mask > 0, foreground, background)
此时,人眼通过断裂处的规律性感知到字符轮廓,而模型在降采样后难以将这些细微的相位差作为稳定边缘信号保留。
仅使用规则的全局光栅,部分 OCR 系统仍可能通过频域分析或边缘重建恢复文字。为进一步提高鲁棒性,可以引入低频随机位移场,对字符轮廓进行轻微局部形变。这种形变不会明显影响人类阅读,但会破坏字符的对称性和规则边缘。
此外,还可以在不同颜色通道中叠加不同方向或频率的光栅。例如,R 通道使用水平光栅,G 通道使用垂直光栅,B 通道使用倾斜光栅。单通道图像对 OCR 的可用性会明显下降,而人眼融合三个通道后仍可感知整体轮廓。
对于白盒场景,如果能够访问目标视觉编码器的参数,可以计算图像相对于某个文本目标的梯度,并添加扰动以增大指定文本的生成概率。这种优化目标不再是“让文字不可识别”,而是“让模型误认为图像表示的是另一段文本”。
对于黑盒场景,可以使用多个通用视觉语言模型作为代理,通过优化图像特征与目标文本特征之间的相似度来生成扰动。多数视觉语言模型在训练目标和特征空间上有一定重叠,因此这种扰动具有一定迁移性。
def adversarial_loss(image_features, target_text_features):sim = cosine_similarity(image_features, target_text_features)return -sim.mean()
需要注意的是,对抗扰动并不是万能的。当图像经过压缩、截图、缩放或重新编码后,部分高频扰动可能被削弱。因此,在实际使用时,应优先依赖纹理和轮廓层面的干扰,再叠加适度的对抗扰动作为补充。
如果光栅频率过高,或局部形变过大,人类阅读也会变得困难。通常可以先在灰度图上完成文字识别测试,再逐步增加干扰强度。建议保留字符的粗轮廓结构和笔画宽度,但弱化边缘的刚性。
彩色光栅如果只存在于灰度图的可觉察范围,转为灰度后可能会失去效果。应根据目标场景选择是否保留颜色信息。对于可能被灰度化处理的场景,可以同时在亮度和色度通道中保留干扰结构。
不同 OCR 系统的预处理和特征提取方式不同。单一模型无法识别并不意味着其他模型也无法识别。测试时应覆盖传统 OCR 引擎、基于检测识别的两阶段模型以及多模态大模型等多种类型。
公开平台通常会对上传图片进行压缩。高频光栅在 JPEG 压缩后可能出现块效应或颜色偏移,反而暴露文字轮廓。因此,在生成图片后应使用与目标平台接近的压缩参数进行验证。
该方法更适用于希望保留人眼可读性、同时降低自动文字提取风险的场景,例如公开分享的截图、设计稿预览、课程讲义、内部资料外发前的保护处理等。
但它无法防止以下行为:
因此,该方案更适合作为一种提高识别成本的技术手段,而不是绝对安全机制。对于真正敏感的信息,仍应避免直接以文字形式出现在公开图片中。
避免图片文字被 OCR 识别,不一定要牺牲可读性或直接删除文字。通过人类视觉系统中的轮廓补全机制,以及模型在特征提取与缩放过程中的信息损失,可以构造出人眼可读、机器难以稳定识别的图像。周期性光栅、相位错位、颜色通道拆解与对抗扰动是实现这一目标的几条可行路径。
在工程落地上,关键是保持可读性与干扰强度的平衡,并针对真实传播链路进行测试。对于通用图片保护需求,这种思路可以作为传统模糊与遮挡之外的重要补充。