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

Images Discussion :

DCT & code matlab


Sujet :

Images

  1. #1
    Membre du Club Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Points : 47
    Points
    47
    Par défaut DCT & code matlab
    J'ai un sujet de tatouages des images fixes.
    Je veux programmer un DCT (transforme de cosinus discret) par matlab.
    Je considère une image, j'applique DCt sur elle puis je l'ajoute à un marque (juste une matrice carrée de même dimension que l'image pseudo aléatoire).
    Apres, j'applique IDCT (transforme inverse de DCT) sur l'image résultante.

    J'écris ce programme mais je ne sais pas ce qui est correct :
    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
    x=imread('lena.gif');
     
    subplot(2,2,1);
    imshow(x);
    title('Image originale');
     
     
    [M,M]=size(x);
     
     
    z    = randn(M);   % the watermark has a normal distribution (pseudo-random sequence)
     
    subplot(2,2,2);
    imshow(z);
    title('mark');
     
     
     
    y=zeros(M,M); %declaration de la matrice nulle de meme dimension aque x
     
    %%%%%%%%%%%%%%%%%%%% calcul de DTC de X     %%%%%%%%%%%%%%%%%%%
     
    %Calcul of the  coefficients of tranformes   dct
    %u,v are the indices dof the new matriix y
    %i,j are the  indices of the matrix x
    for u=0:M-1
        for v=0:M-1
            for i=0:M-1
                for j=0:M-1
                    %Test permettant de determiner la valeur des variables C1 et C2
                    if u==0
                        c1=1/sqrt(2);
                    else
                        c1=1;
                    end;
                    if v==0
                        c2=1/sqrt(2);
                    else
                        c2=1;
                    end
                    y(u+1,v+1)=y(u+1,v+1)+1/sqrt(2*M)*c1*c2*x(i+1,j+1)*cos(pi*u/M*(i+1/2))*cos(pi*v/M*(j+1/2));               
                end;
            end;
        end;
    end;
     
    %%%%%%%%%%%%%%%%%%%%% calcul de l'image tatouee(w)=image originale+ marque z    %%%%%%%%%%%%%%%%%%%
     
    for i=1:M
         for j=1:M
            w(i,j) = y(i,j) + z(i,j);           % calcul de l'image tatouee(w)=image originale+ marque z
     
        end
    end
     
    %%%%%%%%%%%%%%%%%%%% calcul de IDTC de w     %%%%%%%%%%%%%%%%%%%
     
    [N,N]=size(w);
    %declaration d'une matrice nulle de meme dimension que w
    b=zeros(N,N);
     
    for i=0:N-1
        for j=0:N-1
            for u=0:N-1
                for v=0:N-1
                    %Test permettant de determiner la valeur des variables C1 et C2
                    if u==0
                        c1=1/sqrt(2);
                    else
                        c1=1;
                    end;
                    if v==0
                        c2=1/sqrt(2);
                    else
                        c2=1;
                    end;
                    b(i+1,j+1)=b(i+1,j+1)+1/sqrt(2*N)*c1*c2*w(u+1,v+1)*cos(pi*u/N*(i+1/2))*cos(pi*v/N*(j+1/2));
                end;
            end;
        end;
    end;
     
    subplot(2,2,3);
    imshow(b);
    title('Image marqueé');
    Le problème est que : en entrée, j'ai une image dans le domaine spatial; après application de DCT je change le domaine au domaine fréquentiel. Est-il possible d'ajouter la marque (z) qui est en domaine spatial ?

    Deuxième question : dans beaucoup d'articles, je trouve cette relation :
    DCT = c*m*c'
    avec c : le coefficient dde DCT
    m: l'image
    c': transpose
    Je ne sais pas quand je dois utiliser cette relation !!!! Car dans mon programme, j'ai seulement calculé les coefficient de DCt comme vous voyez dans mon code.

    Est-ce que quelqu'un peut m'aider et répondre à mes questions ?

  2. #2
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Déjà, selon moi, tu t'embêtes !
    Il existe la fonction dct2 (et idct2) sous Matlab.

    Ensuite, les relations spatial/fréquence sont simples avec la DCT.
    La relation que tu donnes permet de passer du domaine spatial au domaine fréquentiel.
    Les opérations dans le domaine fréquentiel sont les mêmes (avec la DCT, je répète) que le domaine spatial.
    Ajouter ta marque z dans le domaine fréquentiel revient à transformer ta marque puis à l'insérer en fréquentiel.
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  3. #3
    Membre du Club Avatar de meera
    Inscrit en
    Mai 2006
    Messages
    294
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 294
    Points : 47
    Points
    47
    Par défaut
    Bien sûr je connais les fonctions dct1 et idct2 de matlab.
    Mais je voudrais programmer la transformée DCT par calcul (car après j'utilise ce calcul quand je programme en vc++)
    Mais ma question est : est-ce que lorsque j'additionne l'image (après application de DCT) + marque (qui est dans le domaine spatial) est correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=1:M
         for j=1:M
            w(i,j) = y(i,j) + z(i,j);              
        end
    end
    et ma deuxieme question est : quand je dois utiliser la relation F= c*f*c'
    car dans mon code j'ai seulement calculé les coefficients DCt y(i,j)
    ???????

  4. #4
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    déjà tes 2 boucles tu peux les enlever!!
    te donnera le même résultat (base de la prog MATLAB -> vectorisation)
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

Discussions similaires

  1. code matlab--> code C
    Par brel380 dans le forum MATLAB
    Réponses: 1
    Dernier message: 21/05/2007, 10h30
  2. Utilliser du code matlab dans Java
    Par mehdiing dans le forum MATLAB
    Réponses: 1
    Dernier message: 06/05/2007, 11h36
  3. Transcrire une fonction mathématique en code Matlab
    Par casper84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/03/2007, 17h04
  4. Utilisation du code MATLAB dans environnement .NET
    Par SOPRA-Eherve dans le forum MATLAB
    Réponses: 5
    Dernier message: 28/11/2006, 12h43

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