Exercices sur les contenus vus durant le CM 9.
Nous continuerons à utiliser Astico2D pour les exercices de TP. Les consignes restent les mêmes :
Nous implantons l'algorithme rapide pour calculer la caractéristique d'Euler-Poincaré avec deux masques.
Faites une fonction void euler_local(cv::Mat &img_niv)
qui calcule la caractéristique d'Euler-Poincaré avec la 8-connexité et l'affiche dans la console.
Déclenchez cette fonction avec la touche 1.
Nous allons maintenant vérifier que cette implantation est plus rapide que calculer le nombre de composantes connexes et de trous.
Faites une fonction void euler_global(cv::Mat &img_niv)
qui calcule séparément le nombre de composantes connexes (pour la 8-connexité) et de trous pour obtenir la caractéristique d'Euler-Poincaré et l'affiche dans la console.
Pour cela vous pouvez détecter les contours avec la fonction void effectuer_suivi_contours_c8 (cv::Mat &img_niv)
que vous avez fait lors du TP 2 et détecter si le contour correspond à une composante connexe ou un à trou à partir de son orientation (voir le CM 2)
Déclenchez cette fonction avec la touche 2.
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 3.
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 4.
Pour finir, nous allons implanter l'algorithme de squelettisation avec un filtrage de l'axe médian par angle.
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 5.