Exercices sur les contenus vus durant le CM 9.
Nous continuerons à utiliser Astico2D pour les exercices de TP. Les consignes restent les mêmes :
Afin de faire des amincissements homotopiques sur un objet discret, il nous faut implanter une fonction pour savoir si un pixel est un point simple ou pas.
Faites une fonction bool est_simple(cv::Mat &img_niv, int x, int y)
qui détermine si un pixels est un point simple ou pas avec la transformée en tout-ou-rien et les 4*4 masques vus en cours.
Nous pouvons maintenant implanter des algorithmes d'amincissement homotopique
Dans cet exercice vous allez implanter l'algorithme d'amincissement homotopique par contours.
Faites une fonction void un_amincissement_contour(cv::Mat &img_niv)
qui effectue une étape d'amincissement homotopique par contour. Pour trouver le contour d'un objet discret avec 8-connexité, vous avez le choix parmi tous les algorithmes vus en cours.
Faites ensuite une fonction amincissement_contour
qui effectue un nombre d'itérations d'amincissement homotopique par contour. Contrôlez le nombre d'itérations avec le slider.
Déclenchez cette fonction avec la touche 1.
Nous implantons maintenant l'amincissement homotopique par sous-grille.
Faites une fonction void un_amincissement_sousgrille(cv::Mat &img_niv)
qui effectue une étape d'amincissement homotopique par sous-grille. Il faut supprimer tous les pixels simples dans la première sous-grille, et ensuite passer à la deuxième, la troisième et la quatrième.
Faites ensuite une fonction amincissement_sousgrille
qui effectue un nombre d'itérations d'amincissement homotopique par sous-grille. Contrôlez le nombre d'itérations avec le slider.
Déclenchez cette fonction avec la touche 2.
Pour finir, nous allons implanter l'algorithme de squelettisation avec un filtrage de l'axe médian par angle. Ces exercices ne sont pas obligatoires.
Nous avons besoin avant tout de calculer la fonction \( \theta \) sur les points de l'axe médian.
Faites d'abord une fonction std::vector<std::pair<int, int>> projection_simple(cv::Mat &img_niv, int x, int y)
qui renvoie les points du complémentaire à distance minimale du pixel \( (x, y) \) avec la distance \( d_8 \).
Pour faire simple, vous pouvez simplement parcourir tous les pixels du contour extérieur de l'objet. Un algorithme plus efficace consiste à adapter l'algorithme de calcul de la transformée en distance de Rosenfeld (CM 5).
Ensuite, faites une fonction std::vector<std::pair<int, int>> projection_etendue(cv::Mat &img_niv, int x, int y)
pour calculer \( \Pi^e \). Rappelez-vous qu'il ne faut pas ajouter tous les 4-voisins en général.
Enfin, faites la fonction double theta(cv::Mat &img_niv, int x, int y)
qui calcule \( \theta \) d'un pixel. Rappelez-vous qu'on utilise le produit scalaire pour calculer l'angle entre trois points (c'est-à-dire, entre deux vecteurs).
Faites une fonction void axe_median_filtre(cv::Mat &img_niv, double seuil)
qui calcule l'axe médian filtré par un seuil.
Cette fonction change les pixels de l'image qui sont dans l'axe médian filtré en affectant la valeur 1. De cette façon, les algorithmes d'amincissement homotopique n'auront pas d'effet sur ces pixels.
Ensuite, faites une fonction void squelette_homotopique(cv::Mat &img_niv, double seuil)
qui calcule le squelette en utilisant l'axe médian filtré. Contrôlez le nombre d'itérations avec le slider.
Déclenchez cette fonction avec la touche 3.