IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

erreur avec rand('state',key)


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 18
    Points
    18
    Par défaut erreur avec rand('state',key)
    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/

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    le code est relativement vieux (2002 a priori) et depuis le mode de fonctionnement a relativement évolué (voir la doc de rand a ce sujet). Mais les anciennes syntaxes sont normalement toujours autorisées, même si elles ne sont plus conseillées.

    Apparemment, l'option 'state' de rand n'accepte plus 0 comme valeurs à l'intérieur du vecteur key. Pour corriger cela, a priori il suffit de remplacer 0 par une valeur très petite par exemple (ou autre) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    % read in key for PN generator
    file_name='_key.bmp';
    key=double(imread(file_name))./256;
    key(key==0) = 1e-15;
    
    % reset MATLAB's PN generator to state "key"
    rand('state',key);
    Attention du coup la valeur de la clé est modifiée...
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 18
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Mapping] Erreur d'ajout d'une ligne avec un Foreign key(Struts2, Hibernate)
    Par lahbabi dans le forum Hibernate
    Réponses: 0
    Dernier message: 11/08/2013, 06h45
  2. Erreur de Rand avec Microsoft visual c++ 6.0
    Par yoadsl dans le forum Visual C++
    Réponses: 9
    Dernier message: 15/03/2005, 20h59
  3. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  4. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25
  5. Probleme de tirage avec rand ?
    Par sunshine33 dans le forum MFC
    Réponses: 5
    Dernier message: 14/01/2004, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo