前有P图大神,后有AI改图,“有图未必有真相”怎么破?想判断照片哪里被改过?还想知道被改之前是什么样子?我做了一个决定,把这项专利技术完全开源:使用半脆弱数字水印,让图像具有篡改定位与恢复的能力。

这项技术能做什么?
通过在照片中嵌入肉眼难以察觉的“数字水印”来给它加密。简单说,只要相机、手机、扫描仪使用了这个技术,它拍摄的照片就是可信的:如果有人改动了照片,我们可以检测出哪部分被改了,而且还可以恢复改之前的原图。例如,我们用带有这个技术的相机拍下了这张照片,被人拷贝走之后把Bruce Willis给“换头”了:

怎么办?通过数字水印检测,我们可以定位出哪里被改过,还能把它恢复原状,真相只有一个:

这是怎么做到的?
先把图像分成小块,在每块中提炼出压缩编码过的信息,然后把它隐藏到离它比较远的其它小块里面去。这样,当某块图像被改了,它隐含的信息就会不完整,我们就知道它被改过了,然后再从其它块中恢复出它的原样。
既然隐藏了额外的信息,那么就需要增加信息量,图像质量会有一点点牺牲,不过很难用肉眼察觉。把上面的警灯放大8倍,就看到了额外的信息(右图):

这些不起眼的噪点所隐藏的,就是用来检测和恢复图片篡改的信息。它和相机自身的噪点类似,用户看不到左边的原图,无从比较,所以是不会注意到的。
这项技术有什么用处?
媒体如果截取了半张图片,我们可以恢复出整张来,识破CNN的断章取义:

可以用在金融和贸易行业的票据扫描仪上,用于票据防伪:

“错误的情报不如没有情报”,军事用途你懂的:

此外,还可以用于司法取证、医疗档案防篡改、图片版权保护……
这项技术的优势是什么?
这并不是第一个图像篡改定位与恢复的技术,但它的独特在于:
- 不需要改动硬件,不需要使用网络,与通行的JPEG格式兼容。
- 正常的JPEG压缩、模糊、锐化、调色不会被误判为篡改。
- 以8*8像素的精度定位篡改区域。
- 只要篡改区域不太大,就能比较清晰的恢复篡改区域的灰度版本。
背后的技术原理是什么?
原理图如下:

数字水印由两部分组成,恢复水印和定位水印:
- 恢复水印是基于DWT和SPIHT编码技术的原始图像灰度版本压缩,比特率约为0.3位每像素。恢复水印通过逻辑混沌序列伪随机扰乱,嵌入色度分量的DCT系数矩阵中。
- 定位水印包含多个校验位,分别与亮度和色度分量相关,并嵌入在亮度分量的DCT系数矩阵中。
为了解决数据溢出和截断问题,可以使用两种方法:仿射变换和多重嵌入,每种方法都有其优势。
定位结果通过数学形态学算法进行修饰,以提升定位精度。
开源,是真的吗?
是真的:https://github.com/wolfccb/image-tamper-recovery ,MATLAB源代码,欢迎star和fork。
在AI飞速发展的今天,我觉得它更有价值了。而且,这项技术的专利(CN200810097478.5,CN101419702)已经过期,作为发明人,我乐于见到它成为本领域公共知识。使用MIT Licence。
如果你打算改进它,这些是可能的方向:
- 用门限秘密共享算法替代分块压缩,获得更高的压缩比,而且增加冗余。
- 优化SPHIT的部分,目前的代码来自scuteejtian,很慢。
- 并行化或向量化,或用C/C++重写代码,提高速度。
写在最后
在图像可以被AI轻易篡改的时代,我希望这项技术能够成为守护图像真实的一盏灯。开源它,是希望这盏灯能够照亮更多角落。
技术可能会破坏真实,技术也应该守护真实。
以上。
开放的老狼
