用ImageMagick實現數字盲水印

猛禽大叔發表於2018-02-06

什麼是數字盲水印

具體的解釋可以看這個帖子

基本流程就是:原圖作傅立葉變換,然後在轉換後的頻域里加水印,再作傅立葉逆變換生成帶盲水印的圖。

這樣的圖片看不到水印,並且經得起折騰。

只要把帶水印的圖片作傅立葉變換即可以頻域裡看到原來的水印。

實現方式

所以實現的關鍵就在於傅立葉變換和逆變換。方法有很多,比如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裡看到水印了。

相關文章