導航:首頁 > 源碼編譯 > 空域水印演算法

空域水印演算法

發布時間:2023-06-16 15:25:16

⑴ 什麼是LSB演算法

LSB(LeastSignificant Bits)演算法:將秘密信息嵌入到載體圖像像素值的最低有效位,也稱最不顯著位,改變這一位置對載體圖像的品質影響最小。

基本原理:
對空域的LSB做替換,用來替換LSB的序列就是需要加入的水印信息、水印的數字摘要或者由水印生成的偽隨機序列。由於水印信息嵌入的位置是LSB,為了滿足水印的不可見性,允許嵌入的水印強度不可能太高。然而針對空域的各種處理,如遊程編碼前的預處理,會對不顯著分量進行一定的壓縮,所以LSB演算法對這些操作很敏感。因此LSB演算法最初是用於脆弱性水印的。

LSB演算法基本步驟:

1.將得到的隱藏有秘密信息的十進制像素值轉換為二進制數據;

2.用二進制秘密信息中的每一比特信息替換與之相對應的載體數據的最低有效位;

3.將得到的含秘密信息的二進制數據轉換為十進制像素值,從而獲得含秘密信息的圖像。

%信息嵌入
Picture=imread(『c:\test.tif』);
%讀入載體圖像
Double_Picture=Picture;
Double_Picture=double(Double_Picture);
%將圖像轉換為二進制
『c:\test.txt』_id=fopen(『c:\test.txt』,'r');
%讀取秘密信息文件
[msg,len]=fread(『c:\test.txt』_id,'ubit1');
[m,n]=size(Double_Picture);
p=1;
%p為秘密信息的位計數器
forf2=1:n
forf1=1:m
Double_Picture(f1,f2)=Double_Picture(f1,f2)-mod(Double_
Picture(f1,f2),2)+msg(p,1);
%將秘密信息按位隱藏入連續的像素中
ifp==len
break;
end
p=p+1;
end
ifp==len
break;
end
end
Double_Picture=uint8(Double_Picture);
imwrite(Double_Picture,『c:\result.tif』);
%生成秘密信息
subplot(121);imshow(Picture);title('未嵌入信息的圖片');
subplot(122);imshow(Double_Picture);title('嵌入信息的圖片');

%信息提取
Picture=imread(『c:\result.tif』);
%讀入隱秘信息的圖像
Picture=double(Picture);
[m,n]=size(Picture);
frr=fopen(『c:\result.txt』,'a');
len=8;
%設定隱秘信息長度
p=1;
forf2=1:n
forf1=1:m
ifbitand(Picture(f1,f2),1)==1
%順序提取圖像相應像素LSB的秘密信息
fwrite(frr,1,'bit1');
result(p,1)=1;
else
fwrite(frr,0,'bit1');
result(p,1)=0;
end
ifp==len
%判斷秘密信息是否讀完
break;
end
p=p+1;
end
ifp==len
break;
end
end
fclose(frr);

⑵ 大蝦幫幫我關於 數字水印 !!

三、應用:數字水印

消息認證與數字簽名可以應用到數字水印中。

傳統水印用來證明紙幣或紙張上內容的合法性,數字水印(digital watermark)用以證明一個數字產品的擁有權、真實性。數字水印是嵌在數字產品中的數字信息。可以是作者的序列號、公司標志、有特殊意義的文本等。

數字水印主要用於:阻止非法復制(間接的)、確定所有權(作者、發行人、分發商、合法的最終用戶)、確定作品的真實性和完整性(是否偽造、被篡改)、證實收件人、不可否認的傳送、法庭證據的驗證、贗品甄別、識別文件來源與版本、Web網路巡邏監視盜賊等。

傳統水印是人眼可以看得見的,而數字水印可以分為可感知的(Perceptible)和不易感知的(Inperceptible)兩種。

可感知的數字水印,主要用於當場聲明對產品的所有權、著作權及來源,起到一個宣傳廣告或約束的作用。可感知水印一般為較淡的或半透明的不礙觀瞻的圖案;比如電視台節目播放的同時,在某個角落插上電視台的半透明標志。另一個用途是為了在線分發作品,比如先將一個低解析度的有可見水印的圖像免費送人,其水印往往是擁有者或賣主的信息,它提供了尋找原高解析度作品的線索,若想得到高解析度的原作品則需付費。有些公司在產品出售前為了在網路上宣傳其產品,先做上可逆可見水印分發,付費購買時,再用專用軟體將可見水印去掉,加入不可見水印(發行人、分發商、最終用戶等的信息)。可見水印還有另一些用途,那就是為了節約帶寬、存儲空間等原因,在VCD、DVD等電影拷貝中用嵌入不可見水印的方式配上多種語言的副標題和字幕,待播放時由硬體根據需要實時地解出每一幀中的水印文字,將其顯示在屏幕上。

可見水印在某些產品中或多或少降低了作品的觀賞價值,使其用途相對受到一定限制。不易感知的水印的應用層次更高,製作難度更大。

不易感知的數字水印就像隱形墨水技術中的看不見的文字,隱藏在數字產品中。水印的存在要以不破壞原數據的欣賞價值、使用價值為原則。數字水印按照某種方式植入被保護的信息中,在產生版權糾紛時,通過相應的演算法提取出該數字水印,從而驗證版權的歸屬。被保護的信息可以是圖像、聲音、視頻或一般性的電子文檔等。為了給攻擊者增加去除水印的難度,大多數水印製作方案都在水印的嵌入、提取時使用密鑰。

圖5.7水印的嵌入與提取

數字水印技術雖然不能阻止盜版活動的發生,但它可以判別對象是否受到保護,監視被保護數據的傳播、真偽鑒別和非法拷貝、解決版權糾紛並為法庭提供證據。

數字水印的設計需要考慮以下幾個方面:

魯棒性:是指被保護的信息經過某種改動後抵抗隱藏信息丟失的能力。例如傳輸過程中的信道噪音、濾波操作、重采樣、有損編碼壓縮、D/ A或 A/ D轉換、圖像的幾何變換(如平移、伸縮、旋轉、剪裁等)。

不可檢測性(不可見性):是指隱蔽載體與原始載體具有一致的特性。如具有一致的統計雜訊分布等,以便使非法攔截者很難判斷是否有隱蔽信息。

透明性:是指經過一系列隱藏處理後,原始數據沒有明顯的降質現象。

安全性:要求隱藏演算法有較強的抗攻擊能力(篡改、偽造、去除水印),使隱藏信息不會被破壞。如不因文件格式轉換而丟失水印,且未經授權者不能檢測出水印。

自恢復性:由於經過一些操作或變換後,可能會使原數據產生較大的破壞,如果只從留下的片段數據,仍能恢復隱藏信號,而且恢復過程不需要原數據,這就是自恢復性(自相似性)。

水印容量:水印容量和魯棒性之間是相互矛盾的。水印容量的增加會帶來魯棒性的下降,對不可見性也有影響。為抵抗各種變換,水印通常需要按照一定的排列方式反復加入多次,當水印容量大時重復次數只好減少,而魯棒性不好就會導致檢測結果的不可靠。

數字水印技術有多種分類。

按作用可劃分為魯棒水印和脆弱水印。前者主要應用於數字作品中標志著作版權信息,需要嵌入的水印能夠抵抗常見的編輯處理和有損壓縮;後者主要用於完整性保護,判斷信號是否被篡改。

按水印的載體可分為圖像水印、視頻水印、音頻水印、文本水印和印刷水印等。

按檢測方法可分為明水印和盲水印。在檢測過程中需要原數據的技術稱為明水印,其魯棒性較強;在檢測過程中不需要原數據的技術稱為盲水印。

按內容可分為內容水印和標志水印。內容水印是指水印經過攻擊受損後人們仍能通過感覺判斷內容;標志水印是指通過檢測判斷來確定信號中是否有水印標志。

按用途可分為版權保護水印、篡改提示水印、票據防偽水印、隱蔽標識水印、印刷數字水印等。

數字水印其內容可以是任何具有代表意義的信息,如圖像、文字、數字、符號等,為了便於隱藏,水印的體積越小越好。用文本作為水印信息是較好的選擇,既節約空間又能直讀出其含義。數字水印主要應用在版權保護、加指紋、標題與注釋、篡改提示、使用控制等領域。

版權保護:即數字媒體的所有者可用密鑰產生一個水印,並將其嵌入原始數據,然後公開發布他的水印版本作品。數字媒體包括音像製品、數字廣播、DVD、MP3等。當該作品被盜版或出現版權糾紛時,所有者即可從盜版作品或水印版作品中獲取水印信號作為依據,從而保護所有者的權益。

版權跟蹤:為避免未經授權的拷貝製作和發行,出品人可以將不同用戶的ID或序列號作為不同的水印嵌入作品的合法拷貝中,稱為數字指紋。其目的是通過授權用戶的信息來識別數據的發行拷貝,監控和跟蹤使用過程中的非法拷貝。一旦發現未經授權的拷貝,就可以根據此拷貝所恢復出的指紋來確定它的來源。

標題與注釋:即將作品的標題、注釋等內容以水印形式嵌入該作品中,這種隱式注釋不需要額外的帶寬,且不易丟失。如在遙感圖像等信息中隱藏日期、經緯度等。

篡改提示:當數字作品被用於法庭、醫學、新聞及商業時,常需確定它們的內容是否被修改、偽造或特殊處理過。為實現該目的,通常可將原始圖象分成多個獨立塊,再將每個塊加入不同的水印。同時可通過檢測每個數據塊中的水印信號,來確定作品的完整性。與其他水印不同的是,這類水印必須是脆弱的,並且檢測水印信號時,不需要原始數據。

使用控制:這種應用的一個典型的例子是DVD防拷貝系統,即將水印信息加入DVD數據中,這樣DVD播放機即可通過檢測DVD數據中的水印信息而判斷其合法性和可拷貝性。從而保護製造商的商業利益。

典型數字水印演算法包括以下幾種演算法。

空域演算法:此演算法首先把一個密鑰輸入一個m-序列發生器來產生水印信號,然後排列成2維水印信號,按象素點逐一嵌入到原始圖象最不重要的像素位棗最低位(LSB:least significant bits)。這可保證嵌入的水印是不可見的。但是由於使用了圖像不重要的像素位,演算法的魯棒性差,水印信息很容易為濾波、圖像量化、幾何變形的操作破壞,因此不夠強壯。

文本水印演算法:通過輕微改變字元間距,行間距或是增加、刪除字元特徵如底紋線等方法來嵌入水印。或是在符號級或語義級加入水印,例如,可以用big替換文本中的large。

基於改變圖象數據統計特性的水印演算法:Patchwork演算法首先隨機選取N對象素點,然後通過增加象素對中一個點的亮度值,而相應降低另一個點的亮度值。這樣整個圖像的平均亮度保持不變。適當地調整參數,Patchwork方法對JPEG壓縮、FIR濾波以及圖像裁剪有一定的抵抗力,但該方法嵌入的信息量有限。

頻域演算法:它是利用一個信號可以掩蓋另一個較弱的信號這一頻率掩蓋現象。圖象的頻域空間中可以嵌入大量的比特而不引起可察的降質,當選擇改變中頻或低頻分量(除去直流分量)來加入水印時,強壯性可大大提高。頻域水印技術可以利用通用的離散餘弦變換,小波變換和傅立葉變換等變換方法。其優點是隱藏效果好,人眼不能發覺與原始圖象間的差別;使用密鑰控制,只有知曉偽裝密鑰的人才能解密;可以有效的抵抗剪切及JEPG等有損壓縮編碼;水印圖象可以是灰度圖象。但該類演算法的隱藏和提取信息操作復雜,隱藏信息量不能很大。

壓縮域演算法:水印檢測與提取直接在壓縮域數據中進行。把水印信號加到表示視頻幀的數據流中去。MPEG-2數據流可分為數據頭信息、運動向量(用於運動補償)和DCT編碼信號塊3部分,該演算法只有DCT編碼信號塊被改變。首先對DCT編碼數據塊中每一輸入的Huffman碼進行解碼和逆量化,以得到當前數據塊的一個DCT系數;其次,把相應水印信號塊的變換系數與之相加,從而得到水印疊加的DCT系數,再重新進行量化和Huffman編碼,最後對新的Huffman碼字的位數n1與原來的無水印系數的碼字n0進行比較,只在n1不大於n0的時候,才傳輸水印碼字,否則傳輸原碼字,這就保證了不增加視頻數據流位率。該方法中水印信號的引入是一種引起降質的誤差信號,而基於運動補償的編碼方案會將一個誤差擴散和累積起來,為解決此問題,該演算法採取了漂移補償的方案來抵消因水印信號的引入所引起的視覺變形。

NEC演算法:該演算法由NEC實驗室的COX等人提出,在數字水印演算法中佔有重要地位。COX認為水印信號應該嵌入源數據中對人的感覺最重要的部分。在頻譜空間中,這種重要部分就是低頻分量。這樣,攻擊者在破壞水印的過程中,不可避免地會引起圖象質量的嚴重下降。水印信號應該由具有高斯分布的獨立同分布隨機實數序列構成。這使得水印經受多拷貝聯合攻擊的能力大大增強。實現方法是:首先以密鑰為種子來產生偽隨機序列,該序列具有高斯N(0,1)分布,密鑰一般由作者的標識碼和圖象的哈希值組成,對整幅圖象做DCT變換,用偽隨機高斯序列來調制(疊加)該圖象除直流分量(DC)外的1000個最大的DCT系數。該演算法具有較強的魯棒性、安全性、透明性等。

生理模型演算法:人的生理模型包括人類視覺系統HVS(HumanVisualSystem)和人類聽覺系統HAS。利用視覺模型的基本思想是利用從視覺模型導出的JND(Just Noticeable Difference)描述來確定在圖象的各個部分所能容忍的數字水印信號的最大強度,從而能避免破壞視覺質量。也就是說,利用視覺模型來確定與圖象相關的調制掩模,然後再利用其來插入水印。這一方法同時具有好的透明性和強健性。

數字水印在版權標識、隱藏標識和篡改提示、數據防偽上具有不可替代的作用,它將在商業、金融、軍事和個人消費上帶來巨大的商業利潤。自1995年以來,該領域的研究工作已經取得了巨大的進展。隨著數字水印技術的日趨成熟,數字水印技術將在電子商務、視頻點播、遠程教學和遠程培訓中發揮越來越大的作用。

⑶ 怎麼用matlab從含有水印的圖像中提取出水印

3 視頻水印的嵌入和檢測方案
3.1水印的預處理
採用二值圖像作為待嵌入的水印數據,本文針對的研究對象因為是二維圖像故採用的是二維Arnold變換。
二維Arnold變換定義為:
(3-1)
其中,(x,y)是原圖像的像素點,(x』,y』)是變換後新圖像的像素點,N是圖像階數,即圖像的尺寸大小,一般多為正方形圖像。由於Arnold變換具有周期性,因此可利用其周期性Period來對圖像進行反變換。即在水印嵌入過程中可將水印置亂次數作為密鑰times,再進行水印嵌入,當水印提取出來時,再將其繼續: (Period-times)次即可使其恢復至原圖。這就是利用Arnold的正變換來進行的置亂恢復方案。Arnold變換次數由版權所有者保管。
對水印進行置亂有以下優點:
(1) 採用置亂技術的合法者可以自由控制演算法的選擇,參數的選擇以及使用隨機數技術,從而使非法使用者難以破譯圖像內容,可以提高水印信息的安全性;
(2) 置亂技術可以分散錯誤比特的分布,提高數字水印的視覺效果,從而增強其魯棒性。
3.2 視頻水印的嵌入
水印嵌入演算法關鍵在於以下三點:
(1) 水印的結構;
(2) 水印的嵌入區域;
(3) 嵌入技巧;
本文選取二值圖像作為水印。為了提高水印的魯棒性,大多數的DCT域水印演算法把水印信號嵌入到DCT系數的低頻部分。但低頻區域是圖像的能量集中部分,嵌入到低頻會降低透明性。而嵌入在高頻雖然透明性比較好,但對大多數的圖像處理對高頻成分影響較大,從而降低水印的魯棒性.於是大多數的水印演算法將水印信號嵌入在載體圖像DCT系數的中頻部分,以達到透明性和魯棒性的最佳折衷。各種嵌入技巧的最終目的還是為了盡量地提高水印的魯棒性和透明性。
用於版權保護的數字水印在盡量提高魯棒性的同時還要滿足人類的視覺極限,因此必須根據HVS找到嵌入位置。
本文將HVS歸納為運動敏感性、紋理敏感性和亮度敏感性。在接下來的嵌入過程中,充分利用了這些特性。如圖3-1中間分支所示。
嵌入過程如圖3-1所示。

圖3-1 水印嵌入過程
從視頻中讀取亮度分量Y,因為它是最有效的數據,根據NEC演算法,嵌入到它裡面的水印才具有最強的魯棒性。根據式(3-2)所示的運動敏感性閾值計算公式,尋找32幀滿足敏感性比較大的視頻幀Yi (i=1,2,…32)。
(3-2)
其中 (t代表當前幀的編號)
接下來,將Y32中的數據按照64*64的尺寸切分成20塊BYij (j=1,2,…20),於是我們可得到20塊尺寸為64*64*32的三維數據塊BYk (k=1,2,…20),如圖2-3所示。

圖3-2 亮度分量的分塊
根據式(3-3)、式(3-4)所示的亮度敏感性Lk和紋理敏感性Dk計算公式,通過計算,我們選擇計算值都比較高的20塊數據中的一塊 ( )作為水印的嵌入塊。
(3-3)

(3-4)
其中, 是BYk中的亮度數據, 。
最後,折衷考慮復雜度和性能,我們對選定的一塊數據塊 實施了2階三維DCT變換。根據NEC演算法的思想,且為了抵抗濾波和壓縮攻擊,我們將置亂後的水印序列嵌入到了第一幀DCT系數c(u,v)中,詳見式(3-5)。
(3-5)
其中,w(u,v)是水印序列中的數據,c(u,v)是DCT變換後第一幀中的系數,c』( u,v)是嵌入水印後的系數,S是非負整數(且滿足T1=S/4, T2=3*T1)。
嵌入完成後,對c』(u,v)實施反2階三維DCT變換就得到了嵌入水印後的視頻數據,再將它們放回原來的位置即可。
需要說明的是,在整個嵌入過程中,所有用到的參數都應作為密鑰保留。
具體方案如下所述:
第一步:抽取32幀視頻Y分量數據:
(1) 讀取視頻文件;
(2) 提取所有的Y分量,把所有的Y分量分為32組;
(3) 每組4幀,從各組中選出一個最運動敏感的,判斷每組中最大的Y_deltmax,存入變數m;
(4) 定位最大的Y_deltmax,存入變數w;
Y32是就是所需的視頻幀中Y分量滿足敏感性的32幀視頻 (355*288*32)。
第二步:分塊過程:
(1) 對行分塊(4塊);
(2) 對列分塊(5塊);
(3) 隔十幀取一幀,共從32幀中取4幀以降低運算量;
(4) 一個數一個數的賦值;
切成20塊,每塊為64*64*4的數據塊BY,維數不同,只能逐個象素賦值。
第三步:根據公式計算數據塊BY的亮度敏感性L和紋理敏感性D
第四步:選取L和D都比較大的一塊嵌入水印
(1) 判斷最大的L,存入變數Lm;
(2) 去掉這個最大的塊再比較;
(4) 賦第一塊的L的權重為20;
(5) 計算第2塊到第20塊的L的權重;
(6) 同理對D進行處理;
(7) 計算每塊BY的權重;
(8) 對所有的20塊BY的權重qz按由小到大的順序進行排序,並保持原來的位置索引index,則index[20]就是所要選取的塊;
第五步:三維DCT變換
由於視頻是由圖像數據流組成的,所以可以把視頻的每一幀看作是一幅靜止的圖像。對運動圖像序列進行3D-DCT,可以視為先對視頻的每一幀進行2D-DCT,再對幀間方向進行1D-DCT。
第六步:嵌入水印數據
將置亂的水印序列嵌入所選的DCT系數中,即嵌入經過3D-DCT變換後的數據塊中的第一幀數據中。然後把這些數據進行反3D-DCT變換後放回原位置。
第七步:將所選的數據放回原位置
最後一步:寫視頻文件
3.3視頻水印的檢測
水印提取是嵌入的逆過程,本演算法的一大優勢是,水印提取時無需原始視頻數據的參與,但依然需要一些參數。它們是:
(1) 嵌入過程第四步產生的塊BY的排序結果,由此我們可以得知水印的大致嵌入位置;
(2) 嵌入時指定的參數S;
(3) 需要Arnold變換的次數和周期;
獲得了上面的各項參數,水印的提取就十分簡單,具體過程如圖3-3所示。

圖3-3 水印盲提取過程
方案如下:
從待提取水印的視頻數據 (可能是被攻擊過後的視頻)中抽取出亮度分量Y』,根據密鑰,抽出32幀中的四幀亮度分量 ,然後分別從這組數據中提取水印。
在圖3-3中,首先將 分隔成20塊 ,並找到和 對應的 。然後,對 做二階三維DCT變換,根據式(3-6)提取出水印數據 。
(3-6)
其中, 是DCT系數。
最後,我們將 進行Arnold變換,得到水印圖像,作為最終提取出的水印。
具體步驟如下所述:
第一步:抽取32幀視頻Y分量數據:
(1) 讀取嵌入水印圖像的視頻文件;
(2) 提取所有的Y分量,把所有的Y分量分為32組;
(3) 每組4幀,從各組中選出一個最運動敏感的,判斷每組中最大的Y_deltmax,存入變數m;
(4) 定位最大的Y_deltmax,存入變數w;
Y32是就是所需的視頻幀中Y分量滿足運動敏感性的32幀視頻,Y32是一個355*288*32的三維數組。
第二步:分塊過程:
(1) 對行分塊(4塊);
(2) 對列分塊(5塊);
(3) 隔十幀取一幀,從32幀中共取4幀以降低運算量;
(4) 一個數一個數的賦值;
切成20塊,每塊為64*64*4的數據塊BY,維數不同,只能逐個象素賦值。
經過計算其亮度敏感性和紋理敏感性並排序,index[20]就是本文演算法中嵌入水印的塊;
第三步:三維DCT變換
第四步:Arnold變換
由於本演算法中水印圖像是二值圖像,其Arnold變換是二維變換,周期是Period,嵌入水印時變換了times次,所以此處只需變換(Period-times)次就可得到結果。
第五步:寫圖像文件
提取水印圖像數據並寫成圖像文件
第六步:檢測水印圖像存在與否,並與原水印圖像比較。
最後一步:進行實驗,驗證本文演算法的可見性和魯棒性。
經過以上步驟就是水印圖像信息嵌入視頻中的方法,具體實現過程見第四章。

4 用MATLAB實現視頻水印的嵌入和檢測
Matlab是近年來在國內外廣泛流行的一種可視化科學計算軟體。它的特點是結構簡單、數值計算高效、圖形功能完備、圖像處理方便,是國際公認的最優秀的科學計算與數學應用軟體之一。利用Matlab實現數字水印圖像演算法便捷、高效,省去了繁瑣的程序代碼,避免了科研人員在編程上浪費精力。
其內容已涉及矩陣代數、微積分、應用數學、信號與系統、神經網路、小波分析及應用、數字圖像處理、計算機圖形學、自動控制與通信技術等諸多方面,是科學計算、系統模擬、信號與圖像處理的主流軟體,受到了各方科研人員的青睞,在數字水印技術中得到了廣泛的應用。將Matlab應用於數字水印技術,其優點主要有以下幾個方面:
(1) 強大的數值計算功能
視頻水印技術是針對圖像進行研究的,而圖像是由矩陣表達的,將水印嵌入視頻中及從視頻中將水印提取出來都意味著大量的矩陣運算,而矩陣運算更是Matlab語言的核心,表達自然、直接。因此,利用Matlab強大的矩陣運算功能來實現圖像水印技術非常合適。
(2) 方便的圖像讀取和顯示功能
視頻水印首先要將數據從視頻中讀取出來,嵌入水印後還要將嵌入水印後的數據還原為視頻。Matlab為用戶提供了專門的圖像處理函數,用於讀寫顯示圖像數據。這種方法不像其他編程語言那樣,需要編寫復雜的代碼,只需要簡單地調用Matlab提供的函數即可,相關的函數及其功能主要有下列一些:
imread 將圖像讀入工作空間;
imwrite 將圖像寫入磁碟;
image 提供最原始的圖像顯示函數;
imshow 是最常用的顯示各種圖像的函數;
load將文件讀入工作空間;
(3) 高效的圖像變換功能
數字水印嵌入演算法一般分空域方法和頻域方法。空域方法指通過改變象素的亮度值來加入數字水印:頻域方法指圖像通過某種變換後再嵌入數字水印。與空域法相比,頻域法具有如下優點:在變換域中嵌入的水印信號可以分布到空域的所有象素上,有利於保證水印的不可見性。在變換域中,視覺系統的某些特性(如視頻特性)可以更方便地結合到水印編碼過程中。變換域的方法可以與國際數據壓縮標准兼容,從而實現壓縮域內的水印編碼。因此,變換域的方法應是水印演算法未來趨勢的主流。但是變換域的演算法一般來講計算量都比較大,需要復雜的編程運算,Matlab則改變了這種現狀。在Matlab圖像處理工具箱中,提供了常用的圖像變換函數,復雜的變換域演算法在Matlab中只需簡單地調用函數即可實現,充分體現了使用Matlab的簡便性和高效性。
主要圖像變換函數如下:
dct是一維離散餘弦變換;
idct是一維離散餘弦逆變換;
dct2是二維離散餘弦變換;
idct2是二維離散餘弦逆變換;
(4) 豐富的圖像處理函數
水印技術要求嵌入的水印不可見且有較強的魯棒性。不可見性可通過視覺效果和計算圖像的峰值信噪比來比較優劣,而魯棒性則要對水印後圖像進行各種攻擊,通過比較攻擊後圖像提取出的水印情況來說明問題。Matlab有各種圖像處理函數,可實現對圖像的各種攻擊。
綜上所述,Matlab具有語言簡潔、函數豐富、使用方便、數值計算高效等特點,將功能強大的Matlab軟體應用於數字水印技術是有效的選擇,因此,本文採用Matlab對圖像水印進行研究。
4.1水印的嵌入過程
(1) 基於Arnold變換的圖像置亂
Matlab實現如下:
Arnold變換由function r=Arnold(w0,row,colum,times) 實現,其中w0為讀取的圖像數據,row是行數,colum是列數,times是Arnold變換次數。
function r=Arnold(w0,row,colum,times)
for k=1:times
for i=1:row
for j=1:colum
i1=i+j;
j1=i+2*j;
if i1>row
i1=mod(i1,row);
end
if j1>colum
j1=mod(j1,colum);
end
if i1= =0
i1=row;
end
if j1= =0
j1=colum;
end
w1(i1,j1)=w0(i,j);
end
end
w0=w1;
end
r=w0;
用imwrite(w0,'Arnold.bmp', 'bmp')寫置亂後的圖像文件;在MATLAB中用imshow('Arnold.bmp')顯示此圖像。
本文採用二維的二值水印圖像watermark.bmp,我們將圖像數據(64*64)掃描到二維的矩陣中並實施Arnold變換,從而得到置亂後的二維矩陣。隨著迭代次數的增加,圖像逐漸趨於混亂,不過到一定次數時,又將回到原圖。因為watermark.bmp大小為64*64,故經過試驗圖像迭代48次後將回到原圖,即周期性Period=48。
本演算法選擇置亂8次,因為8次Arnold變換後原水印圖像已經成為無形狀的圖像。實驗結果表明,該方法能較好地刻劃圖像的置亂程度,與人的視覺基本相符。但需要指出的是不一定圖像的置亂次數越多其置亂度就越高。所以,在水印嵌入時,為了提高其魯棒性而增加置亂次數的方法是不科學的,合理的做法是計算置亂後圖像的置亂度,達到較為滿意的置亂度後就可停止置亂,避免盲目的提高置亂次數。
置亂次數作為密鑰有視頻版權所有者保管,如果非法所有者不知道置亂次數就很難恢復出原水印圖像。
原水印圖像如圖4-1所示,本演算法實現置亂8次後效果如圖4-2所示:

圖4-1 水印原圖像 圖4-2 置亂8次後
(2)Matlab實現嵌入過程:
本文中選取352×288×142的yuv格式視頻流進行測試。YUV顏色模型是一種常用的顏色模型,其基本特徵是將亮度信號與顏色信號分離,由於人眼對亮度的變化比對顏色的變化敏感,因此,YUV模型中Y分量的值所佔帶寬大於等於彩色分量所佔帶寬。YUV色彩空間模型可以在一定程度上避免RGB模型的高分散性和高相關性所帶來的閉值劃分問題,計算也較為簡單。這種色彩空間模型中Y和UV分量是相互獨立的,反映了人眼觀察彩色的視覺規律,在實際中應用較多。其中「Y」表示明亮度(Luminance或Luma),也就是灰階值;而「U」和「V」表示的則是色度(Chrominan「或Chroma),作用是描述影像色彩及飽和度,用於指定像素顏色。因此選擇YUV顏色空間更加穩定,易於分析。
本文選擇測試視頻中的第39幀如圖4-3所示。YUV格式的視頻中Y:U:V=4:2:2,但通俗叫「420」格式。

圖4-3 未嵌入水印的視頻
第一步:讀取文件;
讀取視頻文件由[yuv,Y,u,v,num_f]=loadyuv(filename)實現,filename是所選取得視頻文件名稱。yuv是一個四維數組,它返回的是視頻的yuv分量,Y是亮度分量,u和v是色彩分量,num_f是視頻文件中所有幀的數目。
讀取一幀數據的YUV分量在Matlab中由以下源代碼實現:
function [YUV,Y,U,V] = loadFileYUV(width,heigth,Frame,fileName,format)
[Teil_h,Teil_b]=YUVFormat(format);
fileId = fopen(fileName,'r');
其中width:每一幀的寬度;heigth:每一幀的高度;Frame:當前load的那一幀;filename:視頻文件名;Teil_h:垂直比例參數;Teil_b:水平比例參數;YUV:返回值,返回YUV分量,是一個三維變數,本文演算法中將U、V分量的寬度和高度設成與Y一樣的了,因此U、V分量中有重復的。YUV(:,:,1)存放Y分量;YUV(:,:,2)存放U分量;YUV(:,:,3)存放V分量;Y,U,V是三個分量的實際值,二維矩陣,沒有重復,他們的長度可能不一樣。
Y_delt(j)=delt(Y(:,:,w(i)),Y(:,:,4*(i-1)+j));
其中Y_delt是當前幀與下一組各幀的Y的差,m(i)=max(Y_delt(j));判斷每組中最大的Y_deltmax,存入變數m,以此來得到每組中最運動敏感的視頻幀。w(i+1)=4*(i-1)+k定位最大的Y_deltmax,存入變數w。
最後得到Y32=double(Y(:,:,w)), Y32是視頻幀中Y分量滿足敏感性的32幀視頻是一個355*288*32的三維數組。
第二步:分塊;
分塊時因為需要塊標號,由此造成維數不同,所以只能逐個象素賦值,在Matlab中由BY(t1,t2,t3,j*5+k+1)= double(Y32((64*j+t1),(64*k+t2),i))實現,切成20塊,每塊為64*64*4的數據塊BY ,其中t1是塊的杭坐標,t2是塊的列坐標,t3幀標號,j*5+k+1是快標號。
第三步:三維DCT變換;
運動圖像序列的每一幀可以看作是靜止圖像 對運動圖像序列進行3D DCT,可以視為先對每幀進行2D DCT,再對幀間方向進行1D DCT。
%對每一塊的幀間方向進行1D DCT變換
for i=1:64
for j=1:64
dcta(i,j,1:4,index(20))=dct(BY(i,j,1:4,index(20)));
end
end
%對每一塊的每一幀進行2D DCT
for i=1:4
dct3a(:,:,i,index(20))=dct2(dcta(:,:,i,index(20)));
end
第四步:嵌入水印過程;
讀入二值水印圖像由message=double(imread('watermark.bmp'))實現 ,message是一個由0和1組成的二維數組。
將置亂的水印序列嵌入所選的dct系數中,源代碼如下所示:
其中dct3a是DCT系數,index[20]是紋理敏感性和亮度敏感性都比較好的一塊,S作為密鑰由版權所有者保管。
S=60;
T1=S/4;
T2=3*T1;
for i=1:64
for j=1:64
if (w2(i,j)==1)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S)+T1;
end
if (dct3a(i,j,1,index(20))<0)
dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T1;
end
end
if (w2(i,j,:)==0)
if (dct3a(i,j,1,index(20))>=0)
dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20)),S)+T2;
end
if (dct3a(i,j,1,index(20))<0)
dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T2;
end
end
end
end
第五步:三維DCT反變換;
先對塊的第一幀進行二維DCT反變換,然後在對其它三幀進行二維反變換,最後對幀間方向進行一維DCT反變換。此過程由Matlab實現如下:
二維DCT反變換:
idcta(:,:,1,index(20))=idct2(dipin);
for i=2:4
idcta(:,:,i,index(20))=idct2(dct3a(:,:,i,index(20)));
end
對每一塊的幀間方向進行一維DCT反變換
for i=1:64
for j=1:64
idct3a(i,j,1:4,index(20))=idct(idcta(i,j,1:4,index(20)));
end
end
第六步:把這些數據放入原位置;
第七步:寫視頻文件;
寫視頻文件由以下程序實現,其中fileId為寫入視頻文件的位置。
fileId = fopen('vectra_w.yuv','wb')
fwrite(fileId,Y(:,:,i)' , 'uchar');
fwrite(fileId,u(:,:,i)' , 'uchar');
fwrite(fileId,v(:,:,i)' , 'uchar');
效果如圖4-4所示:

圖4-4 嵌入水印的視頻
4.2水印的檢測過程
水印的檢測過程就是嵌入水印的逆過程,其Matlab實現如下所示:
filename='vectra_w.yuv';此文件是對含有水印的視頻(可能是被攻擊過後的視頻)文件。
[yuv,Y,u,v,num_f]=loadyuv(filename);
讀取視頻文件和三維DCT正變換其原理和嵌入過程相同,此處不再贅述。
提取水印數據在Matlab中由以下程序實現,其中S、T1、T2等都是嵌入時的密鑰,版權所有者擁有它。
for i=1:64
for j=1:64
if (mod(abs(dct3b(i,j,1,index(20))),S)<((T1+T2)/2))
shuiyin(i,j)=1;
end
if (mod(abs(dct3b(i,j,1,index(20))),S)>=((T1+T2)/2))
shuiyin(i,j)=0;
end
end
end
Arnold反變換如下所示:
w0=shuiyin;
w2=Arnold(w0,Hm,Wm,40);
w0是檢測到的水印數據,Hm和Wm是水印數據的行和列,變換次數為40。
寫水印文件,檢測水印圖像存在與否,並且和原水印圖像有無差異。
imwrite(w2,'恢復.bmp', 'bmp');
imshow('恢復.bmp');
綜上,水印的嵌入主要經過將視頻和水印分別進行預處理,然後根據嵌入演算法選擇水印的合適嵌入位置以及合理嵌入策略,從而得到含水印的視頻數據。在各個環節中採用HVS特性來提高視頻水印的魯棒性.最後用相應的視頻水印檢測策略提取出水印從而實現視頻的保護。結果顯示本文演算法能成功提取出水印圖像

⑷ 圖像水印的LSB演算法,VC++代碼

因為8位像素值的最低位為1或0對整個像素值影響不大,LSB就是把水印信息放入這個最低位,同時保證原始圖像基本無變化

void CDib::Embed()//嵌入
{
unsigned char bmdata;//BMP圖像數據
unsigned char efdata;//嵌入的文件數據
int t = 7;
int x[8];
int s[8];
int last_bit; //記錄位元組最低位本來的bit

for(UINT i1 = 0, i2 = 0; i1 <= bitmap_size - 1, i2 <= embfile_size - 1; i1++)
{ //生產隱藏信息,並逐步嵌入到宿主圖像各像素的最低位上
bmdata = *p;//p指向圖像數據的每個像素,把當前像素值給bmdata

for (int j = 0; j <= 7; j++) //計算各bit位
{
x[j] = bmdata & 1;//提出bmdata最低位放入x[j]
bmdata >>= 1;//右移一位
}

last_bit = x[0];//原始圖像的最低位值存入last_bit中
x[0] = x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//使最低位值等於其他各位的異或

if (t == 7) //宿主圖片每走過八個位元組,計算一次s[]
{
efdata = *q;//q指向插入的水印數據
for (j = 0; j <= 7; j++)
{
s[j] = efdata & 1;//水印數據依次放入s[j]中
efdata >>= 1;//右移
}
}
x[0] ^= s[t];//隱藏信息,隱藏信息等於原圖像高六位的異或再和文件數據異或
if (last_bit == 0) //嵌入隱藏信息
{
*p |= x[0];//如果該像素原本最低位為0;則將最終得到的異或水印值放入原像素
}
else
{
*p &= 254 + x[0]; //如果該像素原本最低位為1;則將最終得到的異或水印值放入原像素
}

p++;//指向下一個像素
t--;//t用來定時每8個位元組插入一次完整的s
if (t == -1) //需要計算一次s[]
{
t = 7;
q++;//指向下一個作為待插入水印的文件數據
i2++;
}
}

}

void CDib::Pick()//提取
{
m_pFile = new unsigned char [embfile_size];//開辟等於插入文件數據大小的內存
unsigned char *q = m_pFile;//q指向該內存

unsigned char bmdata;//插入了水印的BMP圖像數據

int x[8];
int s[8];
int t = 7;
for (UINT i1 = 0, i2 = 0; i1 <= bitmap_size - 1, i2 <= embfile_size - 1; i1++)
{
bmdata = *p; //p指向插入了水印的圖像數據
for (int j = 0; j <= 7; j++) //計算各bit位
{
x[j] = bmdata & 1;//提取該圖像位元組的0~7位放入X[]數組
bmdata >>= 1;
}
s[t] = x[0] ^ x[1] ^ x[2] ^ x[3] ^ x[4] ^ x[5] ^ x[6] ^ x[7];//提取1~8個位元組中的s[]
t--;
if (t == -1) //s[7]到s[0]組成一個位元組
{
*q = s[7] * 128 + s[6] * 64 + s[5] * 32 + s[4] * 16 +
s[3] * 8 + s[2] * 4 + s[1] * 2 + s[0];//還原原始的圖像數據
t = 7;
i2++;
q++;
}
p++;//指向下一像素
}

}

閱讀全文

與空域水印演算法相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163