Bonjour,

J'ai trouvé sur Internet des algorithmes permettant le watermarking. J'ai voulu les tester et là je rencontre un problème.
A l'exécution du code qui watermarque via la méthode dct2, l'erreur suivante s'affiche dans la console :
??? Error using ==> rand
State must be a double scalar or the output of RAND('state').

Error in ==> dct2_embed at 61
rand('state',key);
Voici le code de ce script :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
clear all;
 
% save start time
start_time=cputime;
 
k=20;                           % set gain factor for embeding
blocksize=8;                    % set the dct blocksize
 
midband=[   0,0,0,1,1,1,1,0;    % defines the mid-band frequencies of an 8x8 dct
            0,0,1,1,1,1,0,0;
            0,1,1,1,1,0,0,0;
            1,1,1,1,0,0,0,0;
            1,1,1,0,0,0,0,0;
            1,1,0,0,0,0,0,0;
            1,0,0,0,0,0,0,0;
            0,0,0,0,0,0,0,0 ];
 
% read in the cover object
file_name='_lena_std_bw.bmp';
cover_object=double(imread(file_name));
 
% determine size of cover image
Mc=size(cover_object,1);	        %Height
Nc=size(cover_object,2);	        %Width
 
% determine maximum message size based on cover object, and blocksize
max_message=Mc*Nc/(blocksize^2);
 
% read in the message image
file_name='_copyright.bmp';
message=double(imread(file_name));
Mm=size(message,1);	                %Height
Nm=size(message,2);	                %Width
 
% reshape the message to a vector
message=round(reshape(message,Mm*Nm,1)./256);
 
% 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
 
% pad the message out to the maximum message size with ones's
message_vector=ones(1,max_message);
message_vector(1:length(message))=message;
 
% generate shell of watermarked image
watermarked_image=cover_object;
 
% read in key for PN generator
file_name='_key.bmp';
key=double(imread(file_name))./256;
 
% reset MATLAB's PN generator to state "key"
rand('state',key);
 
% generate PN sequence
pn_sequence_zero=round(2*(rand(1,sum(sum(midband)))-0.5));
 
% process the image in blocks
x=1;
y=1;
for (kk = 1:length(message_vector))
 
    % transform block using DCT
    dct_block=dct2(cover_object(y:y+blocksize-1,x:x+blocksize-1));
 
    % if message bit contains zero then embed pn_sequence_zero into the mid-band
    % componants of the dct_block
    ll=1;
    if (message_vector(kk)==0)
        for ii=1:blocksize
            for jj=1:blocksize
                if (midband(jj,ii)==1)
                    dct_block(jj,ii)=dct_block(jj,ii)+k*pn_sequence_zero(ll);
                    ll=ll+1;
                end
            end
        end
    end
 
    % transform block back into spatial domain
    watermarked_image(y:y+blocksize-1,x:x+blocksize-1)=idct2(dct_block);    
 
    % move on to next block. At and of row move to next row
    if (x+blocksize) >= Nc
        x=1;
        y=y+blocksize;
    else
        x=x+blocksize;
    end
end
 
% convert to uint8 and write the watermarked image out to a file
watermarked_image_int=uint8(watermarked_image);
imwrite(watermarked_image_int,'dct2_watermarked.bmp','bmp');
 
% display processing time
elapsed_time=cputime-start_time,
 
% display psnr of watermarked image
psnr=psnr(cover_object,watermarked_image,Nc,Mc),
 
% display watermarked image
figure(1)
imshow(watermarked_image,[])
title('Watermarked Image')
La variable key est de type <35x1 double>.

Quelqu'un pourrait-il m'éclairer ?

Voici le site d'où je tire ces algorithmes : http://web.vu.union.edu/~shoemakc/watermarking/