摘要:該文系統介紹了數字水印的原理和應用方法,并研究了一種基于離散余弦變換(DCT)的數字圖像水印算法,并借助MATLAB編程工具,實現數字水印的嵌入、提取和攻擊測試。
關鍵詞:數字圖像;數字水??;DCT;MATLAB
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)04-0868-03
A Digital Watermarking Algorithm Based on DCT Domain
GAO Yu-na,YANG Zhong-gen
(Information Engineering Institute of Shanghai Maritime University,Shanghai 200135,China)
Abstract: This paper introduces the principle methods and applications of digital watermarking and give an watermarking algorithm of the digital image which based on discrete cosine transform (DCT). With matlab programming tools, this algorithm has realized the digital watermark embedding, extraction and attack test.
Key words: digital image;digital watermarking;DCT;MATLAB
1 引言
隨著Internet的普及,信息的安全保護問題日益突出。如何有效地防止數據的非法復制和鑒別數字媒體的知識產權,成為亟需解決的問題。1993年Carormi提出了數字水印的概念,并應用于數字圖像,此后,研究人員將數字水印的概念擴展到電視圖像和聲音等領域。數字水印技術是指在宿主數字媒體(圖像、聲音、視頻)等中嵌入一定量的數字信息,例如作者的電子簽名、日期、公司圖標等,用以證明作品的所有權,并可作為起訴非法侵權的證據,從而保護作品原創者的合法利益。本文介紹了一種基于典型的DCT(離散余弦變換)數字水印算法過程,詳細介紹了用MATLB來實現數字水印的嵌入、提取和攻擊測試的方法。
2 數字水印技術
從信號處理的角度看,在載體圖像中嵌入數字水印可以視為在強背景(即原始圖像)下疊加一個視覺上看不到的弱信號(水印),由于人的視覺系統(Human Visual System,HVS)分辨率受到一定的限制,只要疊加信號的幅度低于HVS的對比度門限,HVS就無法感覺到信號的存在。因此,通過對載體對象作一定的調整,就有可能在不引起人感知的情況下嵌入一些信息。
2.1 數字水印的嵌入
水印嵌入就是把水印信號W={w(k)}嵌入到原始圖像X0(k)={x0(k)}中。水印嵌入過程如圖1所示。
水印嵌入準則分為:
加法準則:x(K)=x0(K)+a*w(k)
乘法準則:x(K)=x0(K)*{1+ a*w(k)}
a為強度因子,為了保證在水印不可見的前提下,盡可能提高嵌入水印的強度。a的選擇必須考慮圖像的性質和視覺系統的特性。
2.2 水印的提取
在某些水印系統中,水印可以被精確地提取出來,這一過程被稱作水印提取。例如在完整性確認的應用中,必須能夠精確地提取出嵌入的水印,并且通過水印的完整性來確認多媒體數據的完整性。如果提取出的水印發生了部分的變化,最好還能夠通過變化的水印的位置來確定原始數據被篡改的位置。水印在提取時可以需要原始圖像的參與,也可以不需要原始圖像的參與。圖2是水印提取的框圖.虛線部分表示在提取或判斷水印信號時原始圖像不是必需的。
2.3 水印檢測
水印在檢測時可以需要原始圖像的參與,也可以不需要原始圖像的參與。但將水印技術用于圖像的網絡發布和傳播時,如果檢測時需要使用原始圖像則是個缺陷,因此,當前大多數的水印檢測算法不需要原始圖像的參與。圖3分別是水印檢測的框圖.虛線部分表示在提取或判斷水印信號時原始圖像不是必需的。
3 DCT域數字圖像水印算法實現
目前可以將數字水印算法可以分成兩類:空域水印算法和頻域水印算法??沼蛩∷惴ㄊ侵笇⑺⌒盘栔苯忧度朐谠紨祿?。頻域水印算法首先將原始的數據進行DCT或小波變換,在頻域上嵌入水印信息,然后經反變換輸出。在檢測水印時,也要首先對信號作相應的數學變換,然后通過相關運算檢測水印。
選擇二值化灰度圖像作為水印信息,根據水印圖像的二值性選擇不同的嵌入系數,并將原始圖像進行8*8的分塊,將數字水印的灰度值直接植入到原始灰度圖像的DCT變換域中,實現水印的嵌入具體方法如下:
3.1 水印嵌入
設X是M*N大小的原始圖像,W是水印圖像,大小為P*Q,M和N分別是P和Q的偶數倍。把水印w加載到圖像X中,算法分以下幾步進行:
將X分解為(M/8)*(N/8)個8*8大小的方塊BX(m,n),同時,將W也分解為(M/8)*(N/8)個(8·P/M)*(8·Q/N)大小的方塊BW(m,n),1= 對每一個BX(m,n)進行DCT變換:DBX’(m,n)=DCT(BX(m,n)); 對每一個DBX‘(m,n)和BW(m,n),si為從DBX‘(m,n)的中頻選出的加載的位置,l= DBX’’(m,n)(si)=a*Bw(m,n)(ti),其中a是加權系數,用DBX”(m,n)(si)來代替DBX’(m,n)(si)得到加載水印后的圖像; 對以上得到的每一個DBCI’(m,n)進行逆DCT變換:IDBX(m,n)=IDCT(DBX’’(m,n))。并將各方塊IDBX(m,n)合并為一個整圖X’.即加載了水印的新圖像。 3.2 水印提取 設圖像X’為已經加載了水印的載體圖像?,F要將所加載的水印從X’中提取出來。其過程為上述加載水印算法的逆運算:將X’分為(M/8)*(N/8)個8*8大小的方塊BX’(m,n),1= 下面給出具體的實現過程: 讀取原始圖像和黑白水印圖像到二維數組I與J;將原像I分割為互不覆蓋的圖像塊blockL(x,y),1= %嵌入水印的程序代碼 M=960;%原始圖像長度 N=120;%水印圖像長度 K=8; I=zeros(M,M);J=zeros(N,N);BLOCK=zeros(K,K);%顯示原圖像 subplot(3,2,1); I=imread('C:\\Documents and Settings\\Administrator\upian\\3.jpg'); I=rgb2gray(I); I=imresize(I,[960,960],'bicubic');%原始圖像縮放 imshow(I); title('原始公開圖像'); %顯示水印圖像 subplot(3,2,2); J=imread('C:\\Documents and Settings\\Administrator\upian\\sucai\\sy3.gif'); J=im2bw(J,0.4); J=imresize(J,[120,120],'bicubic'); imshow(J); title('水印圖像'); %水印嵌入 for p=1:N for q=1:N x=(p-1)*K+1;y=(q-1)*K+1; BLOCK=I(x:x+K-1,y:y+K-1); BLOCK=dct2(BLOCK); if J(p,q)==0 a=-1; else a=1; end BLOCK=BLOCK*(1+a*0.03);BLOCK=idct2(BLOCK); I(x:x+K-1,y:y+K-1)=BLOCK; end end %顯示嵌入水印后的圖像 subplot(3,2,3);imshow(I);title('嵌入水印后的圖像'); imwrite(I,'watermarked.jpg','jpg'); %從嵌入水印的圖像中提取水印 I=imread('C:\\Documents and Settings\\Administrator\upian\\3.jpg'); I=rgb2gray(I); I=imresize(I,[960,960],'bicubic'); J=imread('watermarked.jpg','jpg'); for p=1:N for q=1:N x=(p-1)*K+1; y=(q-1)*K+1; BLOCK1=I(x:x+K-1,y:y+K-1); BLOCK2=J(x:x+K-1,y:y+K-1); BLOCK1=idct2(BLOCK1); BLOCK2=idct2(BLOCK2); if BLOCK1(1,1)~=0 a=(BLOCK2(1,1)/BLOCK1(1,1))-1; if a<0 W(p,q)=0; else W(p,q)=1; end end end end %顯示提取的水印 subplot(3,2,4); imshow(W); title('從含水印的圖像中提取的水印'); ■ 圖4 原始圖像與水印圖像 圖5 嵌入水印后的圖像與提取的結果 4 水印攻擊測試 由于數字水印在實際應用中可能會遭到各種各樣的攻擊,因此對算法進行攻擊測試是衡量一個水印算法優劣的重要手段。 下面給出水印攻擊與水印提取的具體實現過程,首先對嵌入水印后的圖像進行JPEG壓縮(一種水印攻擊),而后從壓縮的圖像中提取出水印。如圖6所示,從圖中可以看到DCT域的水印算法抵抗JPEG壓縮攻擊的效果是比較好的。 %水印攻擊測試程序 M=960; N=120; K=8; I=zeros(M,M); J=zeros(M,M); W=zeros(N,N); %對嵌入水印后的圖像進行JPEG壓縮 BLOCK1=zeros(K,K);BLOCK2=zeros(K,K); L=imread('watermarked.jpg','jpg'); imwrite(L,'attack.jpg','jpeg','Quality',45); J=imread('attack.jpg','jpeg'); figure, subplot(1,2,1);imshow(J); title('壓縮后的圖像'); %提取水印 I=imread('C:\\Documents and Settings\\Administrator\\×à??\upian\\3.jpg'); I=rgb2gray(I); I=imresize(I,[960,960],'bicubic'); for p=1:N for q=1:N x=(p-1)*K+1; y=(q-1)*K+1; BLOCK1=I(x:x+K-1,y:y+K-1); BLOCK2=J(x:x+K-1,y:y+K-1); BLOCK1=idct2(BLOCK1); BLOCK2=idct2(BLOCK2); if BLOCK1(1,1)~=0 a=(BLOCK2(1,1)/BLOCK1(1,1))-1; if a<0 W(p,q)=0; else W(p,q)=1; end end end end %顯示提取的水印 subplot(1,2,2); imshow(W); title('從經過壓縮的圖像中提取的水印'); 5 結束語 從圖4,5中可明顯看出:嵌入水印信息后,原圖與嵌入水印信息后的圖像在視覺效果上沒有明顯分別,用肉眼幾乎分辨不出,這說明這種算法充分利用了人眼的視覺HVS特性,利用DCT域嵌入水印后,水印的不可見性相當好,圖像在嵌入水印前后視覺效果改變不大,不影響圖像的正常使用。 從圖6可明顯看出:嵌入水印后的圖像經過參數.‘Quality’為45的JPEG壓縮后,還能從中提取出較清晰的水印信息,可見,這種嵌入算法的抗攻擊性較好,而且檢測和提取易于實現,具有很好的實用性。 參考文獻: [1] 王銀花.基于matlab的數字水印技術實現[J].巢湖學院學報,2007,9(3). [2] 易開祥.數字圖像加密與數字水印技術研究[D].浙江大學,2006. [3] 胡彥,陳昭炯.MATLAB在數字水印中的應用[J].計算機工程,2003(7). [4] 張春田,蘇玉挺,管曉康.多媒體數字水印技術[D].通信學報,2000,21(9).