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

Traitement d'images Discussion :

Renseignements transformée de Hough


Sujet :

Traitement d'images

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut Renseignements transformée de Hough
    Bonjour,

    j'ai implémenté la transformée de Hough présentée dans la rubrique Contribuez mais il reste un point noir pour moi.
    En fait, vis à vis de l'interface, il y a un "vote threshold" paramètrable. Cela a pour effet de créer plusieurs droites.
    Or, au regard de l'algorithme présenté dans la rubrique "Contribuez", il n'y a rien qui s'y refere.

    Et je voudrais en fait avoir à chaque fois les 2 meilleurs droites dans mon application. Donc je suppose qu'il faut jouer sur un seuil pour pouvoir sélectionner les meilleurs candidats dans l'accumulateur. Et donc mon problème est de trouver la bonne valeur pour avoir à chaque fois 2 droites (maximum).

    En résumé, que décrit le bouton "vote threshold" et comment modifier le code pour fixer le nombre de droites trouvées à 2.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par picsou42 Voir le message
    En résumé, que décrit le bouton "vote threshold" et comment modifier le code pour fixer le nombre de droites trouvées à 2.
    Comme son nom l'indique (ou pas ), "vote threshold" est le seuil pour lequel on considere qu'une case de l'accumulateur indique la présence d'une droite.

    En plus clair: si (case[x][y]>seuil) alors {new droite(rho,theta)}

    Pour trouver 2 droites, il faut trouver les 2 plus grandes valeurs dans le tableau. Cela nous donne 2 cases, donc 2 couples (rho,theta) correpondants aux 2 "meilleures" droites.

    Attention d'imposer une certaine distance entre les 2 cases, sinon les 2 droites trouvées risquent d'être pratiquement confondus.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Attention d'imposer une certaine distance entre les 2 cases, sinon les 2 droites trouvées risquent d'être pratiquement confondus.
    Voila mon problème!!! Je n'arrive pas à savoir quel critère je dois imposer pour ne pas avoir plusieurs droites confondues?
    Dois-je m'interesser aux valeurs de a et b (ou rho et theta)?? Y a t il une moyenne effectuée avec les droites possibles trouvées (pour un meme seuil j'entends...).?

    Autre petite question: si je veux limiter la recherche de mes droites à des droites "horizontales" (a peu près!!), suffit il de modifier la valeur de "maxIndexTheta" (et de mettre par exemple 30°)?

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par picsou42 Voir le message
    Voila mon problème!!! Je n'arrive pas à savoir quel critère je dois imposer pour ne pas avoir plusieurs droites confondues?
    Dois-je m'interesser aux valeurs de a et b (ou rho et theta)?? Y a t il une moyenne effectuée avec les droites possibles trouvées (pour un meme seuil j'entends...).?
    C'est a toi de decider de la définition de "pratiquement confondues".

    Tu commence par choisir une distance entre 2 couples (rho,theta) qui te permet de considerer 2 droites confondues. Par exemple {|rho1-rho2|<5 pixels} ET { angle(theta1,theta2) < 3° } => droites confondues.

    Tu convertis cette distance (rho=5 pixels, angle=3°) en distance d'index (x=+/-3, y=+/-5) dans le tableau de l'accumulateur.

    Ensuite, lorsque tu extrais tes extremas du tableau, tu dois verifier que cette distance est respectée. Un moyen de le faire, c'est de mettre a zéro toutes les cases autour du maximum et de réiterer la détéction.

    1. Recherche du maximum global du tableau => case (x,y)
    2. Calcul de la droite correspondante => new droite(rho,theta)
    3. Mise a zero du voisinage du maximum => rectangle(x-3,y-3,x+3,y+3) = 0
    4. retour a l'étape 1

    Autre petite question: si je veux limiter la recherche de mes droites à des droites "horizontales" (a peu près!!), suffit il de modifier la valeur de "maxIndexTheta" (et de mettre par exemple 30°)?
    Heu... Dans mon implémentation, les droites horizontales ont un théta proche de 90°.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut
    Je comprend pas trop pourquoi les droites horizontales ont un theta proche de 90°....

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par picsou42 Voir le message
    Je comprend pas trop pourquoi les droites horizontales ont un theta proche de 90°....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double rho = x*Math.cos(theta) + y*Math.sin(theta);
    Pour les droites horizontales, la distance à l'origine est egale à la valeur de y (constante) quelque soit la valeur de x => theta=90°
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    C'est a toi de decider de la définition de "pratiquement confondues".

    Tu commence par choisir une distance entre 2 couples (rho,theta) qui te permet de considerer 2 droites confondues. Par exemple {|rho1-rho2|<5 pixels} ET { angle(theta1,theta2) < 3° } => droites confondues.

    Tu convertis cette distance (rho=5 pixels, angle=3°) en distance d'index (x=+/-3, y=+/-5) dans le tableau de l'accumulateur.

    Ensuite, lorsque tu extrais tes extremas du tableau, tu dois verifier que cette distance est respectée. Un moyen de le faire, c'est de mettre a zéro toutes les cases autour du maximum et de réiterer la détéction.

    1. Recherche du maximum global du tableau => case (x,y)
    2. Calcul de la droite correspondante => new droite(rho,theta)
    3. Mise a zero du voisinage du maximum => rectangle(x-3,y-3,x+3,y+3) = 0
    4. retour a l'étape 1



    Heu... Dans mon implémentation, les droites horizontales ont un théta proche de 90°.
    Est-ce cette méthode qui est implémentée dans le jar présent dans la rubrique Contribuez??? Car je n'arrive pas à retrouver les mêmes droites. Or je désirerais retrouver exactement ce résultat....

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 90
    Par défaut
    Voici mon 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
    public double[] winner(int nbCouple) {
    			// parsing the accumulators for max accumulator
    			double max=0, winrho=0, wintheta=0;
    			int dr = 3, dt = 5;
    			double[] rhotheta = new double[2*nbCouple];
    			for (int i=1; i<=nbCouple; i++){
    				max=0; winrho=0; wintheta=0;
    				for(int r=0;r<maxIndexRho;r++) {
    					for(int t=0;t<maxIndexTheta;t++) {
    						if (acc[t][r] >= max){
    							max = acc[t][r];
    							winrho = r;
    							wintheta = t;
    						}
    					}
    				}
    				raz(winrho, wintheta, dr, dt);
     
    				// indexes -> (rho,theta)
    				rhotheta[2*(i-1)]   = ((double)winrho/this.maxIndexRho - 0.5)*this.maxRho;
    				rhotheta[2*(i-1)+1] = ((double)wintheta/this.maxIndexTheta)*Math.PI;
    				System.out.println("rho: "+rhotheta[2*(i-1)]);
    				System.out.println("theta: "+((rhotheta[2*(i-1)+1]*360/Math.PI-90)));				
    		}
     
    			return rhotheta;
    		}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void raz(double winrho, double wintheta, int dr, int dt){
     
    			int addr, addt;
    			for (int i=-dr; i<dr; i++)
    				for (int j=-dt; j<dt; j++){
    					addr = (int)winrho+i;
    					addt = (int)wintheta+j;
    					if (addr >= 0 && addr < maxIndexRho && addt >= 0 && addt < maxIndexTheta)
    						acc[addt][addr] = 0;
    				}
     
    		}

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par picsou42 Voir le message
    Est-ce cette méthode qui est implémentée dans le jar présent dans la rubrique Contribuez??? Car je n'arrive pas à retrouver les mêmes droites. Or je désirerais retrouver exactement ce résultat....
    heu... après relecture du code : non.

    Dans le jar c'est plus basique. Un fois qu'on a extrait tous les extrema locaux, on supprime ceux qui sont trop proches les un des autres (on garde l'extrema local qui a la plus grande valeur).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Transformée de Hough
    Par firewall dans le forum Images
    Réponses: 3
    Dernier message: 27/09/2007, 16h43
  2. Transformée de Hough
    Par Vincent157 dans le forum OpenCV
    Réponses: 13
    Dernier message: 04/07/2007, 19h56
  3. Transformée de Hough
    Par Vincent157 dans le forum OpenCV
    Réponses: 2
    Dernier message: 04/07/2007, 16h20
  4. transformée de Hough généralisée
    Par Bella la vita dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 20/06/2007, 12h28
  5. Detection d'ellipse par la transformée de Hough
    Par oussama127 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 03/05/2006, 08h47

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