Traitement d’image : cropping¶
Introduction¶
Au cours de ce TP, vous allez réaliser des opérations élementaires sur des images en niveaux de gris, comme par exemple appliquer un filtre pour réduire le bruit ou encore cherche à déterminer les contours des objets présents dans l’image. Les images à traiter vous sont fournies ; elles portent l’extension .pgm. Le flux de traitement sera toujours réalisé dans le même ordre :
Charger l’image dont le nom de fichier est passé en argument sur la ligne de commande. Vous pouvez télécharger ces images d’exemples :
don.pgmparis.pgmCréer un tableau 2D d’entiers imgIn et y transférer les valeurs des pixels de l’image d’entrée.
Réaliser les opérations sur l’image.
Visualiser les résultats dans une fenêtre graphique à l’aide de le bibliothèque StdDraw.
TRAVAIL DEMANDɶ
Lire le fichier et afficher l’image¶
À faire
Écrire une méthode read2DPgmStdin(String file) qui :
lit le fichier .pgm passé en paramètre,
retourne un tableau 2D d’entiers représentant l’image.
Appeler cette méthode dans le main() et vérifier le résultat.
Déterminer le rectangle englobant¶
En supposant que l’image représente un objet sur fond blanc, on souhaite déterminer le plus petit rectangle d’axes parallèles aux bords de la fenêtre graphique et tel que l”objet soit entièrement contenu dans le rectangle.
À faire
Écrire une méthode bBox() qui prend en paramètre l’image à traiter (tableau 2D) ainsi qu’un entier représentant le seuil de niveau de gris au delà duquel toute couleur sera considérée comme du blanc et qui détermine puis trace le rectangle englobant. Dans notre exemple, une valeur de 250 devrait s’avérer convenable, mais libre à vous d’essayer d’autres valeurs.
Déterminer le plus petit cercle englobant¶
On souhaite maintenant déterminer le plus petit cercle tel que l”objet soit entièrement contenu dans le cercle. Plusieurs méthodes ont été proposée pour parvenir à ce plus petit cercle. Nous proposons ici d’en appliquer une qui ne permet théoriquement que d’approcher le plus petit cercle, mais qui a l’avantage d’être simple.
L’idée de cette méthode est de démarrer avec une approximation initiale intelligente et simple du centre du cercle : l’intersection O des diagonales du rectangle englobant. Pour estimer le rayon, on pourrait commencer par décider qu’il s’agit de la demi diagonale, on se retrouverait alors avec le cercle circonscrit au rectangle englobant.
On va cependant essayer d’affiner un peu en recherchant le point de l’objet le plus éloigné du centre, que l’on notera A. Par définition, le cercle ainsi défini englobe tout l’objet ; il n’est toutefois pas le plus petit possible.
Pour s’en approcher, on va
Rapprocher le centre, petit à petit, en direction de A (donc sur la demi-droite [0A) ), jusqu’à ce qu’un autre point de l’objet, noté B, se retrouve aussi sur le cercle. Le centre de ce cercle sera noté
Le segment AB représente possiblement une corde du plus petit cercle, donc son centre se trouve sur sa médiatrice. On va donc la parcourir jusqu’à ce qu’un troisième point se trouve sur le cercle et que tous les autres soient à l’intérieur.
![]()
À faire
Écrire une méthode bCircle0() qui prend en paramètre l’image à traiter (tableau 2D) ainsi qu’un seuil de niveau de gris qui détermine puis trace l’estimation de rayon OA du plus petit cercle englobant.
Écrire les méthodes bCircle1() et bCircle2() correspondant aux estimation décrites respectivement dans les points 1 et 2 ci-dessus.
