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

C Discussion :

Réduction d'images en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de O( N )
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2006
    Messages : 126
    Par défaut Réduction d'images en C
    Bonjour a tous,

    Je réalise actuellement un logiciel perso sur le traitement des images et j'essaie de faire de la réduction d'images,
    mais voilà le problème, lorsque je réduis de deux (ou plus)
    l'image sur la hauteur, elle est réduite des deux côtés et est mise bout à bout
    avec le nombre de réduction demandée 3 images pour une réduction de 3.

    exemple1 - Image Originale (avec 2):

    ////////\\\\\\\\
    ////////\\\\\\\\
    JJJJJJJJIIIIIIII
    JJJJJJJJIIIIIIII


    exemple2 - Image Originale : (avec 3)

    /////////\\\\\\\\
    /////////\\\\\\\\
    /////////\\\\\\\\
    JJJJJJJJJIIIIIIIII
    JJJJJJJJJIIIIIIIII
    JJJJJJJJJIIIIIIIII
    /////////\\\\\\\\\
    /////////\\\\\\\\\
    /////////\\\\\\\\\

    deviennent
    1)
    ////\\\\////\\\\
    JJJJIIIIJJJJIIII

    2)
    ///\\\///\\\///\\\
    JJJIIIJJJIIIJJJIII
    ///\\\///\\\///\\\

    au lieu de

    1)
    ////////\\\\\\\\
    JJJJJJJJIIIIIIII

    2)
    /////////\\\\\\\\
    JJJJJJJJJIIIIIIIII
    /////////\\\\\\\\

    Est-ce un problème fréquent d'avoir ceci,
    car je me suis trompé quelque part , mais ceci est encore frais et la je ne vois pas du tout, même avec des exercices papiers


    Voici un bout du code :

    **********************************************
    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
     
    Image_PPM* Reduire_La_Taille(Image_PPM* im, int reduc_X, int reduc_Y, Pix* f(unsigned char*, int, int, int, int, int, int)) {
      if (im != NULL) {
        long max = im->NbColonne * im->NbLigne * 3,
             maxNouveau = max / (reduc_X*reduc_Y);
        unsigned char* matrice = (unsigned char*) malloc(sizeof(unsigned char) * 
        maxNouveau);
        if (matrice == NULL) return NULL; // gestion d'erreur à mettre ici
        // envoyer un message windows à afficher ...
     
        long i = 0, j = 0, cpt = 0,
             nbc = im->NbColonne/reduc_X, nbl = im->NbLigne/reduc_Y;
        Pix* p = NULL;
     
        for (cpt = 0; cpt < maxNouveau; cpt+=3) {
          i = ((cpt / 3) % nbc);// X
          j = ((cpt / 3) / nbc);// Y      
          p = f(im->Couleur, im->NbColonne, im->NbLigne, nbc, nbl, i, j);
          matrice[cpt] = p->Rouge;
          matrice[cpt+1] = p->Vert;
          matrice[cpt+2] = p->Bleu;
          LibererPix(p);
        }
        LibererDonnees(im);
        im->NbColonne = nbc;
        im->NbLigne = nbl;
        im->Couleur = matrice;
     
        return im;    
      }
      return NULL;
    }
     
    Pix* Prendre_Max_Du_Groupe(unsigned char* mat, int t_X, int t_Y, int nt_X, int nt_Y, int pos_X, int pos_Y) {
      if (mat != NULL) {
        long //i = 0 , j = 0,
             avance_X = t_X / nt_X,
             avance_Y = t_Y / nt_Y;
        Pix* p = CreerPix3(mat[(pos_X*avance_X*3)+(pos_Y*avance_Y*t_X*3)],
                           mat[(pos_X*avance_X*3)+(pos_Y*avance_Y*t_X*3)+1],
                           mat[(pos_X*avance_X*3)+(pos_Y*avance_Y*t_X*3)+2]);
    /*
        for (i = 0; i < avance_X; i++) {
          for(j = 0; j < avance_Y; j++) {
            if ((p->Bleu + p->Rouge + p->Vert) < 
                (mat[((pos_X+i)*avance_X*3)+((pos_Y+j)*avance_Y*t_X*3)] + 
                 mat[((pos_X+i)*avance_X*3)+((pos_Y+j)*avance_Y*t_X*3)+1] +
                 mat[((pos_X+i)*avance_X*3)+((pos_Y+j)*avance_Y*t_X*3)+2])) {
              p->Rouge = mat[((pos_X+i)*avance_X*3)+((pos_Y+j)*avance_Y*t_X*3)];
              p->Vert = mat[((pos_X+i)*avance_X*3)+((pos_Y+j)*avance_Y*t_X*3)+1];
              p->Bleu = mat[((pos_X+i)*avance_X*3)+((pos_Y+j)*avance_Y*t_X*3)+2];
            }
          }
        }*/
        return p;
      }
      return NULL;
    }
    **********************************************

    le code du main est :
    Reduire_La_Taille(_imageDeTravail, 2, 1, Prendre_Max_Du_Groupe); // réduction de la hauteur par 2

    Merci déjà à ceux qui ont eu le courage de lire ceci

    et j'espère que mon C ne vous a pas fait trop horreur .

    Si quelqu'un voit le truc, ce sera mieux que moi ce soir

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par O( N )
    Je réalise actuellement un logiciel perso sur le traitement des images et j'essaie de faire de la réduction d'images,
    C'est un problème d'algorithme, pas de C...

    http://www.developpez.net/forums/forumdisplay.php?f=60

    Ca devient un problème de C (réalisation) une fois que tu es sûr d'avoir le bon algorithme (conception).

  3. #3
    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
    Bonjour,

    est ce que tu as regardé les discussions sur ce forum traitant des problèmes de zoom ?

    Cela te permettrai d'avoir une idée du bon algorithme à utiliser.
    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.

  4. #4
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Je crois qu’il y a plein de truc qui ne vont pas.

    Va falloir que tu arranges ton code et réfléchisse dessus encore.

    Quelques indices.


    LibererDonnees(im); // libération des données bien placé ?
    maxNouveau = max / (reduc_X*reduc_Y); // reduc_X et reduc_Y, pourquoi c’est une mauvaise idée de les utiliser ici et de travailler ensuite avec ?

    Optimisation :

    LibererPix(p); // es ce bien utile pour chaque pixel ?
    CreerPix3 // idem
    (pos_X*avance_X*3)+(pos_Y*avance_Y*t_X*3) // à chaque fois ?


    Allé hop au travail
    On fera un check ensuite des avancés,
    et essaie de ne pas poster le code en commentaire que tu n'utilises pas...

  5. #5
    Membre confirmé Avatar de O( N )
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2006
    Messages : 126
    Par défaut
    Merci à tous deux

    En fait (Emmanuel) j'ai écrit sur papier les tests et sur le papier cela fonctionne ,
    c'est pour cela que je l'ai posté sur le forum 'C'
    ( Je suis un croyant , car je crois que mon algorithme fonctionne,
    mais DIEU Ordinateur me fait comprendre que NON ).

    (ToTo13) Je ne savais pas qu'il y avait un post sur les problèmes de zoom,
    mais de toute façon je n'aurai pas regardé, car le but est de trouvé pas d'avoir à lire.

    Merci en tout cas, je vais lire ce post maintenant que j'ai fait,je crois, l'essentiel du code.

  6. #6
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    A oui j'aime bien aussi le long et commentaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     long //i = 0 , j = 0,
             avance_X = t_X / nt_X,
             avance_Y = t_Y / nt_Y;


    ps: à relier aussi à ce que j'ai dis précédemment
    // reduc_X et reduc_Y, pourquoi c’est une mauvaise idée de les utiliser ici et de travailler ensuite avec ?

  7. #7
    Membre confirmé Avatar de O( N )
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2006
    Messages : 126
    Par défaut
    Merci Ti-R (voila mes explications )

    - LibérerDonnees(im) = libère la place prise par les anciennes données

    - maxNouveau est fait pour clarifier la lecture.
    (qui sera entièrement reprise apres fonctionnement de la fonction)
    C'est sur dans ces cas là que nbc (nombre de Colonne) et nbl (nombre de ligne) sont dans le même cas que maxNouveau.

    Pour reduc_X et reduc_Y j'utilise les nouveaux formats générés par eux, c'est il me semble pareil ( voir le code PrendreLeMaxDuGroupe(...) )

    J'ai commenter ce code car, je voulais vous montrer le code final, mais l'erreur ne vient pas de la fonction Prendre...
    mais il me semble plutot vers la premiere fonction, au vue des résultats dans le fait que j'ai de nouveau une sélection d'anciennes positions (puisque répétées)

  8. #8
    Membre confirmé Avatar de O( N )
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2006
    Messages : 126
    Par défaut
    Le truc drôle que j'ai trouvé , c'est qu'en changeant certaines lignes de code comme suit :

    p = f(im->Couleur, im->NbColonne, im->NbLigne, nbc, nbl, i, j);

    par

    p = f(im->Couleur, im->NbLigne, im->NbColonne, nbl, nbc, j, i);

    puis

    im->NbColonne = nbc;
    im->NbLigne = nbl;

    par

    im->NbColonne = nbl;
    im->NbLigne = nbc;

    J'obtiens la solution avec une rotation d'angle 90 (normal puisque j'inverse hauteur et largeur)
    avec un effet mirroir (que je n'avais pourtant pas encore développé)

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

Discussions similaires

  1. Réduction d'images automatique
    Par fearyourself dans le forum Général Python
    Réponses: 4
    Dernier message: 04/03/2012, 00h18
  2. Réponses: 3
    Dernier message: 29/01/2009, 16h11
  3. [Système] Réduction d'images
    Par Typhon dans le forum Langage
    Réponses: 7
    Dernier message: 14/02/2007, 16h25
  4. Réduction d'images qui ne fonctionne pas
    Par mazou dans le forum Langage
    Réponses: 10
    Dernier message: 16/06/2006, 12h54
  5. Agrandissement/réduction d'image par AMR
    Par progfou dans le forum C
    Réponses: 2
    Dernier message: 13/05/2006, 19h09

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