Matlab中圖像數(shù)字水印算法的原理與實現(xiàn)詳解
一、背景意義
數(shù)字水印技術(shù)作為信息隱藏技術(shù)的一個重要分支,是將信息(水印)隱藏于數(shù)字圖像、視頻、音頻及文本文檔等數(shù)字媒體中,從而實現(xiàn)隱秘傳輸、存儲、標(biāo)注、身份識別、版權(quán)保護(hù)和防篡改等目的。
隨著 1996 年第一屆信息隱藏國際學(xué)術(shù)研討會的召開,數(shù)字水印技術(shù)的研究得到了迅速的發(fā)展,不少政府機(jī)構(gòu)和研究部門加大了對其的研究力度,其中包括美國財政部、美國版權(quán)工作組、美國洛斯阿莫斯國家實驗室、美國海陸空軍研究實驗室、歐洲電信聯(lián)盟、德國國家信息技木研究中心、日本 NTT 信息與通信系研究中心、麻省理工學(xué)院、南加利福尼亞大學(xué)、普渡大學(xué)、劍橋大學(xué)、瑞士洛柔聯(lián)邦工學(xué)院、微軟公司、CA 公司等研究機(jī)構(gòu)。另外,在 TEEE 和 SPIE 等一些重要國際會議上,也專門開辟了與數(shù)字水印相關(guān)的專題。歐洲幾項較大的工程項目(如 VIVA 和ACTS)中也均有關(guān)于圖像水印方面的專題研究。我國在這一領(lǐng)域的研究也基本與歐美等科技強(qiáng)國保持同步,目前國內(nèi)已經(jīng)有不少科研機(jī)構(gòu)投人到數(shù)字水印方面的研究中去。1999年底,第一屆全國信息隱藏學(xué)術(shù)研討會(CIHW)在北京電子技術(shù)應(yīng)用研究所召開。國家“863 計劃”“973項目”(國家重點基礎(chǔ)研究發(fā)展規(guī)劃)、國家自然科學(xué)基金等也都對圖像水印的研究有項目資金支持。
二、基本原理
圖像數(shù)字水印技術(shù)以一定的算法將一些標(biāo)志性信息嵌人到圖像中,而不影響原圖像的面質(zhì)和使用。水印信息可以是序列號或有特殊意義的文本等,通過和載體圖像的緊密結(jié)合而達(dá)到識別圖像來源、作者等版權(quán)信息的目的。與傳統(tǒng)加密技術(shù)不同,圖像水印技術(shù)的目的并不在于直接阻止對圖像的盜版,而是著眼于如何將版權(quán)信息加入到正版圖像,并能夠從盜版圖像中提取出先期加人的版權(quán)方面的證據(jù)(水印),在能夠證明圖像確系盜版之后再以法律的手段對盜版者實施制裁。
圖像數(shù)字水印處理可分為對水印的嵌人處理和對已嵌人的水印的檢測處理兩部分。從圖像處理的角度看,嵌人水印可以看作是在強(qiáng)背景(原始圖像)下疊加一個弱信號(水?。捎谌说囊曈X系統(tǒng)對圖像的分辨率有限,因此只要疊加的信號在幅度上低于某個對比度門限,就可以使人眼完全感受不到疊加信號的存在,這個對比度門限主要受系統(tǒng)的空間、時間和頻率特征的影響。因此,在不改變視覺效果的前提下,對原始圖像做一定的調(diào)整,嵌入一些額外信息是完全有可能的。
由于圖像數(shù)字水印的目的不在于限制其正常的圖像復(fù)制,而在于保證隱藏其內(nèi)的水印不被侵犯和發(fā)現(xiàn)。因此,在向圖像嵌人水印時。必領(lǐng)考慮到正常的信息操作對水印所造成的威脅,以及要求水印能夠?qū)νǔ5膱D像編輯操作具有一定的抵御、免疫能力。根據(jù)圖像水印的目的和技術(shù)要求,可以總結(jié)出圖像水印的一些特點。
①魯棒性 (robustness):圖像一旦嵌人了水印后,圖像與水印將緊密地融合在一起,而且不因因像的某種處理而導(dǎo)致隱含的水印信息丟失。這里所謂的“處理”,包括了噪聲干擾、濾波、平滑、增強(qiáng)、重采樣、有損編碼壓縮、D/A 或 A/D轉(zhuǎn)換等各種常規(guī)的圖像處理手段。圖像水印除了能對無意識的圖像處理操作具有抵御能力外,還應(yīng)具各抵?jǐn)_惡意刪除攻擊、逃惑攻擊等有意識政擊的能力,除非攻擊方對加人的水印有足夠的先驗知識,否則任何破壞和去除水印的企圖都將嚴(yán)重?fù)p壞因像的面質(zhì),使破解后的圖像毫無利用價值。
②不可檢測性(undetectability):水印和圖像應(yīng)具有一致的特性,如統(tǒng)計噪聲分布等,這樣可以使非法攻擊者無從確認(rèn)該圖像是否含有水印信息。
③透明性 (invisibility):此特性主要應(yīng)用了人眼的生理特點,經(jīng)過隱藏處理的圖像水印不會對原始圖像有視覺可察的畫質(zhì)降低現(xiàn)象。
④低復(fù)雜性:水印的嵌人和提取識別算法應(yīng)簡單易行。
⑤自恢復(fù)性:嵌入了水印的圖像在經(jīng)過一系列的處理和變換后,可能對原圖產(chǎn)生了較大的破壞,這就要求從留下的片段中仍可提取出水印(或水印殘片),并根據(jù)檢驗出的結(jié)果確認(rèn)出水印的存在。
三、算法介紹
3.1 數(shù)字水印嵌入
以一副512X512大小的lena灰度圖像和64X64大小的水印灰度圖像為例說明水印嵌入的具體步驟:
第一步,對512X512的原始圖像I系數(shù)矩陣分成8X8大小的塊,則原圖一共被分成64X64塊。對每個塊進(jìn)行二維離散余弦變換(DCT)。
第二步,原圖就變成了64X64個8X8大小的系數(shù)矩陣,正好64X64大小的水印圖像J中矩陣的每個系數(shù)對應(yīng)于原始圖像的每個塊,水印的嵌人利用公式:F’ (u,v)=F(u,v)+aw(i) ,其中F(u,v)為原始圖像的DCT系數(shù),a為嵌入強(qiáng)度,w(i)(i=1,2,3,…)是每點的水印像素。
第三步,對這64X64塊嵌入水印信息的矩陣做二維DCT逆變換,再合并成一個整圖,就得到了嵌入水印后的圖像。
代碼如下:
%讀入原始圖像和水印圖像并顯示 I=imread('lena512.jpg'); figure(1); subplot(2,2,1); imshow(I); title('原始圖像'); J=imread('xiaohui64.jpg'); subplot(2,2,2); imshow(J); title('水印圖像'); %對水印圖像進(jìn)行arnold置亂預(yù)處理 H=double(J); tempImg=H; %圖像矩陣賦給tempImg for n=1:5 %置亂次數(shù) for u=1:64 for v=1:64 temp=tempImg(u,v); ax=mod((u-1)+(v-1),64)+1;%新像素行位置 ay=mod((u-1)+2*(v-1),64)+1;%新像素列位置 outImg(ax,ay)=temp; end end tempImg=outImg; end G=uint8(outImg);%得到置亂后的水印圖像 %嵌入水印 for p=1:64 for q=1:64 %p、q都是1到64,是因為有64*64個8*8的塊,每次循環(huán)處理一個塊 BLOCK1=I(((p-1)*8+1):p*8,((q-1)*8+1):q*8);%每個8*8的塊 BLOCK1=dct2(BLOCK1);%做2維的DCT變換 BLOCK1(4,5)=BLOCK1(4,5)+0.2*G(p,q);%在每塊DCT系數(shù)的4行5列處嵌入水印,系數(shù)可調(diào) W(((p-1)*8+1):p*8,((q-1)*8+1):q*8)=idct2(BLOCK1);%做DCT反變換 end end %顯示嵌入水印后的圖像 imwrite(uint8(W), 'lena_mark.jpg ', 'jpg'); subplot(2,2,3); imshow('lena_mark.jpg'); title('嵌入水印后的圖像');
上圖中0.2為可調(diào)參數(shù)嵌入強(qiáng)度系數(shù),可以發(fā)現(xiàn),隨著嵌入強(qiáng)度的增大,嵌入水印后的圖像效果越來越差。
3.2 數(shù)字水印提取
水印的提取是根據(jù)水印的嵌入策略執(zhí)行相應(yīng)的逆過程來提取水印。因此,在水印提取過程中,只須將嵌人水印后的圖像塊經(jīng)DCT變換后的系數(shù)減去相應(yīng)強(qiáng)度的水印信息就可以提取出嵌人該塊的水印信息,再對所有塊提取出來的水印信息進(jìn)行反置亂就得到提取出來的水印圖像。
水印提取的具體步驟如下:
第一步,讀入嵌入水印后的圖像W和原始水印圖像I。
第二步,分別對W和I進(jìn)行分塊DCT變換,得到每個塊的系數(shù)矩陣。
第三步,對每個8X8塊的中頻系數(shù)位置上,利用公式
計算出每一塊的水印信息,合并成一個整圖,就得到了提取出來的水印圖像。
代碼如下:
for p=1:64 for q=1:64 BLOCK1=W(((p-1)*8+1):p*8,((q-1)*8+1):q*8); BLOCK2=I(((p-1)*8+1):p*8,((q-1)*8+1):q*8); BLOCK1=dct2(BLOCK1); BLOCK2=dct2(BLOCK2); Y(p,q)=(BLOCK1(4,5)-BLOCK2(4,5))/0.2; end end % 對水印進(jìn)行arnold反置亂 for n=1:43 % 循環(huán)次數(shù)為48-5 for u=1:64 for v=1:64 temp1=Y(u,v); bx=mod((u-1)+(v-1),64)+1; by=mod((u-1)+2*(v-1),64)+1; outImg1(bx,by)=temp1; end end Y=outImg1; end %顯示提取出來的水印圖像 imwrite(uint8(Y), 'watermark.jpg ', 'jpg'); subplot(2,2,4); imshow('watermark.jpg'); title('提取出來的水印圖像');
四、程序?qū)崿F(xiàn)
程序運行結(jié)果如下:
到此這篇關(guān)于Matlab中圖像數(shù)字水印算法的原理與實現(xiàn)詳解的文章就介紹到這了,更多相關(guān)Matlab圖像數(shù)字水印算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++基礎(chǔ)算法動態(tài)DP解決CoinChange問題
這篇文章主要為大家介紹了c++基礎(chǔ)算法如何利用動態(tài)DP來解決Coin Change的問題示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)五子棋對戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05