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 de compilation [Débutant]


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 31
    Points : 27
    Points
    27
    Par défaut erreur de compilation
    Bonjour à tous,

    voici le contexte de mon probléme,
    On nous a donné à faire en tp une fonction de convolution à programmé et du coup elle marchait trés bien avec une matrice de 256 et un filtre de taille 3. et du coup lorsque je m'est en paramètre de la fonction de convolution une image ,cela pose probléme
    voici le code de la convolution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function[img]=conv(I,filtre)
    [N M]=size(I);
    img = zeros(N);
    n=size(filtre,1);
    decal=ceil(n/2);
    for i=decal:1:N-(decal-1)
        for j=decal:1:N-(decal-1)
         V=I(i-(decal-1) : i+(decal-1) ,j-(decal-1) : j+(decal-1)   ).*filtre;
         img(i,j)=sum(sum(V));
        end 
    end
    end
    et le code principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    %% 2-2 Robustesse au bruit
    h= [0 -1 0;
        0 0 0;
        0 1 0];%matrice de filtrage 
    Y=imread('C:\Users\Ilias\Desktop\lena.pgm');
     T=uint8(randn(256,256));%création image bruiter
      O=T+Y;%image originale + image bruité
     J=conv(Y,h);%convolution avec le filtre verticale
    et voici ce qu'il m'affiche dans la fenetre command window:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Error using  .* 
    Integers can only be combined with integers of the same class, or scalar doubles.
     
    Error in conv (line 8)
         V=I(i-(decal-1) : i+(decal-1) ,j-(decal-1) : j+(decal-1)   ).*filtre;
     
    Error in test (line 23)
     J=conv(Y,h);%convolution avec le filtre verticale
    qui pourrait m'aidé à débugger ceux code ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Les pixels de l'image sont codés avec des entiers de classe Uint8 alors que ton filtre est en classe Double.

    Tu peux le vérifier comme ceci :

    Tu ne peux donc pas faire la multiplication matricielle terme à terme directement comme te l'indique MATLAB.

    Une solution consiste à convertir les valeurs des pixels de l'image en classe Double avant l'opération :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    J = conv(double(Y), h);
    Par contre, la variable J sera aussi en classe Double. Donc selon ce que tu comptes en faire ensuite, il te faudra peut être la convertir dans une autre classe…

    Pour finir, évite d'utiliser "conv" car c'est déjà le nom d'une fonction de MATLAB.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 53
    Points : 97
    Points
    97
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error using  .* 
    Integers can only be combined with integers of the same class, or scalar doubles.
    Signifie que ton filtre (h ici) n'est pas en uint8 (mais plus probablement en double) alors que ton image Y elle est en uint8. Les operation double uint8 ne sont pas permisent (V = I*filtre).
    Pour corriger cela, tu devrait passer ton image Y en double, faire la convolution, et éventuellement reconvertir le résultat final en uint8.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    merci beaucoup le probléme est résolu
    toute derniere question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Y=imread('C:\Users\Ilias\Desktop\lena.pgm');
     
     J=conv(double(Y),h);%convolution avec le filtre verticale
     imshow(J)
    comment la commande imshow peut afficher une image alors qu'elle en argument un double (J=double) ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Citation Envoyé par matlab31 Voir le message
    comment la commande imshow peut afficher une image alors qu'elle en argument un double (J=double) ?
    La documentation dit que imshow peut prendre en argument les types de données suivantes:
    Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

    Les "doubles" sont donc bien supportés par la fonction.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 31
    Points : 27
    Points
    27
    Par défaut
    D'accord .C'est plus compréhensible
    merci

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

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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