编程是一门艺术

raptor.zh(at)gmail.com Creative Commons License
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

archives 存档

01 Jan - 31 Dec 2018
01 Jan - 31 Dec 2017
01 Jan - 31 Dec 2016
01 Jan - 31 Dec 2015
01 Jan - 31 Dec 2014
01 Jan - 31 Dec 2013
01 Jan - 31 Dec 2012
01 Jan - 31 Dec 2011
01 Jan - 31 Dec 2010
01 Jan - 31 Dec 2009
01 Jan - 31 Dec 2008
01 Jan - 31 Dec 2007
01 Jan - 31 Dec 2006
01 Jan - 31 Dec 2005
01 Jan - 31 Dec 2004
01 Jan - 31 Dec 2003
01 Jan - 31 Dec 2002
01 Jan - 31 Dec 2001
01 Jan - 31 Dec 2000
01 Jan - 31 Dec 1999

--

links 链接

--

用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]

Trackback link:

Please enable javascript to generate a trackback url

No trackbacks

评论(0)


 
   
 
  表情图标 

 


提示: 除了 <b> 和 <i> 之外,其他的Html标签都将从您的评论中去除.url或mail地址会被自动加上链接.