Problem in extracting the watermark ! !
    10 views (last 30 days)
  
       Show older comments
    
Dear Sir,
I have an issue in extracting the watermark..
PROPOSED APPROACH :
1.Bring the image to frequency domain by applying the DCT
2.generate a watermark signal
3.Use the thousand largest coefficients of the original image to embed a watermark sequence of length 1000.
4.Coefficients are modified according to the stream bits of the message using the equation below,
 CAW = CA (1 + α Wi)
5.Extraction process – simply subtracting the original DCT coefficients from the watermarked image coefficients.
--------------------------------------------------------------------------------------------------------------------------------
*The code for embedding and extraction is as follows :*
______________________________________________________________
[fname pthname]=uigetfile('*.jpg;*.png;*.tif;*bmp','Select the Asset Image'); %select image 
        I=imread([pthname fname]);
      wmsz=1000; %watermark size
       I=I(:,:,1);%get the first color in case of RGB image 
      [r,c]=size(I); 
      D=dct2(I);%get DCT of the Asset 
      D_vec=reshape(D,1,r*c);%putting all DCT values in a vector 
      [D_vec_srt,Idx]=sort(abs(D_vec),'descend');%re-ordering all the absolute values 
      W=randn(1,wmsz);%generate a Gaussian spread spectrum noise to use as watermark signal 
      Idx2=Idx(2:wmsz+1);%choosing 1000 biggest values other than the DC value 
      %finding associated row-column order for vector values 
      IND=zeros(wmsz,2); 
      for k=1:wmsz 
      x=floor(Idx2(k)/r)+1;%associated culomn in the image 
      y=mod(Idx2(k),r);%associated row in the image 
      IND(k,1)=y; 
      IND(k,2)=x; 
      end 
      D_w=D; 
      for k=1:wmsz 
      %insert the WM signal into the DCT values 
      D_w(IND(k,1),IND(k,2))=D_w(IND(k,1),IND(k,2))+.1*D_w(IND(k,1),IND(k,2)).*W(k); 
      end 
      I2=idct2(D_w);%inverse DCT to produce the watermarked asset
      %The extraction process is simply subtracting the original DCT %coefficients from the 
      %watermarked image ones. The code can be written like below: 
      W2=[];%will contain watermark signal extracted from the image 
      for k=1:wmsz 
      W2=[W2(D_w(IND(k,1),IND(k,2))/D(IND(k,1),IND(k,2))-1)*10];%watermark extraction 
      end
_____________________________________________________________
The ERROR appears as follows in the 25th line :
??? Attempted to access W2(-0.0432565); index must be a positive integer or logical.
Error in ==> pooya at 29 
W2=[W2(D_w(IND(k,1),IND(k,2))/D(IND(k,1),IND(k,2))-1)*10];%watermark extraction
-----------------------------------------------------------
Please help
Thank you.
1 Comment
  Walter Roberson
      
      
 on 14 Dec 2011
				http://www.mathworks.com/matlabcentral/answers/13205-tutorial-how-to-format-your-question-with-markup
Accepted Answer
  Eric Pahlke
      
 on 15 Dec 2011
        There's a lot of code to sort through to figure out exactly what you need to fix, but what stands out is this line:
D_w(IND(k,1),IND(k,2))=D_w(IND(k,1),IND(k,2))+.1*D_w(IND(k,1),IND(k,2)).*W(k);
You're using D_w as an index on line 25(where you get the error), which means it has to be an integer.
However in the line above you're assigning fractional values to D_w:
    (D_w(stuff) = D_w(stuff) + .1*D_w(stuff)
Was the .1* intended to be a .* ?
2 Comments
  Walter Roberson
      
      
 on 17 Mar 2012
				You have a division in your subscript calculations, but you are expecting the result will always be an integer ??
More Answers (4)
  mcc mscelec
 on 18 Mar 2012
        5 Comments
  Pardeep Kumar
 on 15 Apr 2013
				
      Edited: Walter Roberson
      
      
 on 15 Apr 2013
  
			pls correct these errors
fw=D_w(IND(k,1),IND(k,2));
and
%WATERMARK EXTRACTION
W2=(2500000);
for k=1:wmsz
    W2(k)=((D_w(IND(k,1),IND(k,2))/D(IND(k,1),IND(k,2))-1)*10);
end
subplot(2,3,4),plot(W2),title('Extracted Watermark');
  mcc mscelec
 on 14 Apr 2012
        1 Comment
  Pardeep Kumar
 on 26 May 2013
				sir ,there is error showing in the line store(k)=WM_detect(ext_wm,orig_wm);
ie.value assigned to variable store might be unused .
  Lester
 on 2 Mar 2013
        sir ,
may i know what are the steps followed for embedding and extracting the image in DCT domain in the above code....???
0 Comments
  Alaa Eleyan
 on 22 Nov 2013
        the code is working properly..
You just need to add space between W2 and (D_w(....... in the for loop :
Wrong : W2=[W2(D_w(IND(k,1),IND(k,2))/D(IND(k,1),IND(k,2))-1)*10];
Correct : W2=[W2 (D_w(IND(k,1),IND(k,2))/D(IND(k,1),IND(k,2))-1)*10];
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




