Ⅰ 如何利用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特性來提高視頻水印的魯棒性.最後用相應的視頻水印檢測策略提取出水印從而實現視頻的保護。結果顯示本文演算法能成功提取出水印圖像。
Ⅱ 求一個關於matlab的基於小波變換的圖像增強代碼
以下是一個基於小波變換的 MATLAB 圖像增強代碼示例:
% 讀入原始圖像
I = imread('lena.png');
% 將圖像轉換為灰度圖像
if size(I, 3) == 3
I = rgb2gray(I);
end
% 對圖像進行小波變換
[C, S] = wavedec2(I, 2, 'db4');
% 提取小波系數
H = wrcoef2('h', C, S, 'db4', 1);
V = wrcoef2('v', C, S, 'db4', 1);
D = wrcoef2('d', C, S, 'db4', 1);
% 將水平、垂直、對角小波系數合並
W = cat(3, H, V, D);
% 對小波系數進行增強
for i = 1:3
W(:, :, i) = adapthisteq(W(:, :, i), 'NumTiles', [8 8], 'ClipLimit', 0.005);
end
% 將增強後的小波系數合並
I_enhanced = waverec2(W, S, 'db4');
% 顯示原始圖像和增強後的圖像
subplot(1, 2, 1); imshow(I); title('原始圖像');
subplot(1, 2, 2); imshow(I_enhanced); title('增強後的圖像');
這段代碼讀入一個圖像,將其轉換為灰度圖像,進行小波變換,並提取出水平、垂直和對角小波系數。然後,對這些小波系數進行直方圖均衡化增強,並將增枝指改強後的小波系數逗早合並。最後,使用小波反變換將增強後的小波系數合成為增強猛判後的圖像,並將原始圖像和增強後的圖像顯示在同一窗口中。注意,這只是一個基本示例,可以根據需要進行修改和調整。
Ⅲ 有誰matlab寫過基於自適應濾波的Retinex圖像增強演算法
根據最後一個公式計算w(x,y), 實際上就是計算梯度水平(水平和垂直方向兩個方向綜合)
I = imread('test3.jpg'); %讀入圖象
subplot(121);imshow(I);
I = double(rgb2gray(I));
[m,n]=size(I);
H1 = [-1 -2 -1
0 0 0
1 2 1];
H2 = [-1 0 1
-2 0 2
-1 0 1];
w0 = (abs(conv2(I,double(H1),'same')) + abs(conv2(I,double(H1),'same')))/2+ones(m,n);
subplot(122);imshow(uint8(w0));
w = 1./w0;