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 084
    Points
    16 084
    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};
    }

  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.

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