摘要:該文系統(tǒng)介紹了數(shù)字水印的原理和應(yīng)用方法,并研究了一種基于離散余弦變換(DCT)的數(shù)字圖像水印算法,并借助MATLAB編程工具,實現(xiàn)數(shù)字水印的嵌入、提取和攻擊測試。
關(guān)鍵詞:數(shù)字圖像;數(shù)字水?。籇CT;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的普及,信息的安全保護問題日益突出。如何有效地防止數(shù)據(jù)的非法復(fù)制和鑒別數(shù)字媒體的知識產(chǎn)權(quán),成為亟需解決的問題。1993年Carormi提出了數(shù)字水印的概念,并應(yīng)用于數(shù)字圖像,此后,研究人員將數(shù)字水印的概念擴展到電視圖像和聲音等領(lǐng)域。數(shù)字水印技術(shù)是指在宿主數(shù)字媒體(圖像、聲音、視頻)等中嵌入一定量的數(shù)字信息,例如作者的電子簽名、日期、公司圖標等,用以證明作品的所有權(quán),并可作為起訴非法侵權(quán)的證據(jù),從而保護作品原創(chuàng)者的合法利益。本文介紹了一種基于典型的DCT(離散余弦變換)數(shù)字水印算法過程,詳細介紹了用MATLB來實現(xiàn)數(shù)字水印的嵌入、提取和攻擊測試的方法。
2 數(shù)字水印技術(shù)
從信號處理的角度看,在載體圖像中嵌入數(shù)字水印可以視為在強背景(即原始圖像)下疊加一個視覺上看不到的弱信號(水印),由于人的視覺系統(tǒng)(Human Visual System,HVS)分辨率受到一定的限制,只要疊加信號的幅度低于HVS的對比度門限,HVS就無法感覺到信號的存在。因此,通過對載體對象作一定的調(diào)整,就有可能在不引起人感知的情況下嵌入一些信息。
2.1 數(shù)字水印的嵌入
水印嵌入就是把水印信號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的選擇必須考慮圖像的性質(zhì)和視覺系統(tǒng)的特性。
2.2 水印的提取
在某些水印系統(tǒng)中,水印可以被精確地提取出來,這一過程被稱作水印提取。例如在完整性確認的應(yīng)用中,必須能夠精確地提取出嵌入的水印,并且通過水印的完整性來確認多媒體數(shù)據(jù)的完整性。如果提取出的水印發(fā)生了部分的變化,最好還能夠通過變化的水印的位置來確定原始數(shù)據(jù)被篡改的位置。水印在提取時可以需要原始圖像的參與,也可以不需要原始圖像的參與。圖2是水印提取的框圖.虛線部分表示在提取或判斷水印信號時原始圖像不是必需的。
2.3 水印檢測
水印在檢測時可以需要原始圖像的參與,也可以不需要原始圖像的參與。但將水印技術(shù)用于圖像的網(wǎng)絡(luò)發(fā)布和傳播時,如果檢測時需要使用原始圖像則是個缺陷,因此,當前大多數(shù)的水印檢測算法不需要原始圖像的參與。圖3分別是水印檢測的框圖.虛線部分表示在提取或判斷水印信號時原始圖像不是必需的。
3 DCT域數(shù)字圖像水印算法實現(xiàn)
目前可以將數(shù)字水印算法可以分成兩類:空域水印算法和頻域水印算法??沼蛩∷惴ㄊ侵笇⑺⌒盘栔苯忧度朐谠紨?shù)據(jù)中。頻域水印算法首先將原始的數(shù)據(jù)進行DCT或小波變換,在頻域上嵌入水印信息,然后經(jīng)反變換輸出。在檢測水印時,也要首先對信號作相應(yīng)的數(shù)學變換,然后通過相關(guān)運算檢測水印。
選擇二值化灰度圖像作為水印信息,根據(jù)水印圖像的二值性選擇不同的嵌入系數(shù),并將原始圖像進行8*8的分塊,將數(shù)字水印的灰度值直接植入到原始灰度圖像的DCT變換域中,實現(xiàn)水印的嵌入具體方法如下:
3.1 水印嵌入
設(shè)X是M*N大小的原始圖像,W是水印圖像,大小為P*Q,M和N分別是P和Q的偶數(shù)倍。把水印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是加權(quán)系數(shù),用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 水印提取 設(shè)圖像X’為已經(jīng)加載了水印的載體圖像?,F(xiàn)要將所加載的水印從X’中提取出來。其過程為上述加載水印算法的逆運算:將X’分為(M/8)*(N/8)個8*8大小的方塊BX’(m,n),1= 下面給出具體的實現(xiàn)過程: 讀取原始圖像和黑白水印圖像到二維數(shù)組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 嵌入水印后的圖像與提取的結(jié)果 4 水印攻擊測試 由于數(shù)字水印在實際應(yīng)用中可能會遭到各種各樣的攻擊,因此對算法進行攻擊測試是衡量一個水印算法優(yōu)劣的重要手段。 下面給出水印攻擊與水印提取的具體實現(xiàn)過程,首先對嵌入水印后的圖像進行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('從經(jīng)過壓縮的圖像中提取的水印'); 5 結(jié)束語 從圖4,5中可明顯看出:嵌入水印信息后,原圖與嵌入水印信息后的圖像在視覺效果上沒有明顯分別,用肉眼幾乎分辨不出,這說明這種算法充分利用了人眼的視覺HVS特性,利用DCT域嵌入水印后,水印的不可見性相當好,圖像在嵌入水印前后視覺效果改變不大,不影響圖像的正常使用。 從圖6可明顯看出:嵌入水印后的圖像經(jīng)過參數(shù).‘Quality’為45的JPEG壓縮后,還能從中提取出較清晰的水印信息,可見,這種嵌入算法的抗攻擊性較好,而且檢測和提取易于實現(xiàn),具有很好的實用性。 參考文獻: [1] 王銀花.基于matlab的數(shù)字水印技術(shù)實現(xiàn)[J].巢湖學院學報,2007,9(3). [2] 易開祥.數(shù)字圖像加密與數(shù)字水印技術(shù)研究[D].浙江大學,2006. [3] 胡彥,陳昭炯.MATLAB在數(shù)字水印中的應(yīng)用[J].計算機工程,2003(7). [4] 張春田,蘇玉挺,管曉康.多媒體數(shù)字水印技術(shù)[D].通信學報,2000,21(9).