简介:截图、证件照、票据图片外发时,图中文字可能被OCR批量提取。本文从OCR“检测—识别”两阶段原理出发,梳理区域破坏、环境干扰、低对比度、几何形变、字形替换、对抗扰动六类防护手段,给出可落地的处理流水线与效果验证方法,并讨论多模态大模型带来的新挑战与合规边界,帮助读者按敏感等级选择合适的防OCR方案。
把文字放进图片,曾经被很多人当作“防搬运”的土办法;但随着OCR识别精度大幅提升,这张“安全牌”正在快速失效。本文从原理到实践,系统讲清楚如何处理图片,才能让图中文字不被OCR轻易读走。
在档案数字化、票据识别等场景里,OCR是提升效率的生产力工具;但在另一类场景中,需求恰好相反——我们希望图中文字“人能看,机器读不出”,或者干脆“谁都读不出”:
先划清边界:本文讨论的防OCR手段,仅适用于自己拥有权利的内容、隐私脱敏与版权保护等正当用途,不能用于伪造证据、规避内容安全管理等违规场景。
主流OCR系统基本遵循同一条流水线,防OCR的本质,就是让其中至少一环失效:
对应地,防护目标可以拆成三句话:让预处理失败(笔画和背景分不开)、让检测找不到(文本框定位不到)、让识别读不对(框到了但读成错字)。下面六类手段,正是分别攻击这三个环节。
对敏感区域做马赛克、高斯模糊、纯色遮挡或直接裁剪,适用于“人也不需要读”的场景,例如证件号、银行卡号的核心字段。两个细节值得注意:
在图中叠加随机噪点、复杂底纹、网点纹理、渐变背景。OCR预处理的第一步通常是二值化,一旦背景纹理复杂到笔画与背景难以分离,后续检测和识别都会连锁出错。票据、证书上的防复印底纹,就是这个思路的工程化应用。
把文字做成低对比度、彩色、带描边阴影或与背景色相近的样式。人眼对低对比度文字有很强的容错能力,而二值化后的笔画可能断裂、消失。这类手段实现成本最低,适合作为“软防护”的基础层。
字符基线上下错位、字符间距不均、轻度旋转、透视变形、弹性扭曲。检测模型依赖文本行的规律性排布,识别模型依赖字符形态的稳定性,适度形变会让两者同时受挫。注意控制幅度,别把人的阅读体验也一起破坏掉。
这是最“讲究”的一类:
在像素上叠加人眼几乎不可察觉、但会让识别模型输出错误的扰动。工程上有三个要点:
实际工程中建议按敏感等级选模式。以下为示意伪代码,具体实现可基于任意主流图像处理库完成:
# 防OCR处理流水线(示意伪代码)def protect_image(img, mode="readable"):# 第一步:定位文字区域。# 可复用云上OCR能力,例如调用百度智能云的通用文字识别接口,# 只取返回的文本框坐标,不取文本内容boxes = ocr_locate(img)if mode == "unreadable":# 不可读模式:直接破坏文字区域,人和机器都读不了for box in boxes:img = cover_or_mosaic(img, box, block_size=14)else:# 可读模式:文字保留,叠加多层干扰img = add_texture_noise(img, density=0.05) # 复杂底纹,破坏二值化img = reduce_contrast(img, factor=0.55) # 低对比度,人眼仍可读img = insert_interference(img, boxes) # 干扰线/符号,破坏检测img = jitter_baseline(img, boxes, amp=2) # 基线错位,破坏识别# 收尾:叠加半透明水印,兼顾溯源与威慑img = overlay_watermark(img, opacity=0.12, angle=30)return img
流水线里有一个反直觉但很实用的技巧:用OCR来防OCR。先调用识别接口拿到文本框坐标,再对这些区域做精准处理,比全图无差别处理更可控,也不会误伤图表、人像等非文字区域。
防OCR效果不能靠“看起来很乱”来评估,建议建立量化验证流程:
按敏感等级选择手段,避免“一刀切”:
最后必须强调:图像处理只是第一道防线。防OCR提高的是批量提取的成本,而不是绝对封锁——多模态大模型的出现已经证明了这一点。真正的高敏感数据,应当依靠加密、权限控制、脱敏与数字水印溯源等纵深防御手段,而不是指望“把字藏进图里”就万事大吉。