Annonce

Réduire
Aucune annonce.

Croissance de région (C++)

Réduire
X
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Croissance de région (C++)

    Bonjour,

    J'aurais besoin de vôtre aide pour débugguer un algorithme de croissance de région.

    Je sais que ca n'a aucun rapport avec la sécurité informatique (donc avec le thème du forum^^), mais je bloque vraiment et comme j'ai plus beaucoup de temps pour le corriger (c'est un projet de la fac) je demande votre aide.

    L'algorithme est très simple mais ca fait 2 semaines que je bloque a cause du même bug (surement un truc tout simple que je vois pas comme ca arrive souvent).

    Voici l'algo que j'ai implémenté :
    Code:
    for (int i = 0; i < m_regions.size(); i++) {
            PixelRegion pixel = m_regions.at(i).getPixelsLimit().at(0);
            if (matPixels[pixel.getCoordinate().getY() * image.cols + pixel.getCoordinate().getX()].getGreyLvl() > 10) {
                neighbors = createListNeighbors(pixel, matPixels);
                for (int j = 0; j < neighbors.size(); j++) {
                    PixelRegion neighbor = neighbors.at(j);
                    Coordinate coordinate = neighbors.at(j).getCoordinate();
                    if (matPixels[coordinate.getY() * image.cols + coordinate.getX()].getIdRegion() == -1) {
                        if (isHomogeneous(m_regions.at(i), neighbors.at(j))) {
                            neighbors.at(j).setIdRegion(m_regions.at(i).getId());
                            matPixels[coordinate.getY() * image.cols + coordinate.getX()].setIdRegion(m_regions.at(i).getId());
                            int sumGrey = m_regions.at(i).getSumGreyLvl();
                            sumGrey += neighbors.at(j).getGreyLvl();
                            m_regions.at(i).setSumGreyLvl(sumGrey);
                            int nbPix = m_regions.at(i).getNbPixels() + 1;
                            m_regions.at(i).setNbPixels(nbPix);
                            m_regions.at(i).addPixelLimit(neighbors.at(j));
                            //cout << "pixel has : " << neighbors.size() << " neighbors" << endl;
                            vector<PixelRegion> newNeighbors = createListNeighbors(neighbors.at(j), matPixels);
                            neighbors = concatVectors(neighbors, newNeighbors);
                            //neighbors.erase(neighbors.begin() + j);
                            //cout << "pixel has : " << neighbors.size() << " neighbors" << endl;
                        }
                    }
                }
            }
        }
    matPixels[] est un tableau pour stocker les pixels de l'image avec l'id de la région à laquelle ils appartiennent.
    m_regions me permet de stocker la liste des pixels germes au début, puis de tous les pixels de la région à la fin (inutile certes ca vient d'une ancienne version et je n'ai pas encore corrigé ca)
    isHomogeneous me permet de déterminer si un pixel doit être ajouté à la région
    createListNeighbors retourne la liste des voisins d'un pixel.


    Mon problème :
    Les régions calculées sont apparemment "étirées" en largeur.
    En gros quand un pixel est ajouté à une région, les autres pixels sur sa droite le sont aussi.
    Si je me trompe pas, ca donne 3 pixels modifiés dans le tableau au lieu d'un seul pour chaque ligne. par contre pas de problème en hauteur (enfin j'ai pas l'impression).

    J'ai vérifié les données dans le tableau et le problème vient bien d'ici (des pixels qui ne devraient pas sont affectés à une région) et pas de l'affichage.

    je vous met un screenshot du résultat :

    http://www.zimagez.com/zimage/screen...23089adaa0.php

    Tout ce qui est dessiné en rouge devrait correspondre à ce qui est en gris foncé.
    La zone à gauche du rouge correspond à la bande noire sur la gauche de l'image. ensuite le tour en rouge aussi devrait être à la place de la bande en gris foncé sur la gauche aussi...
    Toutes ces zones sont 3 fois plus larges qu'elles devraient.

    Voila si quelqu'un à une idée je lui dit merci d'avance!!!

    ps : Je sais que le code ne respecte pas les normes du C++ c'est mon premier programme avec ce langage et c'est plus chiant que prévu de s'y mettre apres le C et le Java alors soyez indulgents^^.

    ps2: le rectangle vert sert a rien c'était juste pour vérifier que l'affichage était correct
Chargement...
X