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 :

détection des sommets dans image binaire


Sujet :

OpenCV

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut détection des sommets dans image binaire
    bonjour,

    avant tout, je commence par vous décrire mon projet:
    en fait, le but est de détecter les sommets des demi-cercles dans des images prises a partir d'une camera (Vous trouverez un exemple d'image en fichier attaché en bas), et calculer la distance inter peak(sommet), tout en optimisant en temps de traitement

    a priori, je suis parti sur l'idée d'utiliser openCv sous C++
    voici une méthode qui pourrait marcher :
    -créer la matrice de l'image binaire
    -faire la somme des pixels noir ou blanc sur chacune des colonnes afin de tracer un histogramme de l'intensité sur les colonnes en fonction des coordonnées x et y,puis calculer le gradient de la fonction pour trouver les Peak de la fonction ( les point qui s'annulent correspondent aux peak),
    -calculer la distance euclidienne inter-peak.

    mais ça me semble une méthode complexe à réaliser , et je suis totalement bloqué.

    S'il vous plait, connaissez vous une méthode plus simple?

    Merci d'avance de votre aide


    Nom : Sans titre.png
Affichages : 608
Taille : 47,5 Ko

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Pour commencer, ton sujet est bien presente et clair, en plus une image. Cela donne envie de t'aider

    Tu parles d'une image binaire, mais tu nous donne une image en niveau de gris. Pour la suite, on va utiliser l'image ne niveau de gris.

    Premiere question tres importante, ton image est-elle toujours oriente de la meme maniere ?
    Si c'est le cas, alors la solution est plutot simple.

    En partant du principe que toutes tes images sont oriente de la meme maniere.
    1) Pour chaque colonne de ton image, tu calculs la somme des pixels.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vector<int> sum_colonne(image.cols,0);
    for (int y = 0; y < image.rows; y++)
       for (int x = 0; x < image.cols; x++)
          sum_colonne[x] += image.at<unsigned char>(y,x);
    Cela devrait faire l'affaire.

    2) Regarde la lib : persistence-1d
    C'est une lib tres simple qui te detecte les max/min dans un tableau de float. En plus elle a le bon gout d'etre rapide.

    3) Tu ne gardes que les maximums avec une persistence significative (lis la doc de la lib).

    Si tes images ne sont pas bien oriente. Alors il faudra d'abord detecter l'orientation de tes images.
    Tu pourras alors soit faire tourner l'image, soit creer le vecteur somme directement en prennant en compte l'orientation.

    Bonne chance.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    D’abord je te remercie beaucoup isangoma
    1)
    j'ai réussi à calculer l'intensité sur chacune des colonnes, mais j'ai un peu de mal l'afficher ( genre d'histogramme)

    2)
    j'ai vu la bibliothèque persistence, et j'ai pas trop compris ce que ça renvoi comme résultats, et comme entrée??? est-ce qu'on peut appliquer cette méthode à une matrice d'image??

    3)
    est-ce que tu connais un moyen de calculer la distance inter Peak une fois trouvés ?

    Merci d'avance

    et si t'a besoin de voir le code, tu me dira

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    1) Afficher l’histogramme c'est joli, mais pas forcement utile.
    Tu peux aussi le sortir dans un fichier pour voir si cela a du sens (si ton code est correct ou non).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    vector<float> histogram;
    Mat histo(300, histogram.size(),CV_8U);
    for (size_t i = 1; i < histogram.size(); i++) line(histo,Point2f(i-1,300*histogram[i-1]),Point2f(i,300*histogram[i]),Scalar(255));
    imshow(histo);
    waitKey(0);
    En supposant que ton vecteur histogram soit normalise a un, cela devrait faire l'affaire.

    2) Dans la lib persistence, tu as un fichier tests.cpp.
    Lis et inspire toi de ces tests. C'est vraiment tres simple. En gros, tu as en entre ton vecteur de float et en sortis deux vecteur d'entier, un pour les min et un pour les max.

    3) La distance entre les maximum est directement donne par le vecteur avec les max :

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par isangoma Voir le message
    Bonjour,

    2) Dans la lib persistence, tu as un fichier tests.cpp.
    Lis et inspire toi de ces tests. C'est vraiment tres simple. En gros, tu as en entre ton vecteur de float et en sortis deux vecteur d'entier, un pour les min et un pour les max.
    bonjour,
    est-ce que tu es sûr que ça renvoi deux vecteur (min et max) en sortie? parce que j'ai essayé mais ça marche pas!

    j'ai essayé une autre méthode et ça marche, voici une partie 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
        Mat image = imread("....../imagsource.png", CV_LOAD_IMAGE_GRAYSCALE);
        blur(image, image, Size(3,3), Point(-1,-1), BORDER_DEFAULT ); //  filtre (blur) appliquer un lissage sur l'image source
        
    // création du vecteur colonne qui contient l'intensité sur chacune des colonnes
    
     vector<int> sum_colonne(image.cols,0);
    for (int y = 0; y < image.rows; y++)
       for (int x = 0; x < image.cols; x++)
          sum_colonne[x] += image.at<unsigned char>(y,x);
    
    for(int i = 0; i < image.cols; i++)
            cout<<sum_colonne[i]<<" "<<endl;
            
    // puis récupérer ce vecteur sum_colonne (std::vector) ,et faire une boucle pour parcourir chaque valeur de l'intensité et la comparer aux deux valeurs du voisinage (gauche et droite) afin de trouver les max et les min 
    
    for (vector<int>::iterator it = sum_colonne.begin()+1; it != sum_colonne.end()-1; it++)
    	if((*it) > *(it-1) && (*it) > *(it+1))
    	{
        cout<< "la valeur du Max est : " << *it << " " << "d'indice : " << &it <<"\n";
        vector<int> max;
        max.push_back(*it);
        cout << "le vecteur max :"<< max<<"\n";

    alors sauf que j'ai un peu de mal à afficher ce vecteur de max , ça renvoi une erreur à la ligne 22 (en rouge) (aucun opérateur ne correspond a ces opérandes!!), ca devrait marcher je sais pas où est le souci!!

    bien sûr je te rappelle le but de tous cela est de calculer la distance inter Pic dans la premiere image et la comparer à un seuil
    Merci pour ton aide

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Points : 180
    Points
    180
    Par défaut
    Salut,

    Tu dis que tu as essaye et que cela ne marche pas.
    Tu as tente quoi, et quel fut le resultat.
    Ce n'est pas facile de t'aider comme cela.

    De memoire, la lib persistence1D fonctionne comme ca.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Definir un objet persistence.
    Lancer la fonction runpersistence sur ton object avec ton vecteur de float
    Appeler la fonction getextrema avec deux vecteurs d'entier pour recuperer les min max
    Pour la seconde partie de ton message.
    Tu cherches des maximum tres locaux. Trop peut etre. Si tu as un petit defaut dans ton image, tu vas trouver deux maximums tres proches.
    Cela peut fonctionner, mais cela ne sera pas tres robuste.

    Pour ton erreur, remplace par .
    Et pense aussi a lire des documentation sur la STL.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par isangoma Voir le message
    Salut,

    Tu dis que tu as essaye et que cela ne marche pas.
    Tu as tente quoi, et quel fut le resultat.
    Ce n'est pas facile de t'aider comme cela.

    De memoire, la lib persistence1D fonctionne comme ca.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Definir un objet persistence.
    Lancer la fonction runpersistence sur ton object avec ton vecteur de float
    Appeler la fonction getextrema avec deux vecteurs d'entier pour recuperer les min max
    Tu cherches des maximum tres locaux. Trop peut etre. Si tu as un petit defaut dans ton image, tu vas trouver deux maximums tres proches.
    Cela peut fonctionner, mais cela ne sera pas tres robuste.



    Pour la seconde partie de ton message.
    Pour ton erreur, remplace par .
    Et pense aussi a lire des documentation sur la STL.

    pour la première partie ,en fait, cette méthode a marché et j'ai récupéré les paires max et min et j'ai essayé de superposer les pts trouvés sur l'image et finalement elle ne détecte pas tous les pts du max et du min.
    Par contre en appliquant un filtre de lissage qui permet en quelque sort d'éliminer les oscillations et les bruit sur l'image, alors les Pic trouvés dans ce cas la correspondent bien au Pic sur l'image, j'ai effectuer plusieurs tests et cela marche très bien.


    pour l'affichage du vecteur , je cherchais une fonction qui affiche tout le vecteur pas seulement la dernière valeur afin d'éviter une autre boucle, mais apparemment, elle n'existe pas, enfin ce qui me semble!!

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    salut,

    Après avoir créer les vecteurs Max et Min, je voudrais créer une interface graphique pour tracer et afficher ces vecteurs en 2D. j'ai vu qu'il y a pas mal de de bibliothèque et j'ai même testé quelque une, et ça marche pas.

    alors, qu'en penses-tu? Aurais-tu une méthode qui te semble simple et efficace?

    merci de ton aide.

Discussions similaires

  1. Détection des maxima dans une fct d'autocorrélation
    Par Rosa2008 dans le forum Traitement du signal
    Réponses: 14
    Dernier message: 05/01/2012, 19h08
  2. Détection des vallées dans l'histogramme
    Par Chatbour dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 17/02/2009, 11h24
  3. Détection des tabulations dans un String
    Par supra3000 dans le forum VBA Access
    Réponses: 1
    Dernier message: 07/01/2009, 08h32
  4. Détection des plans dans une image 3D
    Par paradize3 dans le forum Traitement d'images
    Réponses: 13
    Dernier message: 02/10/2007, 09h43
  5. [3.0.2]Détection des erreurs dans le Package Explorer
    Par willowII dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 18/08/2005, 18h46

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