一、SVD數字水印簡介
1 引 言
數字水印是随資訊技術和計算機網絡飛速發展而興起的一種重要的版權保護手段, 它通過在數字載體 (圖像、音頻、視訊、文本等) 中加入隐秘資訊來達到這個目的, 在需要時這種隐秘資訊可以通過特定方法檢測出來, 以驗證作品是否合法或受到篡改。目前, 數字水印已成為多媒體資訊安全研究領域的一個熱點, 也是資訊隐藏技術研究領域的重要分支。
數字圖像水印技術從實作過程上分空域算法和變換域算法。空域算法是指在圖像的空間域中嵌入水印的方法, 通常具有較快的速度, 但一般魯棒性較差;變換域算法是指在圖像的變換域中嵌入水印的方法。變換域包括DCT域、DFT域、DWT域等, 由于圖像的小波變換能夠很好地比對人類視覺系統 (HVS) 的特性, 還可以與JPEG2000标準相相容, 是以小波域數字水印技術具有很好的應用前景。
本文針對二值水印圖像, 結合奇異值分解與小波變換, 提出了基于奇異值分解的小波域水印算法。實驗結果表明, 本文提供的方法具有較好的魯棒性和不可見性。
2 小波變換與奇異值分解
作為一種數學工具, 小波變換是對人們熟知的傅裡葉變換和視窗傅裡葉變換的一個重大突破, 為信号分析、圖像處理、量子實體及其他非線性科學的研究領域帶來革命性的影響。小波變換具有許多良好的特性, 這些性質奠定了小波域水印技術的基礎。小波分解的空間-頻率特性與HVS某些視覺特性有相似性。該特性是小波變換差別于DFT和DCT的一個重要方面, 根據該特性可以将高強度的水印嵌入到HVS不太敏感的區域, 這樣在保證不影響圖像視覺品質的前提下, 可以最大限度地增加嵌入水印的強度。
小波變換可以将圖像分解成低頻子帶和高頻子帶。其中, 低頻帶表示由小波變換分解級數決定的最大尺度、最小分辨率下對原始圖像的最佳逼近, 圖像的大部分能量集中在此。高頻帶則分别是圖像在不同尺度、不同分辨率下的細節資訊, 二維圖像一級小波分解所得子圖像按其重要性排序為LL1, HL1, LH1, HH1, 如圖1所示。
奇異值分解是數值線性代數的有效算法之一, 它在統計分析、信号與圖像處理、系統理論與控制中被廣泛應用。在圖像進行中應用的優勢在于圖像奇異值的穩定性非常好, 即當圖像被施加小的擾動時, 圖像的奇異值不會有大的變化, 并且奇異值所表現的是圖像的内蘊特性而非視覺特性。
圖1 二維靜态圖像的一級分解
設圖像矩陣I為非負矩陣, I∈Rn×n, 其中R表示實數域, rank (I) =r (r≤n) , 則I的奇異值分解定義如下:
非零奇異值的個數等于矩陣的秩。
2 水印算法
2.1 水印嵌入算法
為了保證嵌入水印後的圖像品質和水印對信号處理的魯棒性, 水印應嵌入到原始載體圖像的中頻部分。為了達到水印不可見性和魯棒性的折衷, 應合理選取水印的嵌入強度因子α的值。
當原始載體圖像為灰階圖像時, 水印嵌入過程如下:
步驟一:将原始的二值水印圖像取反, 再進行Arnold變換, 得到W˜, 并将疊代次數t作為密鑰儲存。
步驟二:将原始圖像I進行一級小波分解, 得到中頻子帶HL1。
步驟三:将中頻子帶HL1進行SVD, 得到正交矩陣U, V及一個對角矩陣S。
步驟四:将水印W˜疊加到矩陣S上, 對新産生的矩陣S+αW˜進行奇異值分解, 得到U1, V1和S1。
步驟五:将矩陣U, S1和VT相乘, 得到處理後包含水印的圖像D。
步驟六:用D代替步驟二中的HL1, 進行小波反變換, 得到潛入水印的圖像I˜。
2.2 水印提取算法
水印提取算法恰好與水印的嵌入過程完全相反, 過程如下:
步驟一:将含水印圖像I˜進行一級小波分解, 可得到中頻子帶HL¯¯1。
步驟二:對中頻子帶HL¯¯1進行SVD, 可得到正交矩陣U¯¯¯1, V¯¯¯1和對角矩陣S¯¯¯1。
步驟三:用S¯¯¯1代替水印嵌入算法步驟三中的對角矩陣S, 然後與正交矩陣U, V相乘, 即可得到矩陣圖像D。
步驟四:利用水印嵌入算法步驟三、四中的S及α進行運算:W˜=1α(D−S), 則可得到置亂後的二值水印圖像W˜。
步驟五:對W˜進行T-t次 (T表示Arnold變換的周期) Arnold變換并進行取反, 即可得到最終提取的二值水印圖像。
二、部分源代碼
close all;
clc;
%加載要加水印的原始圖像
orig_img = imread(‘lena_256.bmp’);
orig_img = imresize(orig_img, [256,256]);
figure, imshow(orig_img); title (‘原始圖檔’)
[M,N] = size(orig_img);
nblock=M/8;
%加載要在原始圖像中加水印的圖像
wat_img = imread(‘njit_logo.jpg’);
wat_img = imresize(wat_img, [nblock,nblock]); % make it 32 X 32
wat_img=uint8(wat_img);
level = graythresh(wat_img);%找到一個很好的門檻值
wat_img = im2bw(wat_img,level); %使水印變成二值圖像
figure, imshow(wat_img); title(‘WaterMark Image’);
%現在調用遺傳算法,最小值為10,最大值為20
% 值90與線性适應度函數
npop = input('No of Iteration (Population Size) = '); % 詢問人口規模
% 最小值為10,最大值為90,是種群數目大小,适應函數是未知數的平方
[a,b,c] = genetic_algorithm (@(x)x^2,npop,npop,npop,npop,npop,npop,npop,1,150,250,.01);% 攻擊類型
fprintf(’ 1 - Midian Filter\n’);
fprintf(’ 2 - Resize the image (scaling four times and then returned to original with bicubicinterpolation)\n’);
fprintf(’ 2 - Salt and paper noise\n’);
fprintf(’ 4 - Low pass filter\n’);
fprintf(’ 5 - Image Jpeg Compression with Quality Factor 40\n’);
attack_type = input('Attack Type: ');
max = 0.0; % 目标函數的最大值
peaksnr_value = 0; % 初始化 PEAKSNR 值
NC = 0; % 初始化歸一化相關值
step=0;
final_image = zeros(M,N);
for i=2:npop
step_size = a(i);
Wimg = SVD_Watermarked(orig_img, wat_img, step_size);
% calculation of image quality degradiation after inserting watermark嵌入水印後圖像品質退化的計算
[m,n] = size(orig_img);
error = orig_img - Wimg;
MSE = (sum(sum(error.^2)))/(mn);
if (MSE > 0)
peaksnr = 10log10(255^2/MSE);
else
peaksnr=99;
end
% fprintf(‘The Peak Signal to noise ratio: %f db\n’,peaksnr);
% 攻擊水印圖檔
% 應用中值過濾器
if(attack_type1)
attacked_Image = medfilt2(Wimg);
end
% 調整圖像大小。 第一次縮放(四次)然後回到原來的
% 雙三次插值
if(attack_type2)
attacked_Image = imresize(Wimg,4,‘nearest’);
attacked_Image = imresize(attacked_Image, [M N]);
end
%椒鹽噪聲
if(attack_type3)
attacked_Image = imnoise(Wimg,‘salt & pepper’,0.002);
end
if(attack_type4)
attacked_Image = uint8(conv2(double(Wimg), double(ones(3,3))/9));
attacked_Image = imresize(attacked_Image, [M N]);
end
if(attack_type == 5)
imwrite(Wimg,‘Watermarked’,‘JPEG’,‘Quality’,40);
attacked_Image = imread(‘Watermarked.jpg’);
end
三、運作結果
四、matlab版本及參考文獻
1 matlab版本
2014a