當前位置:成語大全網 - 書法字典 - 如何用matlab從含有水印的圖像中提取水印?

如何用matlab從含有水印的圖像中提取水印?

3視頻水印嵌入和檢測方案

3.1水印的預處理

二值圖像作為待嵌入的水印數據,本文的研究對象采用二維Arnold變換,因為它是二維圖像。

二維阿諾德變換定義為:

(3-1)

其中(x,y)是原圖像的像素,(x ',y ')是變換後的新圖像的像素,n是圖像的階,即圖像的大小,壹般為正方形圖像。因為Arnold變換是周期性的,我們可以利用它的周期對圖像進行逆變換。即在水印嵌入過程中,可以將水印置亂次數作為密鑰次數,然後嵌入水印。當水印被提取後,它可以被恢復到原始圖像的(周期時間)倍。這是使用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的3D數據塊BYk (k=1,2,…20),如圖2-20所示。

圖3-2亮度分量的阻塞

根據公式(3-3)和(3-4)所示的亮度敏感度Lk和紋理敏感度Dk的公式,通過計算,我們從20個計算值相對較高的數據中選擇壹個()作為水印的嵌入塊。

(3-3)

(3-4)

BYk中亮度數據在哪裏?

最後,考慮到復雜性和性能之間的權衡,我們對選定的數據塊實現了二階三維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階3-D DCT變換,得到嵌入水印的視頻數據,然後將它們放回原始位置。

需要註意的是,在整個嵌入過程中,所有使用的參數都要作為密鑰保存。

具體方案如下:

步驟1:提取32幀視頻Y分量數據;

(1)讀取視頻文件;

(2)提取所有Y分量,並將所有Y分量分成32組;

(3)對於每組4幀,從每組中選擇運動最敏感的壹幀,判斷每組中最大的Y_deltmax,存儲在變量m中;

(4)定位最大的y _ deltamax,存入變量w;

Y32是32幀視頻(355*288*32),其中所需視頻幀中的Y分量滿足靈敏度。

第二步:阻塞過程:

(1)塊行(4塊);

(2)分塊列(5塊);

(3)每十幀取壹幀,* * *從32幀中取四幀,減少計算量;

(4)將壹個數分配給另壹個數;

切割成20個塊,每個塊是64*64*4的數據塊BY,維度不同,只能逐像素賦值。

第三步:根據公式計算數據塊的亮度敏感度L和紋理敏感度D。

第四步:選擇L和D較大的塊嵌入水印。

(1)判斷最大的L,存入變量LM;

(2)移除最大的塊並進行比較;

(4)將第壹塊的L的權重指定為20;

(5)計算第二至第二十塊中L的權重;

(6)用同樣的方法處理d;

(7)通過下式計算每個的權重;

(8)將所有20個塊的權重qz按從小到大排序,並保持原來的位置索引index,則index[20]為待選塊;

步驟5: 3D DCT變換。

由於視頻是由圖像數據流組成的,所以視頻的每壹幀都可以被視為靜止圖像。對運動圖像序列進行3D-DCT可以看作是先對視頻的每壹幀進行2D-DCT,然後在幀間方向進行1d-DCT。

步驟6:嵌入水印數據。

加擾後的水印序列被嵌入到所選擇的DCT系數中,即3D-DCT變換後的數據塊中的第壹幀數據中。然後在逆3D-DCT變換後將這些數據放回原始位置。

第七步:把選中的數據放回原來的位置。

最後壹步:寫壹個視頻文件

3.3視頻水印檢測

水印提取是嵌入的逆過程。該算法的壹個優點是水印提取不需要原始視頻數據,但仍需要壹些參數。它們是:

(1)在嵌入過程的第四步中生成塊的排序結果,從中我們可以知道水印的大概嵌入位置;

(2)在嵌入期間指定的參數s;

(Arnold變換的次數和周期;

得到了以上參數,水印提取就很簡單了,具體過程如圖3-3所示。

圖3-3盲水印提取過程

該方案如下:

從待水印的視頻數據(可能是被攻擊後的視頻)中提取亮度分量Y’,根據密鑰提取32幀中的4個亮度分量,然後分別從這組數據中提取水印。

在圖3-3中,首先把分成20個塊,找到對應的。然後,做二階三維DCT變換,根據等式(3-6)提取水印數據。

(3-6)

其中是DCT系數。

最後,我們將做Arnold變換得到水印圖像作為最終提取的水印。

具體步驟如下:

步驟1:提取32幀視頻Y分量數據;

(1)讀取嵌入水印圖像的視頻文件;

(2)提取所有Y分量,並將所有Y分量分成32組;

(3)對於每組4幀,從每組中選擇運動最敏感的壹幀,判斷每組中最大的Y_deltmax,存儲在變量m中;

(4)定位最大的y _ deltamax,存入變量w;

Y32是所需視頻幀中的Y分量滿足運動靈敏度的32幀視頻,Y32是355*288*32的三維數組。

第二步:阻塞過程:

(1)塊行(4塊);

(2)分塊列(5塊);

(3)每十幀取壹幀,* * *從32幀中取四幀,減少計算量;

(4)將壹個數分配給另壹個數;

切割成20個塊,每個塊是64*64*4的數據塊BY,維度不同,只能逐像素賦值。

計算其亮度敏感度和紋理敏感度並排序後,index[20]為本算法中嵌入水印的塊;

步驟3: 3D DCT變換。

第四步:阿諾德轉型

因為這個算法中的水印圖像是二值圖像,它的Arnold變換是二維變換,周期是周期,水印被變換了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水印嵌入過程

基於Arnold變換的(1)圖像置亂

Matlab實現如下:

Arnold變換通過函數r = Arnold (w0,row,Column,times)實現,其中w0是讀取的圖像數據,Row是行數,Column是列數,Times是Arnold變換的次數。

函數r=Arnold(w0,行,列,次數)

對於k=1:次

對於i=1:row

對於j=1:列

I 1 = I+j;

j 1 = I+2 * j;

如果I 1 & gt;排

i1=mod(i1,row);

結束

如果j 1 & gt;科勒姆

j1=mod(j1,colum);

結束

如果i1= =0

I 1 = row;

結束

如果j1= =0

j 1 = colum;

結束

w1(i1,j1)=w0(i,j);

結束

結束

w0 = w 1;

結束

r = w0

用imwrite(w0,' Arnold.bmp ',' bmp ')寫加擾後的鏡像文件;使用imshow('Arnold.bmp ')在MATLAB中顯示該圖像。

本文采用了二維二值水印圖像watermark.bmp。我們將圖像數據(64*64)掃描成二維矩陣,並進行Arnold變換,從而得到置亂後的二維矩陣。隨著叠代次數的增加,圖像逐漸趨於混沌,但經過壹定次數的叠代後,又會回到原始圖像。因為watermark.bmp的大小是64*64,所以實驗圖像經過48次叠代後會回到原圖,也就是周期周期= 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”代表亮度(輝度或亮度),即灰度值;而“u”和“v”代表色度,用來描述圖像的顏色和飽和度,指定像素顏色。所以YUV的色彩空間更穩定,更容易分析。

本文選取的測試視頻中的第39幀如圖4-3所示。YUV格式視頻中,Y:U:V=4:2:2,但俗稱“420”格式。

圖4-3沒有水印的視頻

第壹步:讀取文件;

讀取視頻文件是通過[YUV,Y,U,V,NUM _ F] = LOAD YUV (filename)實現的,其中filename是所選視頻文件的名稱。Yuv是壹個四維數組,返回視頻的yuv分量,Y是亮度分量,U和V是顏色分量,num_f是視頻文件中所有幀數。

讀取壹幀數據的YUV分量是通過Matlab中的以下源代碼實現的:

function [YUV,Y,U,V] = loadFileYUV(寬度,高度,框架,文件名,格式)

[Teil_h,Teil_b]=YUVFormat(格式);

fileId = fopen(文件名,' r ');

其中width:每幀的寬度;height:每壹幀的高度;框架:當前負載的框架;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是壹個32幀的視頻,視頻幀中有敏感的Y分量,是壹個355*288*32的三維數組。

第二步:阻擋;

因為需要分塊標簽,維度不壹樣,所以只能壹個像素壹個像素的分配。在Matlab中,by (t1,t2,t3,j * 5+k+1)= double(y32((64 * j+t 1),(64 * k+)。

第三步:三維DCT變換;

運動圖像序列的每壹幀都可以看作是靜止圖像,運動圖像序列可以看作是3D DCT,可以先看作是每壹幀的2D DCT,再看作是幀間方向的1D DCT。

%對每個塊的幀間方向進行1D DCT變換。

因為i=1:64

對於j=1:64

dcta(i,j,1:4,index(20))=dct(BY(i,j,1:4,index(20));

結束

結束

%對每個塊的每個幀執行2D DCT。

因為i=1:4

dct3a(:,:,I,index(20))=dct2(dcta(:,:,I,index(20));

結束

步驟4:嵌入水印;

讀取二值水印圖像是通過message = double(im read(' watermark。BMP ')),而message是由0和1組成的二維數組。

將置亂後的水印序列嵌入到選定的dct系數中,源代碼如下:

其中,dct3a為dct系數,index[20]為具有良好紋理敏感度和亮度敏感度的塊,S由版權所有者作為密鑰保存。

S = 60

t 1 = S/4;

T2 = 3 * t 1;

因為i=1:64

對於j=1:64

if (w2(i,j)==1)

if (dct3a(i,j,1,index(20))& gt;=0)

dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20),S)+t 1;

結束

if (dct3a(i,j,1,index(20))& lt;0)

dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-t 1;

結束

結束

if (w2(i,j,)==0)

if (dct3a(i,j,1,index(20))& gt;=0)

dipin(i,j)=dct3a(i,j,1,index(20))-mod(dct3a(i,j,1,index(20),S)+T2;

結束

if (dct3a(i,j,1,index(20))& lt;0)

dipin(i,j)=dct3a(i,j,1,index(20))+mod(abs(dct3a(i,j,1,index(20))),S)-T2;

結束

結束

結束

結束

步驟5:三維DCT的逆變換;

首先對塊的第壹幀進行二維DCT逆變換,然後對其他三幀進行二維DCT逆變換,最後對幀間方向進行壹維DCT逆變換。這個過程由Matlab實現如下:

二維DCT的逆變換;

idcta(:,:,1,index(20))= IDCT 2(dipin);

因為i=2:4

idcta(:,:,I,index(20))=idct2(dct3a(:,:,I,index(20)));

結束

對每個塊的幀間方向進行壹維DCT逆變換。

因為i=1:64

對於j=1:64

idct3a(i,j,1:4,index(20))=idct(idcta(i,j,1:4,index(20));

結束

結束

第六步:把這些數據放在原來的位置;

第七步:編寫視頻文件;

寫入視頻文件是通過下面的程序實現的,其中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(文件名);

讀取視頻文件和3-D DCT正向變換的原理和嵌入過程是壹樣的,這裏不再贅述。

提取水印數據在Matlab中通過以下程序實現,其中S,T1,T2等。嵌入時都是密鑰,版權所有者擁有。

因為i=1:64

對於j=1:64

if (mod(abs(dct3b(i,j,1,index(20))),S)& lt;((T1+T2)/2))

水蔭(I,j)= 1;

結束

if (mod(abs(dct3b(i,j,1,index(20))),S)>=((T1+T2)/2))

水蔭(I,j)= 0;

結束

結束

結束

阿諾德的逆變換如下:

w0 =水蔭;

w2 =阿諾德(w0,Hm,Wm,40);

W0是檢測到的水印數據,Hm和Wm是水印數據的行和列,變換次數是40。

寫壹個水印文件,檢查水印圖像是否存在,是否與原始水印圖像不同。

Imwrite(w2,' restore。bmp ',' BMP ');

Imshow ('restore。BMP’);

綜上所述,水印的嵌入主要是通過分別對視頻和水印進行預處理,然後根據嵌入算法選擇合適的嵌入位置和合理的嵌入策略,從而得到包含水印的視頻數據。每個環節都利用了HVS特性,提高了視頻水印的魯棒性。最後,采用相應的視頻水印檢測策略提取水印,實現視頻保護。實驗結果表明,該算法能夠成功提取水印圖像。