具體的解釋能夠看這個帖子。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裏看到水印了。