Le choix des projets sera fait le lundi 8/11/2021 à 13h30.
Vous trouverez à la fin des énoncés des fonctions permettant de
- remplir une grande matrice inversible
- générer un graphe non pondéré
- générer un graphe pondéré.
Quoi rendre et quand ?
Vous devrez rendre la version complète de votre
projet.
Il faut fournir une version électronique.
Cette version comprend, a minima, un rapport sur votre
travail (choix, faits, problèmes rencontrés, code
d'illustration, mode d'emploi, exemple d'utilisation,
discussion…), le code lui-même (un ou plusieurs fichiers
y compris le Makefile correspondant).
Il est conseillé d’envoyer le plus régulièrement possible des versions intermédiaires.
Le projet doit fonctionner sur l’une au moins des machines du Bocal.
Vous pouvez rendre votre travail :
- Avant le samedi 11 décembre, 12h, et le présenter le lundi 13 décembre à partir de 13h30, avec un bonus de 2 points.
- Avant le mardi 4 janvier, 16h, et le présenter le lundi 10 janvier à partir de 13h30, sans bonus.
- Après le mardi 4 janvier, 16h, avec un malus de 2 point par jour de retard entamé.
Il est possible d’améliorer votre travail pratiquement jusqu’à la présentation.
Présentation de vos travaux
Les présentations devront être préparées de façon à ne pas dépasser
dix minutes. Elles peuvent inclure des diapositives et une démonstration…
Droites
Dans tous les cas, il faut :
- Programmer un algorithme de référence, par exemple Bresenham’65.
- Programmer l’algorithme demandé.
- Comparer en temps et en utilisation mémoire les deux algorithmes.
- Améliorer significativement l’algorithme demandé.
NB Attention, il faut que votre travail permette
de vérifier que les valeurs données sont les bonnes et
aussi de mesurer le temps, donc avec des données assez
grandes et répétitives. Le temps d’affichage venant grêver ces
valeurs, l’affichage sera omis lors du test de temps.
- Berstel ( )
- Dulucq-Bourdin ( )
- Boyer-Bourdin’2000 (Auto-Adaptative)( )
- Boyer-Bourdin’1999 ( )
- Triple pas. ( )
- Castle et Pitteway ( )
- Angel et Morrisson ( )
Compression d’images
Attention, les projets concernant la compression d’images doivent
être faits en utilisant uniquement les bibliothèques standard plus
OpenGL, GLUT et/ou SDL et GL4D. La base du programme sera celle donnée
ci-dessus, ou celle donnée dans le cours de Programmation Graphique.
Il n’est donc absolument pas question de réécrire le programme
lui-même, ce que vous avez à faire est simplement d’ajouter des
fonctions à ce programme.
Dans la suite on tentera de compresser une image. Il faudra le
faire, ainsi que la décompression associée,
et valider la méthode en termes de :
- temps de calcul, compression et décompression,
- perte en qualité éventuelle,
- ratio de compression.
- Compression par gestion de surfaces unies ( )
En dessin, par exemple en BD, il est fréquent de trouver de
grands à-plats de couleur. Plutôt que de compresser l’image
elle-même, pixel par pixel, il faut ici détecter ces taches de
couleur, et les traiter individuellement.
Trouver les taches consiste à trouver et numéroter les zones
connexes ayant la même couleur.
Une bonne méthode consisterait à commencer par trouver tous les pixels
connexes ayant une certaine couleur, ils forment une tache.
Puis à réitérer ce processus pour tous les pixels.
On a donc toutes les taches, si elles ont été listées.
On peut alors mémoriser l’image comme une liste de zones
(données par leur contour et la couleur).
Mettre en place cet algorithme.
Mettre en place l’algorithme de décompression/affichage d’une
telle image.
Étudier le gain, en temps et en espace.
- Par gestion de graphe non orienté. ( )
Ce projet représente en fait quatre projets différents. Les
projets A, B, C et D, voir plus bas.
Nous considérons ici qu’une image est un graphe où chaque pixel
est un noeud lié au plus à ses quatre voisins. Nous rajoutons
une contrainte : un pixel p est lié à son voisin v, si et
seulement si p et v sont effectivement voisins (au sens des
quatre voisins) et ont la "même" couleur.
Étudier ce graphe consiste à le gérer, avec son million de
noeuds.
Mettez en place une méthode de recherche des parties connexes du
graphe.
Votre méthode doit vous avoir fourni un numéro pour chaque
partie connexe.
Il suffit maintenant de parcourir une partie connexe en
cherchant les sommets qui n’ont pas quatre successeurs, ce sont
les sommets de la frontière de la région. Ces sommets seront
conservés dans une liste (ou un vecteur). Il est conseillé de se
souvenir aussi des pixels liés ou des pixels non liés (au
choix).
La liste de ces listes
compose les pixels de bords des regions. Ils organisent donc une
partition de l’image. Avec cette liste de listes et la couleur
qui y est associée, vous créez une nouvelle façon de stocker
l’image.
Il faut maintenant, mettre en place un système de sauvegarde et
un système de restauration de l’image.
A) Utilisez Mco( )
B) Utilisez Lis( )
C) Utilisez Vec( )
D) Utilisez Brin( )
- Compression d’une image couleur par l’agorithme des quadtrees.( )
Mettre en place la méthode, bien connue pour les images en noir
et blanc.
La tester en temps et en taille de fichier sur de nombreuses
images.
Si les résultats ne vous semblent pas concluants, tentez
d’améliorer la méthode.
- RLE( )
Mettre en place et testez le run-length-encoding.
On devra en particulier :
- Tester le RLE à partir des trois plans R, puis G, puis B.
- Tester le RLE en ayant transformé l’image en mode HSV et
en séparant les champs de H, de S et de V.
- Écrire dans chaque cas la fonction qui code en mode RLE,
la fonction qui fait la sauvegarde et la fonction qui permet
d’afficher une image ainsi sauvegardée.
- Essayer votre méthode sur un bon nombre d’images et
comparer les résultats obtenus, en particulier par rapport à
des méthodes concurrentes (LZW...).
- LZW ( )
Programmer l’algorithme LZW, pour la compression et pour la
décompression. L’appliquer aux images selon les
modalités suivantes :
- Directement au niveau du fichier ppm.
- En séparant le fichier en quatre parties, entête, les
octets de rouge, les octets de vert et les octets de
bleu. Puis en appliquant LZW sur chacun de ces quatre fichiers.
- En transformant l’image pour passer en mode HSV. Puis en
séparant le fichier en quatre parties, entête, les
octets de hue, les octets de saturation et les octets de
value. Puis en appliquant LZW sur chacun de ces quatre fichiers.
Comparer sur de nombreuses images, les résultats obtenus, en
particulier face à des algorithmes concurrents (RLE...).
- Par fenêtres. ( )
Le principe est, ici, brutal : il s’agit de parcourir
l’image par fenêtres de tailles nxn et conservant uniquement un
groupe de quatre pixels pour chaque fenêtre. Choisir, pour chaque fenêtre,
efficacement, les couleurs de ces quatre pixels.
Dans ce cas le ratio est connu, c’est 4/(nxn). Par contre ce qui
ne l’est pas, c’est la qualité de l’image produite.
Mettre en place un système de mesure de la qualité de l’image
(on peut chercher sur le web).
Mettre en place une procédure subjective, questionnaire, de
mesure de la qualité de l’image produite.
Discuter les résultats produits.
- Compression d’images par ondelettes.. ( )
Programmer et utiliser l’algorithme des ondelettes
(cf. Wikipedia
https://fr.wikipedia.org/wiki/Compression_par_ondelettes)
Pour faire de la compression d’images. Il faudra utiliser
l’algorithme sur l’image en RGB et sur l’image en
HSV.
Compression et décompression seront implémentées et il
faudra tester les deux approches sur suffisamment d’images
pour discuter les résultats produits.
- Par simplification. ( )
Pour toute fenêtre (nxn) de l’image, on trouve une valeur
minimale de chacune des couleurs. Puis pour chaque pixel de la
fenêtre, la couleur est donnée par un écart sous la forme de
quelques chiffres binaires avec la couleur minimale. Par exemple
3 bits pour le vert, 3 pour le rouge et 2 pour le bleu. On a
donc, par fenêtre, une couleur puis uniquement un octet pour
chaque pixel.
- Mettre en place cette méthode pour compresser l’image.
- Mettre en place cette méthode pour décompresser et
afficher l’image.
- Comparer la qualité des images (cf. ci-dessus).
- Améliorer la méthode en donnant aux chiffres binaires
utilisés des valeurs autres que directement +1, +2... +8, car
l’écart peut être beaucoup plus important.
Compression d’images par "color quantization"
Dans la suite on tentera de compresser une image par réduction du
nombre de couleurs utilisées. Il faut, évidemment, programmer la
compression et la décompression. On pourra appliquer un
algorithme de Dithering pour minimiser les erreurs faites en
simplifiant le nombre de couleurs.
Il faudra valider la méthode en termes de :
- temps de calcul, compression et décompression,
- perte en qualité éventuelle,
- ratio de compression.
On commencera bien sûr par transformer l’image en passant par une
table d’indirection de couleurs (C-LUT).
- Halftoning and Dithering ( )
Dans ce projet, on réduit à, par exemple, quelques niveaux
pour chaque composante (R, G et B). Par exemple on pourra
utiliser 64 couleurs avec des niveaux simples (0, 85, 170,
255 pour chaque composante). On utilise alors une CLUT de 64
entrées, sur 6 chiffres binaires.
- mettre en place une telle compression/décompression
d'image.
- On se rend compte qu'en utilisant une telle méthode,
une erreur est faite avec le choix d'une couleur
simplifiée au lieu de la couleur sur 256 niveaux
initiale. Pour corriger cette erreur, mettez en place une
méthode de diffusion d'erreur vue en cours (dithering).
- Limiter le nombre de couleurs par la méthode des octrees.( )
- Limiter le nombre de couleurs par les BSP.( )
- Limiter le nombre de couleurs par la méthode de k-means.( )
- Limiter le nombre de couleurs par une adaptation de
l’algorithme de Voronoi.( )
Graphes
Nous avons vu cinq structures pour stocker les graphes :
matrice, matrice compacte, vecteur des successeurs, tableaux de brins, liste de
successeurs. Nous les notons, dans la suite, respectivement, Mat, Mco,
Vec, Brin, Lis.
Vous devrez mettre en place les méthodes demandées avec les
structures demandées et discuter des
résultats en terme de temps de calcul et de taille de la mémoire
utilisée.
- Composantes connexes 1( )
Sur de grands graphes (plus de 10000 noeuds) remplis par la
méthode creer , mettre en place
les algorithmes de recherche du plus court chemin et de
composantes connexes avec Vec et Brin.
- Composantes connexes 2( )
Sur de grands graphes (plus de 10000 noeuds) remplis par la
méthode creer , mettre en place
les algorithmes de recherche du plus court chemin et de
composantes connexes avec Lis et Brin.
- Composantes connexes 3( )
Sur de grands graphes (plus de 10000 noeuds) remplis par la
méthode creer , mettre en place
les algorithmes de recherche du plus court chemin et de
composantes connexes avec Mco et Brin.
- Voyageur 1( )
Résoudre aussi bien que
possible le problème du voyageur de commerce, Brin et Mco.
- Voyageur 2( )
Résoudre aussi bien que
possible le problème du voyageur de commerce, Lis et Vec.
- Voyageur 3( )
Résoudre aussi bien que
possible le problème du voyageur de commerce, Brin et
Vec.
- Voyageur 4( )
Vous prendrez sur le site national les données concernant les
adjacences des villes françaises
(https://www.data.gouv.fr/fr/datasets/liste-des-adjacences-des-communes-francaises/). Vous
travaillerez sur un seul département, le Val
d’Oise. Résoudre aussi bien que possible le problème du
voyageur de commerce, Lis et Brin.
- Voyageur 5( )
Vous prendrez sur le site national les données concernant les
adjacences des villes françaises
(https://www.data.gouv.fr/fr/datasets/liste-des-adjacences-des-communes-francaises/). Vous
travaillerez sur un seul département, la Seine Saint-Denis.
Résoudre aussi bien que possible le problème du
voyageur de commerce, Mco et Vec.
- Shannon 1( )
Soit un graphe donné, (le correcteur en proposera un pendant
la présentation), le séparer en deux arbres recouvrant
disjoints. Mat et Brin.
Avec ces structures proposer un jeu de Shannon.
- Shannon 2( )
Soit un graphe donné, (le correcteur en proposera un pendant
la présentation), le séparer en deux arbres recouvrant
disjoints. Vec et Mco.
Avec ces structures proposer un jeu de Shannon.
- Shannon 3( )
Soit un graphe donné, (le correcteur en proposera un pendant
la présentation), le séparer en deux arbres recouvrant
disjoints. Lis et Vec.
Avec ces structures proposer un jeu de Shannon.
- Canton ( )
Gérer un réseau de transports en commun, par exemple le métro
de Séoul, via un graphe (Lis et Mco).
Résoudre dans ce cas le problème du plus court chemin,
algorithme de Dijkstra.
- Madrid( )
Gérer un réseau de transports en commun, par exemple le métro
de Mexico, via un graphe (Mco et Brin). ( )
Résoudre dans ce cas le problème du plus court chemin,
algorithme de Dijkstra.
- London( )
Gérer un réseau de transports en commun, par exemple le métro
de Londres, via un graphe (Lis et Vec). ( )
Résoudre dans ce cas le problème du plus court chemin,
algorithme de Dijkstra.
- Limoges( )
Gérer un réseau de transports en commun, par exemple les 35
lignes de bus de Limoges, via un graphe (Vec et Brin).
Résoudre dans ce cas le problème du plus court chemin, par exemple
avec l’algorithme de Dijkstra.
- Monte-Carlo( )
Gestion aléatoire d’un réseau de transports en commun.
La structure du métro pourra être récupérée de l’un des projets
précédents. La méthode de recherche du plus court chemin sera
basée sur la méthode de Monte-Carlo.
- Analyse d’un programme 1. ( )
Un programme peut être considéré comme un graphe orienté où
chaque fonction est un noeud. Prendre un
programme important (plusieurs dizaines de fichiers, plusieurs
dizaines de milliers de lignes de code) et l’analyser sous la
forme d’un graphe (Mco, Lis). On doit chercher les composantes
connexes et les cycles.
- Analyse d’un programme 2.( )
Un programme peut être considéré comme un graphe orienté où
chaque fonction est un noeud. Prendre un
programme important (plusieurs dizaines de fichiers, plusieurs
dizaines de milliers de lignes de code) et l’analyser sous la
forme d’un graphe (Mco, Vec). On doit chercher les composantes
connexes et les cycles.
- Analyse d’un programme 3.( )
Un programme peut être considéré comme un graphe orienté où
chaque fonction est un noeud. Prendre un
programme important (plusieurs dizaines de fichiers, plusieurs
dizaines de milliers de lignes de code) et l’analyser sous la
forme d’un graphe (Mat, Brin). On doit chercher les composantes
connexes et les cycles.
- Analyse d’un programme 4.( )
Un programme peut être considéré comme un graphe orienté où
chaque fonction est un noeud. Prendre un
programme important (plusieurs dizaines de fichiers, plusieurs
dizaines de milliers de lignes de code) et l’analyser sous la
forme d’un graphe (Lis et Vec). On doit chercher les composantes
connexes et les cycles.
Analyse numérique
Vous trouverez creer une fonction de remplissage de
matrices carrées de grandes tailles. Utilisez-la pour faire les
travaux suivants :
- Comparaison de méthodes permettant de calculer le déterminant
de la matrice (méthode classique, triangulation...).( )
- Stockage ( )
Comparaison de méthodes de stockage de la matrice. Mat, Mco,
Vec. Il faut
commencer par mettre en place ces méthodes et, avec les matrices
ainsi structurées, faire des multiplications de matrices, des
multiplications matrice/vecteur, etc.
Commenttez vos résultats en temps et mémoire utilisée.
- Résolution de systèmes linéaires de grande taille par la
méthode du pivot de Gauss.( )
- Résolution de systèmes linéaires de grande taille par la
méthode dite LU.( )
- Résolution de systèmes linéaires de grande taille par la
méthode de Cholesky.( )
- Résolution de systèmes linéaires de grande taille par la
méthode LU réduite aux "contours".( )
- Résolution de systèmes linéaires de grande taille par la
méthode QR.( )
- Résolution de systèmes linéaires de grande taille par la
méthode de raffinement itératif de la solution.( )
Fonctions utiles