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

Traitement d'images Discussion :

Probleme Filtrage d'image en c


Sujet :

Traitement d'images

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut Probleme Filtrage d'image en c
    Bonjour , en effet j'ai un gros problème que je n'arrive pas à résoudre alors une petite aide sera la bienvenue.
    voilà je charge mon fichier .ppm dans une matrice.

    XXX
    XXX
    XXX

    J'entoure cette matrice par 1 ligne/colonne de 0 (pour l'application des filtres)

    OOOOO
    OXXXO
    OXXXO
    OXXXO
    OOOOO

    si j'ouvre puis je sauvegarde le même fichier tout se passe bien.


    Passant maintenant à l'application du filtre :

    PAR EXEMPLE effet FLOU :


    Code C : 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
     
    void appliquerFiltre(char* name)
    {
    //taille image 
      MatriceImgROut=malloc_matrice_2d(length,width);
      MatriceImgVOut=malloc_matrice_2d(length,width);
      MatriceImgBOut=malloc_matrice_2d(length,width);
      coefficients=malloc_matrice_2d(3,3);
     
     
     
    int h , w , i , j ;
     
     
     
        coefficients[0][0] = 1 ;
        coefficients[0][1] = 1;
        coefficients[0][2] = 1 ;
        coefficients[1][0] = 1;
        coefficients[1][1] = 1;
        coefficients[1][2] = 1 ;
        coefficients[2][0] = 1 ;
        coefficients[2][1] = 1 ;
        coefficients[2][2] = 1 ;
     
    for (h = 0 ; h < length ; h++)
      for (w = 0 ; w < width  ; w++)
      {
     
     
         MatriceImgROut[h][w] = 0 ;
         MatriceImgVOut[h][w] = 0 ;
         MatriceImgBOut[h][w] = 0 ;
     
     
         for (i = 0 ; i < 3 ; i++)
           for (j = 0 ; j < 3 ; j++)
     	{
             MatriceImgROut[h][w] += coefficients[i][j] * MatriceImgR[h+i][w+j] ;
             MatriceImgVOut[h][w] += coefficients[i][j] * MatriceImgV[h+i][w+j] ;
             MatriceImgBOut[h][w] += coefficients[i][j] * MatriceImgB[h+i][w+j] ;
     	}
     
    	MatriceImgROut[h][w] = MatriceImgROut[h][w]/9 ;
     
     	if(MatriceImgROut[h][w]<0)
            	MatriceImgROut[h][w]=0;
     	else 
     		if(MatriceImgROut[h][w]>255)
              	MatriceImgROut[h][w]=255;
     
     	MatriceImgVOut[h][w] = MatriceImgVOut[h][w]/9;
     
     	if(MatriceImgVOut[h][w]<0)
            	MatriceImgVOut[h][w]=0;
     	else 
     		if(MatriceImgVOut[h][w]>255)
              	MatriceImgVOut[h][w]=255;
     	MatriceImgBOut[h][w] = MatriceImgBOut[h][w]/9;
     
     	if(MatriceImgBOut[h][w]<0)
            	MatriceImgBOut[h][w]=0;
     	else 
     		if(MatriceImgBOut[h][w]>255)
              	MatriceImgBOut[h][w]=255;
     
     
      }
    puis le ecrire tout sur le fichier de sortie

    Code C : 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
     
     /*--sauvegarde de l'entete--*/
      fprintf(fic,"P3");
      fprintf(fic,"\n# IMG Created , %s",ctime(&tm));
      fprintf(fic,"%d %d",length,width);
      fprintf(fic,"\n255\n");
     
      /*--enregistrement--*/
      for(i=0;i<length;i++) 
      for(j=0;j<width;j++) 
        {
         fprintf(fic,"%d\n",(int)MatriceImgROut[i][j]);
         fprintf(fic,"%d\n",(int)MatriceImgVOut[i][j]);
         fprintf(fic,"%d\n",(int)MatriceImgBOut[i][j]);
     
        }

    Le résultat j'ai un effet flou mais image impossible à reconnaitre on dirait que j'ai pris juste un morceau vertical et je l'ai mis 3 fois :s


    merci de regarder le code si jamais vous voyez quelque chose .
    Images attachées Images attachées   

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonsoir,

    c'est normal que ça ne ressemble à rien, car il y a deux erreurs dans ton programme :
    - La première c'est que tu appliques ton filtre de ma nière non centrée !!! Tu parcours ton filtre de 0 à 2 et tu l'appliques tel quel alors que pour le centrer il faut l'appliquer de -1 à 1. Mais comme on ne peut définir d'indice négatifs, il te faudrait l'appliquer de 0 à 2 et décaler en mettant un -1.
    - La deuxième, c'est que tu fais un seuil avant de diviser par neuf, il faut faire l'inverse.

    Apparté, tant que tu utilises des coefficients positifs et que tu divises ensuite par la somme des coefficients, tu ne pourras jamais déborder, donc inutile de seuiller.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut
    Bonsoir

    - effectivement pour le seuil il fallait dévisé avant .
    -hors pour la premiere partie de votre reponse honnetement j'ai rien compris pourriez vous me l'expliquer sur mon exemple de code . en effet je n'ai jamais fait du traitement d'image ( c'est le debut d'une application parallele UPC ce que je fait )
    merci encore .

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    for (h = 1 ; h < length-1 ; h++)
      for (w = 1 ; w < width-1  ; w++)
      {
     
         MatriceImgOut[h][w] = 0 ;
     
         for (i = -1 ; i <= 1 ; i++)
           for (j = -1 ; j <=1 ; j++)
           {
               MatriceImgOut[h][w] += coefficients[1+i][1+j] * MatriceImgR[h+i][w+j] ;
           }
     
          MatriceImgOut[h][w] /= 9 ;
      }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut
    Ah mais justement ceci ne change rien ( j'ai tester ) a mon programme puisque l'image d'origine est de cette forme :


    length*width

    XXXX
    XXXX
    XXXX

    et que je l'ai encadré avant de faire la multiplication par une ligne/colone de Zéro (0) ce qui revient a la centré non ?

    length+2*width+2
    000000
    0xxxx0
    0xxxx0
    0xxxx0
    000000

    et donc les boucle ca revient au même mais parcontre on constate comme un decalage la même partie de l'image se reproduit a plusieur reprise .
    mais je ne le vois pas vraiement .

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    A priori, je dirai que tu as inversé "largeur" et "hauteur" dans ton fichier de sortie.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre émérite Avatar de b_reda31
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 899
    Par défaut
    Salut,
    Comme vous l'a déja dit Toto,il y a une erreur lors de l'application de votre filtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (i = 0 ; i < 3 ; i++)
           for (j = 0 ; j < 3 ; j++)
     	{
             MatriceImgROut[h][w] += coefficients[i][j] * MatriceImgR[h+i][w+j] ;
             MatriceImgVOut[h][w] += coefficients[i][j] * MatriceImgV[h+i][w+j] ;
             MatriceImgBOut[h][w] += coefficients[i][j] * MatriceImgB[h+i][w+j] ;
     	}
    Ici vous ne multipliez pas les bonnes valeurs avec les bons coefficients.
    La nouvelle valeur de MatriceImgROut[h][w] devrait etre :
    MatriceImgROut[h][w]=coeff[0,0]*matriceImgR[h-1][w-1]+...+coeff[2][2]*matriceImgR[h+1][w+1]
    Alors que dans votre code voici ce qui est calculé:
    MatriceImgROut[h][w]=coeff[0,0]*matriceImgR[h][w]+...+coeff[2][2]*matriceImgR[h+2][w+2].

    En reglant ce problème vous tomberez dans un autre qui est la gestion des bords(cas ou h=0 par exemple)Il existe plusieurs mécanismes permettant de gerér ça.Voici un Tut trés interressant qui aborde ce sujet.Merci encore à son auteur .

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

Discussions similaires

  1. Probleme Inserer une image
    Par Federico_28 dans le forum IHM
    Réponses: 2
    Dernier message: 24/04/2006, 12h05
  2. [bmp]probleme avec les images dont la largeur est >256
    Par delfare dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 15/02/2006, 16h59
  3. [ImageMagick] Redimensionnement d'image
    Par GTJuanpablo dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 05/01/2006, 14h05
  4. Problème avec l'image initrd
    Par Invité dans le forum Administration système
    Réponses: 1
    Dernier message: 21/12/2005, 16h16
  5. [débutante]Probleme de liens image dans JSP/Servlet
    Par celine31 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/11/2004, 15h51

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