如何处理图片才能避免图中文字被 OCR 识别?

井韶子,microcosm

【三更】:有人私信韶子说建议删除代码,如果有人用它干坏事的话,可能会有法律风险。就……反正多一事不如少一事,删了。大家想测试的话,应该随便找一个大语言模型都能写出来,韶子这里就不放了。

【二更】:大家检测的时候注意,前面《临江仙》的例子是大字藏小字,检测出《中国社会各阶级的分析》才算成功;后面“xxxx 全国包过……”的例子是小字藏大字,检测出“xxxx 全国包过……”才算成功。手机端图片似乎有压缩,电脑端应该能获取原图。手机端可以试试文章开头这两张竖版的。(p.s.话说知乎怎么上传不了原图)

【一更】修改了一下藏字的逻辑,从全局由上至下由左至右的顺序改为大字逐字填充的顺序,降低了人眼识别小字时的难度,识别起来更方便了。代码同步更新放在文末了。

大字 300 像素,小字 12 像素,行间距 1 像素,字间距 1 像素
大字 400 像素,小字 30 像素,行间距 0 像素,字间距 0 像素

【以下是原回答】

太简单了。

正所谓堵不如疏想让 OCR 识别不出文字的最好方法,就是让他识别出文字,用识别出的文字来迷惑模型,使它认为这个位置已经检测过了,从而放弃二次检测。而这种对 OCR 模型的误导,对人类却没有任何作用。

这种方法分为“大字藏小字”“小字藏大字”两种情况,根据不同的实际情况选用不同的方法。比如某 OCR 对小字的检测很精确,那就采用“小字藏大字”的方式,比如评论区白描 app 的例子;如果某 OCR 对全局检测能力较强,那就采用“大字藏小字”的方式。这个方法的最关键之处,就是字体字号可以随意调整,非常灵活,一般来说,每家 OCR 处理流程都是固定的,所以我们需要试错之后灵活调整。这两种方式或许有一种可以识别,但是总有一种识别不了,我们见招拆招就好了。

另外评论区说加高斯模糊可以识别,这个确实可以。但是识别的前提有人类的参与,人类看出来有大字了才会加高斯模糊,模型自己并不会主动加。万一模型不分青红皂白直接加高斯模糊,那我这直接来一篇正常的文章的截图,一模糊,这不完了么,啥也识别不出来……而但凡有人类的参与,都可以直接解读了,还用 OCR 干什么。这个方法的设计之初就是为了防止自动 OCR 识别而不防人类的。

【注:成功的前提是,目前没有针对这种“隐写术”专门训练的模型,如果有的话,这种方式也不靠谱】

先来看“大字藏小字”:

大字 400 像素,小字 12 像素,行间距 1 像素,字间距 1 像素
大字 200 像素,小字 12 像素,行间距 1 像素,字间距 1 像素

识别结果:豆包

大字 200 像素,小字 12 像素,行间距 1 像素,字间距 1 像素
大字 400 像素,小字 12 像素,行间距 1 像素,字间距 1 像素

Gemini

大字 400 像素,小字 12 像素,行间距 1 像素,字间距 1 像素

大字 200 像素,小字 12 像素的图,Gemini 看出来有小字了,但是小字识别错误。而且很离谱 emmm 就不放了,放了号就没了。

【更新】幽默苹果:


另外,如何确定识别不出来是因为“受到大字影响”而不是“小字看不清”呢?

1920*1080,小字 12 像素,行间距 1 像素,字间距 1 像素

这张图片的小字的大小和前面一致,我们让模型来识别。

豆包成功

Gemini 失败

可能 Gemini 在识别之前的预处理会降低分辨率叭。至少这种把戏对豆包是十分有效的(其他家 AI 模型的 OCR 能力韶子没有测试)。

所以,若要以大字藏小字来骗过 OCR 模型,大字尽量大(但不要太大),小字尽量小。


另一种情况是其他答主给出的例子,此时我们可以反其道而行之,以小字藏大字。(p.s.别拿来干坏事就行)

以其他答主提供的文本为例:

大字 400 像素,小字 30 像素,行间距 0 像素,字间距 0 像素
大字 300 像素,小字 20 像素,行间距 0 像素,字间距 0 像素

豆包失败

大字 300 像素,小字 20 像素,行间距 0 像素,字间距 0 像素
大字 400 像素,小字 30 像素,行间距 0 像素,字间距 0 像素

Gemini 失败

大字 300 像素,小字 20 像素,行间距 0 像素,字间距 0 像素

emmm……也不知道 Gemini 怎么回事……

在以小字藏大字的时候,在能看出大字的情况下,小字尽量大,这样 OCR 模型的关注点会更多地集中在小字上。这样,两种方式都可以在骗过 OCR 模型的情况下,很容易地被人眼所识别。另外,其他答主做过实验,这种大字加高斯模糊可以被 OCR 识别,因此还是大字藏小字更靠谱一些。总之,如果预处理方式是固定的,那么要么只能识别出大字,要么只能识别出小字,(只要字体字号行间距等参数调得好)大字小字绝对不可能同时识别。一种方式失败了换另一种即可。