具体的解释能够看这个帖子。bash
基本流程就是:原图做傅里叶变换,而后在转换后的频域里加水印,再做傅里叶逆变换生成带盲水印的图。工具
这样的图片看不到水印,而且经得起折腾。测试
只要把带水印的图片做傅里叶变换便可以频域里看到原来的水印。ui
因此实现的关键就在于傅里叶变换和逆变换。方法有不少,好比numpy就带了fft(快速傅里叶变换)实现。编码
这里要介绍的是用一个命令行图片处理工具:ImageMagick。这是一个很是强大的工具,提供了图片处理所须要的几乎全部功能,不过傅里叶变换仍是一个比较不经常使用的功能,因此它是经过集成另外一个工具实现的——fftw。spa
因此使用前首先须要在你的系统里安装ImageMagick和fftw这两个东西,注意,若是有安装或编译选项的话,必定要给ImageMagick加上--with-fft,这样才会集成fftw。命令行
剩下就是这些命令了:code
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里看到水印了。