Porblème extraction de partie connexe d'une image binaire

blackjackdavey Messages postés 3 Date d'inscription samedi 11 décembre 2004 Statut Membre Dernière intervention 14 décembre 2004 - 11 déc. 2004 à 15:31
blackjackdavey Messages postés 3 Date d'inscription samedi 11 décembre 2004 Statut Membre Dernière intervention 14 décembre 2004 - 14 déc. 2004 à 22:45
Voilà je vais essayer de vous résumer le truc :
je dois faire diverses opérations sur des images binaires, représentées par une matrice M de booléens, les booléens étant true si le point de l'image est noir, et false s'il est blanc.
J'ai créé une classe ImageBinaire comprenant ce qui suit :
- la déclaration des données de la classe
- le constructeur privé qui crée la matrice M non initialisée
- des méthodes hauteur et largeur me donnant la hauteur et la largeur de l'image (donc la taille de la matrice)
- une fonction statique Blanche, qui crée une matrice, donc une image blanche
- les méthodes noircir et blanchir, qui opèrent sur les points de l'image
- la méthode estNoir, qui me dit si un point est noir
- la fonction aPartirDe, qui me rend une image binaire à partir d'un chaîne de caractères, les points noirs étant des "*" et les blancs des "."
- la méthode toString, qui fait l'inverse
- la méthode estBlanche, qui me dit si une image est blanche ou pas

Maintenant je bloque sur la dernière fonction, je vous donne le détail :
on appelle partie connexe d'un point p d'une image binaire l'image constituée de tous les points noirs que l'on peut atteindre depuis p en cheminant par des points noirs adjacents. Il faut que je rédige la méthode extraitPartieConnexe, qui donc extrait cette partie connexe. Par ex, si je prend l'image suivante :

................
..**..........
...*...........
................
.........*.....
........**....
................

et qu'on prend comme point p le premier point noir de l'image, alors la partie connexe sera :

................
..**..........
...*...........
................
................
................
................

Pour la méthode :
on utilise une liste de paires d'entiers aVisiter qui contient à tout moment de l'algorithme l'ensemble des points adjacents aux points noirs déjà répertoriés de la partie connexe en cours de construction. Donc on initialise cette liste avec le premier point noir rencontré en parcourant l'image ligne par ligne, de gauche à droite, et on met ce point à blanc dans l'image.
Ensuite, tant que la liste n'est pas vide :
- on retire un point pt de cette liste
- on noircit ce point dans l'image résultat
- on ajoute à aVisiter les points adjacents à pt et on les met à blanc dans l'image

Voilà le problème. Je pense que ça marcherait si je faisais tous les cas un à un pour ajouter les points adjacents, en prenant compte des bords de l'image...mais ça risque de faire un peu long, et je pense que ça doit être possible en faisant une boucle for ou while (oui là où jen suis rendu ça va pas plus loin :D), mais je vois pas laquelle...
Merci d'avance si vous avez une idée !!!

2 réponses

blackjackdavey Messages postés 3 Date d'inscription samedi 11 décembre 2004 Statut Membre Dernière intervention 14 décembre 2004
13 déc. 2004 à 09:05
Bah alors personne ? :(
0
blackjackdavey Messages postés 3 Date d'inscription samedi 11 décembre 2004 Statut Membre Dernière intervention 14 décembre 2004
14 déc. 2004 à 22:45
Pour ceux que ça peut aider, voilà le squelette du programme

public class ImageBinaire {// représentations d'images en noir et blanc

private boolean[][] M; // matrice des points de l'image
// true pour noir, false pour blanc

private ImageBinaire(int hauteur, int largeur) {
// prérequis : hauteur>0, largeur>0
// image non initialisée de taille largeur x hauteur
M = new boolean[hauteur][largeur];
}

public static ImageBinaire blanche(int hauteur, int largeur) {
// prérequis : hauteur>0, largeur>0
// résultat : nouvelle image blanche de taille largeur x hauteur
ImageBinaire resul = new ImageBinaire(hauteur,largeur);
for (int i=0; i<resul.hauteur(); i++)
for (int j=0; j<resul.largeur(); j++) {resul.M[i][j]=false;}
return resul;
}

public static ImageBinaire
aPartirDe(int hauteur, int largeur, String s) {
// prérequis : hauteur>0, largeur>0, s figure une image de cette taille
// résultat : image de taille hauteur x largeur figurée par la chaîne de
// caractères s, '*' pour noir, '.' pour blanc, présentée ligne par ligne.
ImageBinaire resul = blanche(hauteur,largeur);
int k=0;
for (int i=0; i<resul.hauteur(); i++)
for (int j=0; j<resul.largeur(); j++) {
char c=s.charAt(k);
while(c!='*'&&c!='.'){k++; c=s.charAt(k);}
if (c=='*') {resul.noircir(i,j);}
k++;
}
return resul;
}

public int hauteur() {// résultat : hauteur de this
return M.length;
}
public int largeur() {// résultat : largeur de this
return M[0].length;
}

public void noircir(int h, int l) {
// prérequis : 0=<h<hauteur, 0=<l<largeur
// effet : met à noir le point (h,l)
M[h][l] = true;
}
public void blanchir(int h, int l) {
// prérequis : 0=<h<hauteur, 0=<l<largeur
// effet : met à blanc le point (h,l)
M[h][l] = false;
}

public boolean estNoir(int h, int l) {
// prérequis : 0=<h<hauteur, 0=<l<largeur
// résultat : indique si le point (h,l) est noir
return M[h][l];
}

public String toString() {
// résultat : visualisation textuelle de this
// les points noir sont des '*' et les points blancs des '.'

private int max(int i, int j) {// résultat : le maximum de i et j

private int min(int i, int j) {// résultat : le minimum de i et j

public boolean estBlanche() {// résultat : indique si this est blanche

public ImageBinaire extraitPartieConnexe() {
// prérequis : this n'est pas blanche
// résultat : image constituée d'une partie connexe de this
// effet : met à blanc dans this les points de cette partie connexe

Tout est fait sauf le extraitPartieConnexe qui donc me pose problème. Je pourrais le faire très simplement en faisant tous les cas pour ajouter les points noirs adjacents (en vérifiant un par un si les points autout de pt sonr noirs), mais je pense qu'il y a un moyen plus simple et moins coûteux en temps d'exécution...et c'est là que je bloque :D Je ne trouve pas le cas d'arrêt pour une éventuelle boucle...
0
Rejoignez-nous