tfj57 |
Salut à tous,
J'avais fait quelque chose de similaire dans un précédant post.
Voici un copier/coller/adapter du petit programme C++ en espérant que j'ai bien compris le problème.
Salutations
--------------------------------------
#define MINPIX 10 // Nombre minimum de pixels de la forme
#define NBX 25 // Taille X du tableau
#define NBY 25 // Taille Y du tableau
char Tab[NBX][NBY];
// Compte (dans somme) le nombre de pixels (=valeur) de la forme à partir
// de la case de coordonnées x,y et la marque avec (marque)
void Recherche(const int x, const int y, const int &valeur, const int &marque, int &somme)
{
if (x<0 || x>=NBX || y<0 || y>=NBY)
return; // si les coordonnées de la case à tester ne sont pas valides
else if (Tab[x][y]!=valeur)
return; // si la case a déjà été marquée ou n'appartient pas à la forme
else
{
Tab[x][y]=marque; // on marque la case
somme++; // on ajourte 1 au nombre de pixels de la forme
Recherche(x-1,y,valeur,marque,somme); // on teste les 4 directions récursivement
Recherche(x+1,y,valeur,marque,somme);
Recherche(x,y-1,valeur,marque,somme);
Recherche(x,y+1,valeur,marque,somme);
}
}
main()
{
int i,j,nbpix;
// initailisation de Tab uniquement avec des 0 ou -1
for (j=0;j<NBY;j++)
for (i=0;i<NBX;i++)
if (Tab[i][j]==0) // si pixel selectionné
{
nbpix=0;
Recherche(i,j,0,1,nbpix); // recherche pixels consécutifs et marque avec 1
if (nbpix<=MINPIX) // si le nombre de pixels < au minumum
Recherche(i,j,1,-1,nbpix); // marquage (efface) avec -1 des pixels précédemment marqués avec 1
}
for (j=0;j<NBY;j++)
for (i=0;i<NBX;i++)
if (Tab[i][j]==1)
Tab[i][j]=0; // tous les pixels que l'on garde sont marqués à 1, on les remet à 0.
return 0;
} |