用ImageMagick实现数字盲水印

什么是数字盲水印

具体的解释能够看这个帖子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里看到水印了。

相关文章
相关标签/搜索