简介:本文系统讲解如何通过视觉感知与特征空间扰动让图片中的文字难以被OCR识别。读者将掌握彩色对接光栅的生成原理与实现步骤,理解人眼轮廓补全与机器特征提取的差异,并学会用OpenCV完成掩码提取、局部形变、相位反转与多通道合成,最终得到兼顾人眼可读与机器难识别的图像处理方案。
OCR(光学字符识别)技术已经相当成熟,印刷体识别准确率在清晰图像上可达很高水平,手写体与复杂版式也有长足进步。这带来一个现实问题:当图片中的文字包含敏感信息、版权内容或需要限制自动化抓取的数据时,普通图片几乎无法阻挡批量识别。传统做法如加噪、模糊、遮挡,往往要么破坏人眼可读性,要么在预处理环节被轻易消除。
于是出现了一个更有意思的技术方向:让文字对人眼保持可读,却让机器识别变得困难。这不是简单的“加干扰”,而是利用人类视觉系统与神经网络视觉编码器之间的感知差异,构造一种“人机不对称”的图像。本文围绕这一思路,重点讲解一种可自行实现的方案——彩色对接光栅(Colored Abutting Grating),并补充对抗扰动的整体框架,给出可落地的工程实现要点。
人类视觉系统具有很强的知觉组织能力。格式塔心理学中的“轮廓补全”指出,当一条边缘被局部打断、但整体走向连续时,人眼会自动将其组织为完整轮廓。虚幻轮廓(Illusory Contour)现象进一步说明,即便边界处没有真实的亮度或颜色突变,只要两侧纹理存在结构性错位,人眼仍能“感知”出一条清晰的边界。
这意味着:我们可以把字符的笔画边缘替换为条纹之间的相位错位,而不是传统的颜色对比。人眼会把相位不连续的条纹组织成字符轮廓,从而正常阅读。
多模态模型与OCR系统的处理链路通常包括:图像缩放、归一化、卷积或ViT特征提取、序列解码。字符信息一旦被编码为细微的相位关系,在缩放与池化过程中容易被削弱;而神经网络的特征空间对高频纹理结构并不敏感,更依赖局部对比度与语义先验。因此,同样的图像,人眼能读出字符,模型却可能判断困难。
完整的防识别方案可以拆成两个层面:
两层可以叠加使用:先用光栅重构字符外观,再叠加对抗扰动增强迁移性。对于自行实现,感知层方案门槛低、可解释性强,适合作为起点。
实现步骤可以概括为:
下面逐点展开。
首先将原图转为灰度图,使用Otsu阈值分割得到文字的二值掩码。Otsu方法基于类间方差最大化自动选取阈值,对背景与文字对比明显的图像效果稳定。
import cv2import numpy as npgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
得到掩码后,对文字轮廓做轻微局部形变。目的是打破笔画的规则性,增加机器特征提取的难度,同时不影响人眼识别。常用做法是用低频随机位移场对掩码进行重映射:
h, w = mask.shape# 生成低频随机位移场dx = cv2.GaussianBlur(np.random.randn(h, w).astype(np.float32), (0, 0), 15) * 3dy = cv2.GaussianBlur(np.random.randn(h, w).astype(np.float32), (0, 0), 15) * 3grid_x, grid_y = np.meshgrid(np.arange(w), np.arange(h))map_x = (grid_x + dx).astype(np.float32)map_y = (grid_y + dy).astype(np.float32)mask_warped = cv2.remap(mask, map_x, map_y, cv2.INTER_LINEAR)
位移幅度需控制,过大将导致笔画断裂、人眼不可读。
光栅本质是正弦条纹。给定空间频率 f 与方向 θ,可生成:
def grating(h, w, freq, theta, phase):x = np.arange(w)[None, :]y = np.arange(h)[:, None]coord = x * np.cos(theta) + y * np.sin(theta)return 0.5 + 0.5 * np.sin(2 * np.pi * freq * coord + phase)
关键操作是相位反转半个周期:字符内部区域使用相位 φ,背景区域使用 φ+π。这样字符内外颜色分布相近,但边界处条纹错位,形成虚幻轮廓。实现时用掩码做选择:
g_in = grating(h, w, freq, theta, phase=np.pi)g_out = grating(h, w, freq, theta, phase=0)m = (mask_warped > 127).astype(np.float32)g = g_in * m + g_out * (1 - m)
为增强鲁棒性,可将不同方向、不同频率的光栅分别编码到R、G、B通道。例如R通道用水平低频光栅,G通道用垂直中频光栅,B通道用对角高频光栅。各通道独立做相位反转后合成:
r = apply_grating(mask_warped, freq=0.08, theta=0.0)g = apply_grating(mask_warped, freq=0.12, theta=np.pi/2)b = apply_grating(mask_warped, freq=0.10, theta=np.pi/4)out = cv2.merge([b, g, r]) # OpenCV为BGR顺序
最后叠加局部条纹扰动,例如在边界附近加入小幅随机相位抖动,进一步削弱机器对相位关系的稳定提取。
评估应同时关注两个指标:
理想结果是前者高、后者显著下降。
需要认识到,这类方法并非不可破解。若攻击者已知构造方式,可通过频域分析、相位解调或针对性训练恢复文字。因此它更适合作为提高自动化识别成本的手段,而非绝对安全屏障。实际部署时可与访问控制、水印、动态挑战等机制组合使用。
在光栅方案之上,可进一步引入对抗扰动。白盒场景下,直接利用目标模型梯度更新扰动,提高指定文本的生成概率;黑盒场景下,可用多个公开视觉编码模型作为代理,优化图像特征与目标文本特征之间的相似度,增强扰动向其他模型的迁移性。工程上需注意扰动预算约束(如L∞范数上限),避免人眼可见的明显失真。
这一层的价值在于:光栅改变的是“文字如何呈现”,对抗扰动改变的是“模型如何理解”。两者结合,才构成较完整的防识别思路。
让图片中的文字“人眼可读、机器难识”,核心在于利用人机视觉差异。彩色对接光栅通过掩码提取、轮廓形变、相位反转与多通道合成,把字符边缘转化为条纹错位,使人眼依靠轮廓补全完成阅读,而机器在缩放与特征提取中丢失相位线索。该方案实现门槛适中、可解释性强,适合作为防OCR处理的起点;在此基础上叠加对抗扰动,可进一步提升对自动化识别的干扰能力。工程实践中应重视参数调优与效果评估,并清醒认识到任何单一手段都有其边界,组合策略与持续迭代才是务实之道。