A list,
Digital watermarking based on the combination of discrete wavelet transform (DWT) and SVD
Ii. Source code
clear all;
close all;
clc;
key=35; % Number of Arnold replacements as the key Orignalmark=double(imread('suda64.bmp')); % read64*64[wrow,wcol]=size(Orignalmark);if wrow~=wcol
error('wrow~=wcol error'); End % - test key key is beyond the scope of -- -- -- -- -- -- -- -- -- n = check_arnold (wrow);if (key+1) >n
error('arnold key error'); end Arnoldw=arnold(Orignalmark,wrow,key); % Arnold conversion of watermark image figure(1);
imshow(Orignalmark);
title('Original watermark Image');
figure(2);
imshow(Arnoldw);
title('Scrambled watermark image');
Orignalpicture=double(imread('Lena.jpg'));
figure(3);
imshow(uint8(Orignalpicture));
title('Original image'); % DWT transform [ca1, ch1, cv1, which cd1] = dwt2 (Orignalpicture,'db1'); [ca1row,ca1col]=size(ca1); blocksize=ca1row/wrow; 0 0 0 0 0 0 0 0 01,wrow*wcol); % Convert the scrambled watermark to a one-dimensional wlength=wrow*wcol; % Watermark length a=0.25; % Quantization step %------------------------------------for k=1:wrow
for p=1:wcol
x=(k- 1)*blocksize+1;
y=(p- 1)*blocksize+1;
L=zeros(4.4);
L=ca1(x:x+blocksize- 1,y:y+blocksize- 1);
[U,S,V]=svd(ca1(x:x+blocksize- 1,y:y+blocksize- 1));
cc=floor(S(1.1)/a);
if(water_vector(k*p)==1) % embed an odd multipleif(mod(cc,2) = =0)
cc=cc+1;
end
S(1.1)=a*cc;
end
if(water_vector(k*p)==0)% is embedded in even multiplesif(mod(cc,2) = =1)
cc=cc+1;
end
S(1.1)=a*cc;
end
L=U*S*V';
ca1(x:x+blocksize- 1,y:y+blocksize- 1)=L;
end
end
markedimg=idwt2(ca1,ch1,cv1,cd1,'db1');
figure(4);
imshow(uint8(markedimg));
title('Watermarked image');
extractedmark=extract(markedimg,Orignalmark);
watermark=arnold(extractedmark,wrow,n-key);
figure(5);
imshow(watermark);
title('Extracted watermark image'); psnrvalue=psnr(Orignalmark,watermark) Nc=nc(Orignalmark,watermark) % against -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- f = markedimg; attack=0;
switch attack
case 0,
attackf=f;
att='Not attacked';
case 1, % %1.JPEG compression imwrite (f,'attackf.jpg'.'jpg'.'quality'.90);
attackf=imread('attackf.jpg');
attackf=double(attackf)/255;
att='JPEG compression';
case 2,
% %2.Gaussian low-pass filtering h=fspecial('gaussian'.3.1);
attackf=filter2(h,f);
att='Gaussian low-pass filtering';
case 3, % %3.Histogram equalization attackf=histeq(f); att='Histogram equalization';
case 4, % %4.Attackf =imadjust(f,[],[]0.4.1]);
att='Image brightening';
case 5, % %5.Attackf =imadjust(f,[],[]0.0.85]);
att='Image goes dark';
case 6, % %6.Increase contrast attackf=imadjust(f,[0.3.0.6], []); att='Increase contrast';
case 7, % %7.Attackf =imadjust(f,[],[]0.2.0.8]);
att='Reduce contrast';
case 8, % %8.Attackf =imnoise(f,'gaussian'.0.0.01);
att='Add Gaussian noise';
case 9, % %9.Attackf =imnoise(f,'salt & pepper'.0.05);
att='Salt and pepper noise';
case 10, % %10.Add multiplicative noise attackf=imnoise(f,'speckle'.0.08);
att='Add multiplicative noise';
case 11% % %11.Attackf = medFilt2 (f,[5 5]);
att='Median filtering';
case 12% % %12.Shear f (200:456.200:456, :) =0;
attackf=f;
att='cut';
case 13% % %13.Rotating attackf = imrotate (f,15.'bilinear'.'crop');
att='rotation';
end;
Copy the code
3. Operation results
Fourth, note
Version: 2014 a