Problem in extracting the watermark ! !
2 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!