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

Contribuez Discussion :

[Java] ACP sur une image binaire


Sujet :

Contribuez

  1. #1
    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 : 51
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut [Java] ACP sur une image binaire
    Je reporte ici un fragment de code Java posté sur le forum qui effectue une analyse en composante principale (ACP) sur une image binaire.

    Dans cet exemple, on utilise l'ACP pour trouver l'axe principal (rouge) et l'axe secondaire (bleu) d'une forme binaire :


    Code java : 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    /**
     * @param image, width, height : binary image 
     * @return double[] { mean(x), mean(y), eigenvalue 1, eigenvalue 2, 
     *                    vector1.x, vector1.y, vector2.x, vector2.y }  
     */
    double[] binaryPCA(boolean[][] image, int width, int height) {
    	// compute sum of x,x2,y,y2,x*y of marked pixels
    	double sum_x=0, sum_x2=0, sum_y=0, sum_y2=0, sum_xy=0, count=0;
    	for(int y=0;y<height;y++) {
    		for(int x=0;x<width;x++) {
    			boolean value = image[x][y];
    			if (value==false) continue;
    			sum_x += x; sum_x2 += x*x;
    			sum_y += y; sum_y2 += y*y;
    			sum_xy += x*y;
    			count++;
    		}
    	}
     
    	// cov(X,Y) = E(X*Y) - E(X)*E(Y)
    	double Ex = sum_x/count, Ex2 =  sum_x2/count;
    	double Ey = sum_y/count, Ey2 =  sum_y2/count;
    	double Exy = sum_xy/count;
    	double COVxx = Ex2-Ex*Ex; 
    	double COVyy = Ey2-Ey*Ey; 
    	double COVxy = Exy-Ex*Ey; 
     
    	// covariance matrix is 
    	// | a b |   | COVxx COVxy |
    	// | c d | = | COVxy COVyy |
    	double a=COVxx, b=COVxy, c=COVxy, d=COVyy;
     
    	// characteristic polynomial : P(L) = L^2 - Trace.L + Determinant
    	double T = a+d;
    	double Det = a*d-b*c;
     
    	// eingenvalues L1,L1 = roots of characteristic polynomial
    	double sqrt =  Math.sqrt(T*T - 4*Det);
    	double L1 =  0.5 * ( T + sqrt ); 
    	double L2 =  0.5 * ( T - sqrt );
     
    	// eigenvectors: A.v = Li.v
    	// | a.vx + b.vy = Li.vx
    	// | c.vx + d.vy = Li.vy
    	double V1x,V1y,V1n,V2x,V2y,V2n, EPSILON=1E-8;
    	V1x=-(b+d-L1); V1y=(a+c-L1);
    	V2x=-(b+d-L2); V2y=(a+c-L2);
     
    	// normalize eigenvectors
    	V1n=Math.sqrt(V1x*V1x+V1y*V1y);
    	if (V1n>EPSILON) {V1x/=V1n;V1y/=V1n;}
    	V2n=Math.sqrt(V2x*V2x+V2y*V2y);
    	if (V2n>EPSILON) {V2x/=V2n;V2y/=V2n;}
     
    	// return data
    	return new double[] {Ex, Ey, L1, L2, V1x, V1y, V2x, V2y};
    }
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    s'il te plait je ne comprends pas pourquoi est ce qu'il y a une comparaison entre les paramètres b et c alors que b=c pour la determination des eigenvectors. merci

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Citation Envoyé par lafnell Voir le message
    s'il te plait je ne comprends pas pourquoi est ce qu'il y a une comparaison entre les paramètres b et c alors que b=c pour la determination des eigenvectors. merci
    De quelle partie du code exactement parles tu ?
    Je ne vois pas de telle comparaison.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/06/2015, 20h06
  2. Réponses: 7
    Dernier message: 31/08/2009, 11h41
  3. dessiner des cercles sur une image avec java
    Par inès83 dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 04/05/2008, 17h34
  4. Réponses: 6
    Dernier message: 15/11/2007, 12h31
  5. Réponses: 1
    Dernier message: 12/05/2007, 15h29

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