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 :

Segmenter une image


Sujet :

OpenCV

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut Segmenter une image
    Bonjour à tous!
    J'affiche l'histogramme de mon image qui est composée d'un fond blanc et d'un disque rouge. Un peu comme le drapeau du Japon d'ailleurs...

    Bref, mon histogramme des niveaux de gris sur 8 bits me donne 2 composantes, une blanche très grande et une rouge beaucoup plus petite. J'aimerais couper cette composante blanche de l'histogramme et ne garder que la rouge.
    J'ai essayé avec la fonction cvThreshold en imposant un seuil inférieur à la composante blanche mais sans succès.
    Avez vous une autre idée??

    En vous remerciant par avance.

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Par défaut
    Salut,

    Citation Envoyé par romain_t Voir le message
    Bref, mon histogramme des niveaux de gris sur 8 bits me donne 2 composantes, une blanche très grande et une rouge beaucoup plus petite.
    Si tu travail avec les niveaux de gris, ça m’étonnerais que tu est une composante rouge!

    Si tu travail avec une image a niveaux de gris et donc tu as le fond qui est blanc et ton disque une certaine valeur (si c'etait la meme valeur de rouge pour chaque pixel du disque au depart) il faut que tu gardes les pixels < seuil

    donc avec cvThreshold il faut tuiliser le flag thresholdType=CV_THRESH_BINARY_INV:
    dst(x,y) = 0, if src(x,y)>threshold
    maxValue, otherwise

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Je me suis mal exprimé, je sais qu'en niveau de gris, on ne peut pas avoir de rouge...
    Mais c'est la représentation du rouge à un certain niveau de gris sur l'histogramme que je voulais garder. Donc j'ai trouvé la fonction thresholdHist() mais elle ne permet pas de découper une bande. Elle permet de supprimer les composantes de l'histogramme en dessous d'un seuil. Or je veux isoler une bande...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    La solution que je croyais avoir trouvée était d'inverser l'image. Mon image étant codée sur 8 bits, mon histogramme était alors composé d'une composante à 0 (la blanche inversée) et d'une composante rouge inversée vers les 200 je suppose. Mais en utilisant la fonction thresholdHist(histogramme,100), il me coupe encore et toujours la composante rouge, alors qu'il devrait couper la blanche étant inférieure à 100.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Par défaut
    Il y a un truc que je pige pas dans ce que tu veux faire.
    Si tu as inversé ton image et que tu as un histogramme avec deux composantes (0 pour le fond et disons 200 pour le rouge).
    Tu as donc déja une image binaire et ton cercle est déja extrait donc le threshold ne sert a rien??

    Ou alors j'ai mal compris et tu as plusieurs composantes pour ton disque rouge dont une principale et tu veux la garder.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    En fait, cette image est une simple représentation de photographies successives que je veux prendre et dont je veux observer l'évolution. La partie à observer est l'évolution du corps rouge. Si je venais à avoir un disque rouge plus gros, j'aurais une augmentation du pic du niveau de gris correspondant au rouge et une baisse du pic de celui correspondant au blanc. Le problème c'est que ce pic de blanc est énorme car il correspond au fond de l'image. Et je veux détecter une évolution par rapport au maximum de l'histogramme. C'est pour cela que je veux isoler mon pic blanc en fait..

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Par défaut
    Dans ce cas la pourquoi n'utilise tu pas la fonction suivante
    cvQueryHistValue_1D(CvHistogram hist, int idx0);


    tu sais que ton fond est noir (ou blanc) donc tu connais l'index et tu peux connaitre la valeur du pic. Apres tu compare avec ce que tu avais avant et tu en deduit si ton fond à augmenter ou non.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Daccord, dans ce cas là ix0 serait l'abcisse de mon histogramme où se trouve le rouge c'est ça?? Mais comme je fais pour trouver sa valeur???

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Par défaut
    indx0 peut être soir l’abscisse de la composante rouge soit de la blanche. Car vu que tu as une image binaire donc seulement 2 composantes ça importe peu.
    Si tu veux l'information par rapport au fond indx0=0 (fond noir) ou indx0=255 (fond blanc).
    Si tu veux savoir la valeur de ta composante rouge donc du niveau de gris correspondant parcours juste tout les pixels de l'image et des que tu as rencontré un qui est différent de la valeur du fond, tu as la valeur de ta composante pour le cercle et indx0= cette valeur.

    Dans le premier cas si la valeur diminue, le nombre de pixels appartenant au fond diminue donc le cercle augmente
    Dans le deuxième cas si la valeur diminue, la taille de du cercle diminue

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Merci beaucoup, cette fonction est équivalente à cvGetHistValue_1D non??
    Bon ben je vais travailler tout cela.
    Ce que j'aimerais faire c'est observer le comportement de la pièce et détecter un feu à partir d'un capteur d'images.
    Je prends des images à des intervalles de temps différents, je réalise l'histogramme de cette image, et je récupère les valeurs des composantes rouges de mon histogramme et j'observe leur évolution en fonction du temps.

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 84
    Par défaut
    Oui ça permet de faire la même chose c'est juste que
    float *cvGetHistValue_*D() retourne un pointeur sur la composante indx0.
    C'est juste une méthode plus rapide si tu dois accéder de nombreuses fois a ton histogramme.

    Ok donc finalement tu ne travailles pas avec une image binaire, si tu as plusieurs composantes rouges et surement d'autres pour le coup.

  12. #12
    Membre éclairé Avatar de GabrielD
    Homme Profil pro
    ingénieur de recherche
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur de recherche

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    Autre idée si tu souhaites segmenter ton image et sans passer par l'histogramme.

    tu split ton image: tu obtiens alors 3 images CV_8UC1 (niveaux de gris):
    une correspondant au bleu, une au vert et une au rouge.
    tu sais, à priori, que la zone qui t’intéresse contient très peu de vert et de bleu.
    tu prends alors l'image correspondant au bleu (ou au vert) et tu fais un seuillage dessus (plus précisément un seuillage inversé). Il ne te reste alors plus qu'à te servir de cette image comme un masque sur la 1ere.
    En clair (ce n'est pas la syntaxe)
    • Img = Image de départ
    • split(img)->imgB, imgV, imgR
    • seuillage_inverse(imgB)->mask_rouge
    • mask_rouge&Img = partierouge conservée, partie blanche = (0,0,0)


    Pour la syntaxe: la doc OpenCV est ton amie

    Dans tous les cas, il est judicieux de travailler sur les composantes BRG de l'image et non pas une version échelle de gris car tu perds de l'information.

    Dans le cas de ton application, les fonctions de morphologie mathématique proposés pourrons t'être utile

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Merci beaucoup pour toutes vos réponses, je reviendrai surement vers vous Juste deux autres petites questions :

    comment se servir d'une image comme un masque pour une autre image??
    Il n'y a pas de fonctions bien définies??

    Est-ce qu'il existe un moyen de graduer les axes de nos histogrammes?? J'ai cherché dans la doc mais en vain.

  14. #14
    Membre éclairé Avatar de GabrielD
    Homme Profil pro
    ingénieur de recherche
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur de recherche

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Par défaut
    sur OpenCV tu as cv::bitwise_...

Discussions similaires

  1. [AIR] segmenter une image en bloc
    Par shagun dans le forum Flex
    Réponses: 0
    Dernier message: 19/01/2012, 09h00
  2. Idée pour mieux segmenter une image riche en structures?
    Par mickeynad dans le forum Traitement d'images
    Réponses: 19
    Dernier message: 29/07/2011, 20h00
  3. utilisation de la LPE pour segmenter une image couleur
    Par sikarce dans le forum Traitement d'images
    Réponses: 6
    Dernier message: 16/06/2011, 00h23
  4. fonction pour segmenter une image de visage (niveau de gris)
    Par masterinfo dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 05/06/2009, 17h13
  5. Segmenter une image par une gaussienne 2d
    Par RASS15 dans le forum Images
    Réponses: 1
    Dernier message: 12/12/2006, 10h44

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