Matlab Image watermarking question , using both SVD and DWT
Posted
by Georgek
on Stack Overflow
See other posts from Stack Overflow
or by Georgek
Published on 2010-04-06T15:47:02Z
Indexed on
2010/04/06
15:53 UTC
Read the original article
Hit count: 393
matlab
Hello all . here is a code that i got over the net ,and it is supposed to embed a watermark of size(50*20) called _copyright.bmp in the Code below . the size of the cover object is (512*512), it is called _lena_std_bw.bmp.What we did here is we did DWT2 2 times for the image , when we reached our second dwt2 cA2 size is 128*128. You should notice that the blocksize and it equals 4, it is used to determine the max msg size based on cA2 according to the following code:max_message=RcA2*CcA2/(blocksize^2). in our current case max_message would equal 128*128/(4^2)=1024. i want to embed a bigger watermark in the 2nd dwt2 and lets say the size of that watermark is 400*10(i can change the dimension using MS PAINT), what i have to do is change the size of the blocksize to 2. so max_message=4096.Matlab gives me 3 errors and they are :
??? Error using ==> plus Matrix dimensions must agree.
Error in ==> idwt2 at 93 x = upsconv2(a,{Lo_R,Lo_R},sx,dwtEXTM,shift)+ ... % Approximation.
Error in ==> two_dwt_svd_low_low at 88 CAA1 = idwt2(cA22,cH2,cV2,cD2,'haar',[RcA1,CcA1]);
The origional Code is (the origional code where blocksize =4):
%This algorithm makes DWT for the whole image and after that make DWT for %cH1 and make SVD for cH2 and embed the watermark in every level after SVD %(1) -------------- Embed Watermark ------------------------------------ %Add the watermar W to original image I and give the watermarked image in J %--------------------------------------------------------------------------
% set the gain factor for embeding and threshold for evaluation clc; clear all; close all;
% save start time start_time=cputime;
% set the value of threshold and alpha thresh=.5; alpha =0.01;
% read in the cover object file_name='_lena_std_bw.bmp'; cover_object=double(imread(file_name));
% determine size of watermarked image Mc=size(cover_object,1); %Height Nc=size(cover_object,2); %Width
% read in the message image and reshape it into a vector file_name='_copyright.bmp'; message=double(imread(file_name)); T=message; Mm=size(message,1); %Height Nm=size(message,2); %Width
% perform 1-level DWT for the whole cover image [cA1,cH1,cV1,cD1] = dwt2(cover_object,'haar');
% determine the size of cA1 [RcA1 CcA1]=size(cA1)
% perform 2-level DWT for cA1 [cA2,cH2,cV2,cD2] = dwt2(cA1,'haar');
% determine the size of cA2 [RcA2 CcA2]=size(cA2)
% set the value of blocksize blocksize=4
% reshape the watermark to a vector message_vector=round(reshape(message,Mm*Nm,1)./256); W=message_vector;
% determine maximum message size based on cA2, and blocksize max_message=RcA2*CcA2/(blocksize^2)
% check that the message isn't too large for cover if (length(message) > max_message) error('Message too large to fit in Cover Object') end
%----------------------- process the image in blocks ----------------------
x=1;
y=1;
for (kk = 1:length(message_vector))
[cA2u cA2s cA2v]=svd(cA2(y:y+blocksize-1,x:x+blocksize-1));
% if message bit contains zero, modify S of the original image
if (message_vector(kk) == 0)
cA2s = cA2s*(1 + alpha);
% otherwise mask is filled with zeros
else
cA2s=cA2s;
end
cA22(y:y+blocksize-1,x:x+blocksize-1)=cA2u*cA2s*cA2v;
% move to next block of mask along x; If at end of row, move to next row
if (x+blocksize) >= CcA2
x=1;
y=y+blocksize;
else
x=x+blocksize;
end
end
% perform IDWT CAA1 = idwt2(cA22,cH2,cV2,cD2,'haar',[RcA1,CcA1]);
watermarked_image= idwt2(CAA1,cH1,cV1,cD1,'haar',[Mc,Nc]);
% convert back to uint8 watermarked_image_uint8=uint8(watermarked_image);
% write watermarked Image to file imwrite(watermarked_image_uint8,'dwt_watermarked.bmp','bmp');
% display watermarked image figure(1) imshow(watermarked_image_uint8,[]) title('Watermarked Image')
%(2) ---------------------------------------------------------------------- %---------- Extract Watermark from attacked watermarked image ------------- %--------------------------------------------------------------------------
% read in the watermarked object file_name='dwt_watermarked.bmp'; watermarked_image=double(imread(file_name));
% determine size of watermarked image Mw=size(watermarked_image,1); %Height Nw=size(watermarked_image,2); %Width
% perform 1-level DWT for the whole watermarked image [ca1,ch1,cv1,cd1] = dwt2(watermarked_image,'haar');
% determine the size of ca1 [Rca1 Cca1]=size(ca1);
% perform 2-level DWT for ca1 [ca2,ch2,cv2,cd2] = dwt2(ca1,'haar');
% determine the size of ca2 [Rca2 Cca2]=size(ca2);
% process the image in blocks % for each block get a bit for message x=1; y=1; for (kk = 1:length(message_vector))
% sets correlation to 1 when patterns are identical to avoid /0 errors
% otherwise calcluate difference between the cover image and the
% watermarked image
[cA2u cA2s cA2v]=svd(cA2(y:y+blocksize-1,x:x+blocksize-1));
[ca2u1 ca2s1 ca2v1]=svd(ca2(y:y+blocksize-1,x:x+blocksize-1));
correlation(kk)=diag(ca2s1-cA2s)'*diag(ca2s1-cA2s)/(alpha*alpha)/(diag(cA2s)*diag(cA2s));
% move on to next block. At and of row move to next row
if (x+blocksize) >= Cca2
x=1;
y=y+blocksize;
else
x=x+blocksize;
end
end
% if correlation exceeds average correlation correlation(kk)=correlation(kk)+mean(correlation(1:Mm*Nm)); for kk = 1:length(correlation)
if (correlation(kk) > thresh*alpha);%thresh*mean(correlation(1:Mo*No)))
message_vector(kk)=0;
end
end
% reshape the message vector and display recovered watermark. figure(2) message=reshape(message_vector(1:Mm*Nm),Mm,Nm); imshow(message,[]) title('Recovered Watermark')
% display processing time elapsed_time=cputime-start_time, please do help,its my graduation project and i have been trying this code for along time but failed miserable. Thanks in advance
© Stack Overflow or respective owner