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

OpenCV Discussion :

Coloration d'un pixel et de ses voisins de même couleur


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut Coloration d'un pixel et de ses voisins de même couleur
    Bonsoir,

    Voila alors j'aimerai pouvoir, en partant d'une image binarisé, colorié tout les points blancs qui se touche d'une certaine couleur, plus précisément colorier chaque amas pixel de mon image binarisé d'une couleur différente.

    Seulement je n'arrive pas à changer de couleur à chaque fois c'est toujours la même pour tous les pixels blancs de mon image binarisé

    Voici ce que j'ai fais :

    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
    void convert (*IplImage binarized_image) {
        IplImage* hsv_image = cvCreateImage (cvGetSize (binarized_image), binarized_image, 3);
        int h = 0;
     
        for (int x=0;x<binarized_image->width;x++) {
            for (int y=0;y<binarized_image->height;y++) {
                if (((uchar *)(binarized_image->imageData + y*binarized_image->widthStep))[x] == 255) {
                    CvScalar ddd = cvGet2D (hsv_image, y, x);
                    //if (ddd.val[0] == h)
     
                    CvScalar colour = cvScalar (h, 255, 255);
     
                    cvSet2D (hsv_image, y, x, colour);
                    voisins (hsv_image, x, y, colour); // donne la couleur "colour" au pixel (x,y) et à tous ses voisins blancs
     
                    //h = (h+10) % 180;
                } else {
                    cvSet2D (hsv_image, y, x, cvScalar (0));
                }
            }
        }
        //cvCvtColor (hsv_image, hsv_image, CV_HSV2BGR);
        cvShowImage ("maskPerso", hsv_image);
        cvReleaseImage (&hsv_image);
    }
    C'est une image de 320*240.

    Quelqu'un aurait l'idée d'une astuce pour résoudre ce petit problème ?

    Merci d'avance

  2. #2
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    tu veux changer de couleur à chaque pixel blanc trouvé ? (attention au traitement des voisins dans se cas, deux pixels blanc avec un voisin commun, tu le coloreras de quelle couleur)

    Si c'est ca incrémente h à la fin de ta boucle (je mettrais un off set pour bien voir la différence et un modulo 255 =) )

  3. #3
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Et bien je le traiterait de la même façon que les autres non ?

    Sinon voici ce que j'ai fais :

    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
    bool isColorized (IplImage* img, IplImage* binarized_image, int i, int j) {
        if (((uchar *)(binarized_image->imageData + (j)*binarized_image->widthStep))[i] == 255) {
            CvScalar ddd = cvGet2D (img, j, i);
     
            if (ddd.val[0] == 0 && ddd.val[1] == 0 && ddd.val[2] == 0) {
                return true;
            }
        }
     
        return false;
    }
     
    void voisins (IplImage* img, IplImage* binarized_image, int i, int j, CvScalar colour) {
        if (isColorized (img, binarized_image, i, j) && (j != 320 && i != 240) && j >= 0) {
            cvSet2D (img, j, i, colour);
     
            voisins(img, binarized_image, i, j+1, colour);
            voisins(img, binarized_image, i+1, j, colour);
            voisins(img, binarized_image, i+1, j-1, colour);
            voisins(img, binarized_image, i+1, j+1, colour);
        }
    }
     
    void convert (IplImage* binarized_image) {
        IplImage* hsv_image = cvCreateImage (cvGetSize (binarized_image), binarized_image->depth, 3);
        int actuel_couleur = 0;
     
        for (int i=0;i<hsv_image->width;i++) {
            for (int j=0;j<hsv_image->height;j++) {
                cvSet2D (hsv_image, j, i, cvScalar (0));
            }
        }
        for (int i=0;i<binarized_image->width;i++) {
            for (int j=0;j<binarized_image->height;j++) {
                if (((uchar *)(binarized_image->imageData + j*binarized_image->widthStep))[i] == 255) {
                    CvScalar colour = cvScalar (actuel_couleur, 255, 255);
     
                    voisins (hsv_image, binarized_image, i, j, colour); 
                    actuel_couleur = (actuel_couleur+10) % 180;
                }
            }
        }
        cvCvtColor (hsv_image, hsv_image, CV_HSV2BGR);
        cvShowImage ("maskPerso", hsv_image);
        cvReleaseImage (&hsv_image);
    }
    Cela ne marche pas tout à fais et je n'arrive pas à voir ou cela bloque. Voici aussi un petit screen du résultat.

    http://www.hostingpics.net/viewer.ph...6114pixels.png

    Une idée de ce qui cloche ?

  4. #4
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     if (ddd.val[0] == 0 && ddd.val[1] == 0 && ddd.val[2] == 0) {
                return true;
            }
    je ne connais pas trop l'espace HSV mais si j'ai bien capté ca c'est du noir or deux ligne avant tu viens de valider que ton pixel est blanc.

    ce qui te gène c'est les tas de même couleur ?

    edit: plutot les soucis de couleur qui se mélange je pense, test si le pixel voisin est différent de blanc et noir tu fais rien, tu colore deux fois le pixel sur lequel tu te trouve fait le qu'une seule fois.

  5. #5
    Expert confirmé

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Par défaut
    Non en fait c'est ce que je veux, plus précisément, tu peux voir sur mon screen qu'il y a plusieurs petits amas de pixels qui ne se touchent pas. Moi ce que je veux c'est colorier chacun de ses amas d'une couleur différente.

    Sinon je n'ai pas très bien compris ton edit tu pourrais détailler stp

  6. #6
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (((uchar *)(binarized_image->imageData + (j)*binarized_image->widthStep))[i] == 255) 
    est ce que le pixel est blanc ?
    {
            CvScalar ddd = cvGet2D (img, j, i);
           il est blanc mais est ce qu'il est noir ? 
            if (ddd.val[0] == 0 && ddd.val[1] == 0 && ddd.val[2] == 0) {
                return true;
            }
        }
    le problème vient des voisins d'ou les changements de couleur dans les amas, faudrait plutot faire est ce que j'ai un voisin blanc ? oui est ce que ce voisin a des voisins blanc et ainsi de suite tant que tu trouve des voisins blanc tu te balade dans le nuage.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 48
    Par défaut cvGet2D sa urj
    la fonction cvGet2D ne marche pas pour moi est ce que qq peut m'aider, je fais la détection de mouvement dans une séquence vidéo
    je capture deux frames qui se succède ensuite j'accede au pixel des image.
    au début j'ai cru que c'était à cause des deux capture mais non pas du tout quand je fais cvGet2d pour une seule image et j'affiche la valeur il me sort que des zéro et pourtant il ya une image

    Merci de m'aider

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

Discussions similaires

  1. La France plus en proie au stress que ses voisins européens ?
    Par Stéphane le calme dans le forum Actualités
    Réponses: 13
    Dernier message: 28/05/2013, 09h49
  2. Réponses: 0
    Dernier message: 23/06/2009, 17h06
  3. Réponses: 4
    Dernier message: 07/04/2008, 10h48
  4. Coloration d'un <select> en js pour avoir le même visuel sous Firefox que IE7
    Par Tchupacabra dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/08/2007, 09h12
  5. [Pygame]Supprimer/masquer les pixels d'une même couleur sur une image
    Par Mysti¢ dans le forum Programmation multimédia/Jeux
    Réponses: 2
    Dernier message: 10/05/2007, 13h40

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