Calcul du centre de gravité d'une forme pixélisèe dans une image [Résolu]

Marocain93 9 Messages postés vendredi 2 décembre 2016Date d'inscription 6 janvier 2017 Dernière intervention - 2 déc. 2016 à 19:53 - Dernière réponse :  Sugg1
- 19 déc. 2016 à 19:11
Bonsoir tout le monde,
Etudiant en licence professionnelle, je voudrais pouvoir calculer le centre de gravité d'une forme dans une image avec plusieurs formes pixélisées.

J'ai réussi à l'aide de logiciel minilab de supprimer toutes les pixels autour de ma forme (cercle en rouge) pour trouver les pixels suivants de mon cercle rouge : r=236. v=44; b=20;
Je voudrais maintenant à l'aide d'une syntaxe en java pouvoir calculer le centre de gravité de mon cercle rouge seulement.
J'ai commencé à écrire le code suivant pour lire l'image et définir sa largeur et hauteur et changer les couleurs de l'image en rouge uniquement et l'afficher à la fin mais je suis pas sur que cela puisse m'aider.
{
CImage.ChargeImage(1, "Contours.gif");
int largeur, hauteur;
int r=236;
int v=44;
int b=20;
largeur=CImage.DonneTailleXImage(1);
hauteur=CImage.DonneTailleYImage(1);
for( int i=0 ; i<largeur; i++)
{
for ( int j=0; j<hauteur; j++)
{
CImage.ChangeRougeImageXY(1,i,j,r);
CImage.ChangeVertImageXY(1,i,j,v);
CImage.ChangeBleuImageXY(1,i,j,b);
}
CImage.ImageAAfficher(1);
}
}
Toute suggestion ou aide de votre part ne sera pas de refus :)
Cordialement
Afficher la suite 

15 réponses

Répondre au sujet
KX 15359 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 2 déc. 2016 à 20:07
0
Utile
14
Bonjour,

Le centre de gravité de ton cercle c'est la moyenne de ses pixels.

Donc calcule la moyenne de tous les X du cercle, la moyenne de tous les Y, et ça te donnera deux coordonnées X et Y qui sont le centre de gravité de ton cercle.
KX 15359 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 4 déc. 2016 à 17:37
C'est là où il faut que tu calcules ta moyennes, donc ce sera :

total++;
totalX += i;
totalY += j;

Cela suppose que tu ais d'abord initialisé ces variables au début du programme.
Et au final tu auras tes coordonnées comme ceci :

x = totalX / total;
y = totalY / total;
Marocain93 9 Messages postés vendredi 2 décembre 2016Date d'inscription 6 janvier 2017 Dernière intervention > KX 15359 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 4 déc. 2016 à 18:56
{
CImage.ChargeImage(1, "Contours.gif");
int largeur, hauteur;
int r;
int v;
int b;

largeur=CImage.DonneTailleXImage(1);
hauteur=CImage.DonneTailleYImage(1);
for( int i=0 ; i<largeur/2; i++)
{
for ( int j=0; j<hauteur/2; j++)
{
r=CImage.DonneRougeImageXY(1,i,j);
v=CImage,DonneVertImageXY(1,i,j);
b=CImage.DonneBleuImageXY(1,i,j);

if( r==236 && v==44 && b==20)
{
total++;
totalX +=i;
totalY +=j;
X=totalX/total;
Y=totalY/total
}
CImage.ChangeRougeImageXY(1,i,j);
CImage,ChangeVertImageXY(1,i,j);
CImage.ChangeBleuImageXY(1,i,j);
}
CImage.ImageAAfficher(1);
}
}
Je vous remercie bien. et je voudrais savoir votre avis sur cette syntaxe.
KX 15359 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 4 déc. 2016 à 19:12
Mon avis, c'est que ce n'est pas du Java standard et que passer par des librairies tierces est inutile, mais j'imagine que c'est scolaire et que l'on t'a imposé ce choix, donc passons.

Pour le reste, je ne comprends toujours pas pourquoi tu veux absolument changer les couleurs de l'image. Ce calcul ne devrait pas modifier l'image d'origine. Inutile d'ailleurs de l'afficher cette image, la seule chose qui nous intéresse c'est X et Y.

Au passage, le calcul de X et Y devrait se faire à la fin du programme, pas à chaque itération de la boucle. De plus les boucles devrait couvrir l'intégralité de l'image, or là tu t'arrêtes à largeur/2 et hauteur/2 donc tu ne considères qu'un quart de l'image...

Voici comment on pourrait faire en Java standard :

BufferedImage img = ImageIO.read(new File("Contours.gif"));
double sumX = 0, sumY = 0, sum = 0;
int red = new Color(236, 44, 20).getRGB();
for (int x = 0, w = img.getWidth(); x < w; x++) {
    for (int y = 0, h = img.getHeight(); x < h; y++) {
        if (img.getRGB(x, y) == red) {
            sumX += x;
            sumY += y;
            sum++;
        }
    }
}
System.out.printf("X=%.1f Y=%.1f\n", sumX / sum, sumY / sum);
Marocain93 9 Messages postés vendredi 2 décembre 2016Date d'inscription 6 janvier 2017 Dernière intervention > KX 15359 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 4 déc. 2016 à 19:22
{
CImage.ChargeImage(1, "Contours.gif");
int largeur, hauteur;
int r;
int v;
int b;
double total=0;
double totalX =0;
double totalY =0;
largeur=CImage.DonneTailleXImage(1);
hauteur=CImage.DonneTailleYImage(1);
for( int i=0 ; i<largeur/2; i++)
{
for ( int j=0; j<hauteur/2; j++)
{
r=CImage.DonneRougeImageXY(1,i,j);
v=CImage,DonneVertImageXY(1,i,j);
b=CImage.DonneBleuImageXY(1,i,j);

if( r==236 && v==44 && b==20)
{

double total++;
double totalX +=i;
double totalY +=j;
X=totalX/total;
Y=totalY/total

}
}
CImage.ImageAAfficher(1);
}
}
J’espère que maintenant la syntaxe est correcte.. Merci pour votre aide. Je suis étudiant en licence professionnelle et ce que je fais est du traitement d'image dans la module de l'intelligence artificielle.
Sugg1 > KX 15359 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 19 déc. 2016 à 19:11
public static void ExecMenu7()
{
CImage.ChargeImage(1, "Contours.gif");
int largeur, hauteur;
int r=236;
int v=44;
int b=20;
double sumX=0, SumY=0, Sum=0 ;
largeur=CImage.DonneTailleXImage(1);
hauteur=CImage.DonneTailleYImage(1);
for( int i=0 ; i<largeur; i++)
{
for ( int j=0; j<hauteur; j++)
{
if( (CImage.DonneeRougeImageXY(1,i,j)==r) && (CImage.DonneeVertImageXY(1,i,j)==v) && (CImage.DonneeBleuImageXY(1,i,j)==b))
SumX+=i;
SumY+=j;
Sum++;
}

CImage.ImageAAfficher(1,SumX/Sum,SumY/Sum);
}
}
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.