M Marka 下载 Marka

马赛克、高斯模糊和实心块,到底有什么区别

三种遮挡方式在原理上不是一回事:两种是可建模的运算,一种是直接把信息扔掉。什么时候马赛克够用,什么时候它只是看起来够用。

这三种东西在界面上是并排的三个按钮,看着像是同一件事的三种风格。它们不是。马赛克和高斯模糊都是对原始像素做一次运算,运算的结果里还留着原始内容的痕迹;实心块是把那块区域直接换成一个颜色,原来是什么已经不在文件里了。这个区别在多数场合无所谓,在少数场合决定一切。

先给结论,后面再解释为什么:日常场合用马赛克没问题;要发到你收不回来的地方、或者被盖住的是一串格式固定的短东西(手机号、身份证号、验证码、车牌、人脸),用实心。高斯模糊在这两件事上都不是最优解,它主要的用处是好看。

三种运算,各自在做什么

马赛克:分块取平均

把区域切成一个个方格,每个方格里的所有像素被同一个颜色取代,通常是格子内的平均值。格子多大,就丢掉多少信息:一个盖住整个字的格子,把这个字压成了一个灰度值;一个只有两三像素宽的格子,几乎什么都没丢,只是让画面看起来有颗粒感。所以「打了马赛克」这句话本身不构成任何保证,块的大小才是。

高斯模糊:和一个核做卷积

每个像素被换成它周围一圈像素的加权平均,权重按高斯分布递减,半径决定影响范围。关键在于这是一个线性运算,而且是一个已知的、可以写下来的线性运算——只要知道半径,理论上就能构造反运算。实践中噪声和量化会让完全的反卷积不可行,但这条路是开着的,而实心块那边根本没有路。

模糊还有一个很实际的坑:半径必须相对于被盖内容的尺寸来定。一个对 48 像素高的大标题足够的半径,落在 12 像素高的正文上就只是让字变软了一点,笔画的轮廓仍然在,认起来毫不费力。而人调半径的时候看的是整张图的观感,不是那行小字。

实心:把像素换掉

这块区域被填成一个颜色。没有平均值,没有残留的亮度分布,没有笔画轮廓。导出之后文件里那一块就是一片纯色,你没法从一片纯色里推出它原来是什么,因为无穷多种原图都会得到同一片纯色。这不是「很难还原」,是没有东西可还原。

「马赛克能被还原」这句话,对在哪、错在哪

这句话在网上流传得很广,通常配着一段像素化文字被复原的演示。演示是真的,但它省掉了前提,而前提比结论重要得多。

2020 年前后公开的一类工具(Depix 是最有名的那个)能从像素化的文字截图里还原出内容,它的做法是搜索:拿同样的字体、同样的字号、同样的渲染方式生成大量候选文本,用同样的块大小和同样的对齐方式打码,然后去匹配你那张图上每个格子的颜色。它成立需要几件事同时为真——被盖的是屏幕上渲染出来的文字而不是照片,字体和渲染管线是已知的(等宽字体最好办),块格和字符的相对位置能被对齐,而且块不能太大。这几条里断掉任何一条,这条路就走不通了。

另一类工作是用神经网络。2016 年 McPherson、Shokri 和 Shmatikov 发表的结果显示,在马赛克、模糊以及当时的一种隐私保护编码上训练的卷积网络,能以很高的准确率认出被遮挡的内容,实验用的是人脸库、CIFAR-10 和手写数字。这里必须说清楚它做的是什么:它是在一个已知的候选集合里做识别——「这张糊掉的脸是这四十个人里的哪一个」——不是把像素反算回来。所以它的威力完全取决于候选集合有多大。对一张公司团建照来说,候选就是通讯录里那些人,这个前提是实实在在成立的;对一张街拍里的陌生人,就不成立。

反过来,把这句话推成「马赛克永远能被还原」是错的,而且错得挺离谱。一张已经拍平导出的图,上面盖着足够粗的马赛克,文件里不存在任何隐藏图层可以剥掉;每个格子只剩一个数字,而能产生这个数字的原始内容有无穷多种。除非被盖的东西本身候选很少,否则没有任何办法把它挑出来。

不用记算法的判断标准

把上面所有内容压成三个问题,对着你要盖的那个东西问一遍:

  1. 这个东西一共有多少种可能的取值?六位验证码有一百万种,手机号的号段是有限的,身份证号的前六位是行政区划、中间八位是出生日期,一张脸的候选是你认识的那些人。而一段随手写的话,可能性是无穷的。
  2. 对方知不知道它的格式和渲染方式?知道是等宽字体的十一位数字,和只知道「这里糊了一块」,是完全不同的两件事。
  3. 如果被猜中,代价有多大?能承受就随意;不能承受,那就没有讨论必要——用实心。

按这三个问题走下来,多数日常场景的答案是「马赛克可以」,少数场景的答案是「必须实心」,而基本上没有场景的答案是「用高斯模糊」。模糊的位置很尴尬:它比马赛克更保留结构(因而更容易读回来),又不比马赛克好看多少,它真正合适的地方是背景虚化这种审美用途,不是遮挡。

几个和算法无关、但更常出事的地方

在 Marka 里对应到哪三个按钮

Marka 的打码工具就是这三种方式:马赛克在免费档,模糊和实心属于 Pro。三种方式都用同一支笔刷——你不画框,直接从要盖的东西上抹过去,抹到哪儿盖到哪儿,配一根强度滑块和三档笔刷宽度。抹一整段聊天记录用粗档,抹一个头像或者一行小字用细档。

把马赛克留在免费档是有意的:绝大多数人来这里要办的整件事,就是「盖住号码再发出去」,而那件事的默认答案是马赛克。实心之所以放在 Pro 里,不是因为它更难做,而是因为它和模糊、贴图、背景一起构成了这个 App 收费的那一部分——但需要它的那些场合,恰恰是最不该省这一步的场合,所以上面那三个问题值得你自己先问一遍再决定。

还有一条和这个话题直接相关的性质:全部处理都在本机完成,图片不会被上传到任何地方。对一篇讨论「遮挡会不会被还原」的文章来说,这是同一个问题的另一半——你把一张还没打码的图交给了谁,和你打的码结不结实同样重要。

常见问题

马赛克到底能不能被还原?

要看条件。对一张拍平导出、块又够粗的图,不能——每个格子只剩一个平均值,能产生它的原图有无穷多种。但如果被盖的是屏幕渲染出来的文字、字体和块大小已知、块又比较细,已经有公开工具能靠穷举匹配把它搜出来;如果被盖的是一张脸而候选只有几十个人,神经网络也能认出来。所以判据是候选空间,不是算法名字。

那高斯模糊呢,比马赛克安全还是不安全?

一般更不安全。模糊是一个已知的线性运算,保留的结构比同等观感的马赛克更多,笔画轮廓常常还在。而且半径要按被盖内容的字号来定,对小字来说很容易调得不够。想遮挡就别用模糊,它更适合审美用途。

实心块有没有可能被还原?

在拍平的位图上没有——那块区域已经是一片纯色,没有信息可以恢复。风险只来自别的地方:文件保留了图层、你盖的范围不够、或者同一份内容在别处还有一份没盖的副本。

打码的强度或者块大小该怎么定?

按被盖对象的尺寸定,不是按图片尺寸。一个格子至少要能吃掉一整个字符,两三个更稳。定完把图放到 100% 以上看一眼,只要还能看出笔画走向或者字符个数,就再粗一档。另外,一定要在原始尺寸上打码,别先缩图再打。

为什么很多工具默认给的强度都偏低?

因为默认值是照着「好看」调的:太粗的马赛克在预览里显得难看。而安全和好看在这件事上是反的。凡是涉及固定格式的号码,手动往上调,或者直接换实心。

人脸用哪一种?

实心,或者干脆裁掉。在候选人数有限的场合,打了马赛克和模糊的人脸已经被公开研究用神经网络高准确率地认出来过——那是在已知的一群人里挑,而一张同事聚餐照的候选正好就是那几十个人。

用 Marka 做这件事

Marka 是 iPhone、iPad 和 Mac 上的截图标注 App。划一下把不该看的盖掉,用箭头指住该看的,用序号标出步骤,裁成你要发的比例,然后发出去。全程在设备本地处理——不上传、不注册、无埋点,安装包 2.4 MB。打开图片、裁切、马赛克笔刷和导出都免费;Pro 是一次性买断,三端通用。

去 App Store 下载

相关文章

全部文章