用ImageMagick实现数字盲水印

什么是数字盲水印

具体的解释可以看这个帖子

基本流程就是:原图作傅里叶变换,然后在转换后的频域里加水印,再作傅里叶逆变换生成带盲水印的图。

这样的图片看不到水印,并且经得起折腾。

只要把带水印的图片作傅里叶变换即可以频域里看到原来的水印。

实现方式

所以实现的关键就在于傅里叶变换和逆变换。方法有很多,比如numpy就带了fft(快速傅里叶变换)实现。

这里要介绍的是用一个命令行图片处理工具:ImageMagick。这是一个非常强大的工具,提供了图片处理所需要的几乎所有功能,不过傅里叶变换还是一个比较不常用的功能,所以它是通过集成另一个工具实现的——fftw。

所以使用前首先需要在你的系统里安装ImageMagick和fftw这两个东西,注意,如果有安装或编译选项的话,一定要给ImageMagick加上–with-fft,这样才会集成fftw。

剩下就是这些命令了:

convert test.jpg -fft fft.png
convert mark.png -rotate 180 mark1.png
convert fft-1.png mark.png -gravity northwest -geometry +330+360 -composite fft-2.png
convert fft-2.png mark1.png -gravity southeast -geometry +330+360 -composite fft-1.png
convert fft-0.png fft-1.png -ift -crop 1200x800+0+0 test1.jpg
convert test1.jpg -fft fft1.png

上面的命令中,convert就是ImageMagick的主命令。test.jpg为测试图片,大小为1200x800,mark.png为透明PNG图片水印,大小为160x120。

这个例子里用的是明文水印,会在目标图片里留下一些纹理,作编码分散后会好很多,这里从略。

第一句就是把test.jpg作傅里叶变换,生成两个图片:fft-0.png和fft-1.png。其中fft-0为图像的幅度谱,fft-1为相伴谱(即频域)。

第二句生成一个旋转180度的水印图,用于生成对称水印。

第三句就是在相位谱左上方三分之一的位置放一个水印图,具体位置可以自己调整,越往左上,水印能量越小,也就越容易丢失,越往中间则对目标图片影响越大。

第四句与第三句一样,只是对称地在右下方放一个旋转过的水印。

第五句作傅里叶逆变换并裁剪(因为转换后图片会变成方形)生成目标图片。

第六句则是把目标图片作傅里叶变换,之后就可以在fft1-1.png里看到水印了。

推送到[go4pro.org]