基於matlab實現DCT數字水印嵌入與提取

一、離散小波變換的音頻信號數字水印技術簡介

0 引言

近年來, 數字水印技術的作用越來越重要。數字水印技術是將一些標識信息直接嵌入數字載體當中, 或間接表示在信號載體中, 且不影響原載體的使用價值。通過隱藏在載體中的這些信息, 可以判斷信息是否被篡改, 具有防偽溯源、保護信息安全、版權保護等作用。對於廣播轉播臺站而言, 是廣播音頻的中轉站, 在廣播信號發送至千傢萬戶之前務必保證信號的安全可靠, 但現在的大部分臺站隻是利用人耳的判斷, 以及不同信源之間的比較, 具有較大的局限性。若利用數字水印的特性, 應用於廣播節目中可以有效地防止信號插播, 可靠地保護信號安全, 保障廣播的安全播出。

1 音頻數字水印技術分類

根據數字水印在音頻信號中的處理技術, 可將數字水印分為時域、變換域、壓縮域數字水印。

1.1 時域數字水印

在時域數字水印技術中, 直接將水印信息嵌入至音頻信號中, 通常會選擇隱藏在信號不重要部位, 以保證其嵌入水印不影響原音頻信號的監聽效果。時域水印技術的實現較為容易且運算量小, 簡單直接, 但是魯棒性差, 容易被破解, 抵抗力較差。

1.2 變換域數字水印

在變換域數字水印中, 音頻信號需經過時域至變換域的轉換, 通常的變換域有離散餘弦變換 (DCT, Discrete Cosine Transform) 、離散傅立葉變換 (DFT, Discrete Fourier transform) 、離散小波變換 (DWT, Discrete Wavelet Transform) 等。在變換域中嵌入水印信息, 通過反變換得到嵌入水印的音頻時域信號。變換域水印技術較時域水印技術復雜, 但變換域嵌入的水印信息較時域而言, 不可見性更強, 隱蔽性更好, 魯棒性更好。本文的研究主要基於DWT的音頻信號的水印信息的嵌入與提取。

1.3 壓縮域數字水印

在時域和變換域的水印技術, 都是直接將水印信號嵌入未壓縮的音頻格式中, 但是通常在音頻信號的傳輸或存儲中需要對音頻信號進行壓縮編碼 (例如WMA、MP3等) , 因此壓縮域數字水印也是水印技術也具有較大的實用價值。壓縮域數字水印技術大致可分為三類: (1) 在非壓縮域嵌入水印, 將音頻信號與水印信息一起壓縮; (2) 在壓縮域中, 直接將水印信息嵌入壓縮的音頻信號中; (3) 將壓縮後的信號進行解壓縮, 然後嵌入水印信息, 最後將水印信息和解壓後的音頻信號一起壓縮。總的來說, 壓縮域水印技術的編解碼系統過於復雜, 受壓縮編碼格式限制大, 壓縮後的音頻信號已經去除瞭冗餘, 因此加入水印的難度大, 壓縮域水印技術有待進一步研究。

2 基於DWT的音頻水印算法

2.1 水印嵌入

本文研究的音頻水印算法是基於離散小波變換 (DWT) , 音頻信號通過DWT變換, 在變換域中嵌入水印信息, 再經過逆變換 (IDWT) 從而得到嵌入水印的音頻信號。水印嵌入原理框圖如圖1所示。

假定水印為M1×M2的二維圖像bw, 由於音頻信號通常為一維向量, 故水印信息在嵌入音頻信號之前需要將二維降至一維向量w, 即M=M1×M2。通常我們也可以將圖像進行打亂加密, 增強水印隱蔽性。

假定語音信號為s, 長度為N, 則s={s1, s2, s3, …, sN}由於語音信號較長在處理中一般需要進行分段, 每段長度設為N1, 故該語音信號分為K=fix (N/N1) 段進行處理, 每段語音均嵌入一個水印信息。

小波變換是為瞭解決傅立葉變換的不足而提出的一種分析變換, 傅立葉變換的基函數是鋪滿整個時域的正弦信號, 對於突變信號以及變化的頻率成分信息均不能較準確地表示。而小波變換是時間和頻率的局部變換, 更能準確地表示音頻信號的頻域特征, 常用的小波基有Haar小波、Daubechies (db N) 小波、Marr小波等。本文采用的小波基是Haar小波, 它是支撐域在t∈[0, 1]范圍內的矩形波, 定義如下:

圖1 音頻信號水印嵌入原理框圖

圖2 音頻信號水印提取原理框圖

取定Haar小波基後, 則語音信號s可以表示為:

其中Cj, k為離散小波系數, 將音頻信號分解為低頻的近似部分和高頻的細節部分, 我們在水印信息的嵌入處理中, 主要針對代表低頻近似部分的系數向量處理, 即將水印信號放入低頻近似部分, 高頻細節部分不變, 以保證語音質量基本不變。由於嵌入的水印為二值圖像, 因此如果水印信息的值為1, 則將對應的低頻系數增大, 相反如果值為0, 則將對應的低頻系數降低。在DWT域嵌入水印信息後, 然後通過IDWT變換, 將語音信號變換成時域信號。

2.2 水印提取

為瞭保證信息安全, 在發送端發送嵌入水印的音頻信號, 而在接收端為瞭確定音頻信息的準確性, 我們通常需要提取水印以確保來源的真實性, 因此水印的提取技術也尤為重要。在水印提取過程中, 需要原始音頻信號與嵌入水印的音頻信號同時進行DWT, 再將兩者參數進行分析比較提取出水印信息。水印提取原理框圖如圖2所示。

在前面所述的水印嵌入過程中, 將水印信息嵌入高頻的細節部分, 因此在提取水印過程中, 我們也隻需比較原始語音信號S的低頻小波系數向量c A與嵌入水印的音頻信號s1的低頻小波系數向量c A1作比較, 若c A1>c A, 則水印信息為1;反之則為0, 再通過向量平均, 如此得到水印信息的一維向量, 最後通過升維得到二值圖像。

二、部分源代碼

function [embimg,p]=wtmark(im,wt)
% wtmark function performs watermarking in DCT domain
% it processes the image into 8x8 blocks.

% im     = Input Image
% wt     = Watermark
% embimg = Output Embedded image
% p      = PSNR of Embedded image

% Checking Dimnesions
im=imread('b.jpg');
if length(size(im))>2
    im=rgb2gray(im);
end

im        = imresize(im,[512 512]); % Resize image
watermark = imresize(im2bw((wt)),[32 32]);% Resize and Change in binary 

x={}; % empty cell which will consist all blocks
dct_img=blkproc(im,[8,8],@dct2);% DCT of image using 8X8 block
m=dct_img; % Sorce image in which watermark will be inserted 

k=1; dr=0; dc=0;
% dr is to address 1:8 row every time for new block in x
% dc is to address 1:8 column every time for new block in x
% k is to change the no. of cell

%%%%%%%%%%%%%%%%% To divide image in to 4096---8X8 blocks %%%%%%%%%%%%%%%%%%
for ii=1:8:512 % To address row -- 8X8 blocks of image
    for jj=1:8:512 % To address columns -- 8X8 blocks of image
        for i=ii:(ii+7) % To address rows of blocks
            dr=dr+1;
            for j=jj:(jj+7) % To address columns of block
                dc=dc+1;
                z(dr,dc)=m(i,j);
            end
            dc=0;
        end
        x{k}=z; k=k+1;
        z=[]; dr=0;
    end
end
nn=x;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% To insert watermark in to  blocks %%%%%
i=[]; j=[]; w=1; wmrk=watermark; welem=numel(wmrk); % welem - no. of elements
for k=1:4096
    kx=(x{k}); % Extracting block into kx for processing
    for i=1:8 % To address row of block
        for j=1:8 % To adress column of block
            if (i==8) && (j==8) && (w<=welem) % Eligiblity condition to insert watremark
                % i=1 and j=1 - means embedding element in first bit of every block                             
                 if wmrk(w)==0
                    kx(i,j)=kx(i,j)+35;
                elseif wmrk(w)==1
                    kx(i,j)=kx(i,j)-35;
                 end                                
            end            
        end        
    end
    w=w+1;
    x{k}=kx; kx=[]; % Watermark value will be replaced in block
end     

%%%%%%%%%%%%%%%%%%%%%%%%%%%% To recombine cells in to image %%%%%%%%%
i=[]; j=[]; data=[]; count=0;
embimg1={}; % Changing complete row cell of 4096 into 64 row cell 
for j=1:64:4096
    count=count+1;
    for i=j:(j+63)
        data=[data,x{i}];
    end
    embimg1{count}=data;
    data=[];
end

% Change 64 row cell in to particular columns to form image
i=[]; j=[]; data=[]; 
embimg=[];  % final watermark image 
for i=1:64
    embimg=[embimg;embimg1{i}];
end
embimg=(uint8(blkproc(embimg,[8 8],@idct2)));
imwrite(embimg,'out.jpg')
p=psnr(im,embimg);

三、運行結果

到此這篇關於基於matlab實現DCT數字水印嵌入與提取的文章就介紹到這瞭,更多相關matlab數字水印嵌入與提取內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: