master
Ludovic CASTIGLIA 4 months ago
parent 2080bbc784
commit 047f50e72d

@ -1,2 +1,47 @@
# patchMatch
# Patch Match by Ludovic CASTIGLIA
## Ce qui est fourni dans le projet:
Est fournit dans ce projet le code d'une partie de mes anciennes tentatives infructueuses dans le dossier ```./tentatives infrutueuses```.
Vous pouvez également retrouver dans les dossiers portant les mêmes noms que les anciennes tentatives des photos illustrant le résultat avant/après pour que vous puissiez vous rendre compte de la progression sans avoir à les exécuter.
Vous avez également à la racine du projet, la version final de mon algorithme ainsi qu'un dossier ```./asset``` et ```./demo``` contenant des images et des démonstrations de l'algorithme.
## Utilisation du projet:
Pour lancer la version final de l'algorithme, mettez-vous à la racine du projet. Puis lancer cette commande ```./python selection.py```. Ensuite, suivez les instructions écrites dans le terminal.
En image, vous pouvez rentrer ```./asset/vache.png``` et pour le masque, vous pouvez dessiner le vôtre ou utiliser ```./asset/vache_mask.png```.
## Principe de l'algorithme:
Le principe de cet algorithme est assez simple à comprendre, mais son implémentation comporte quelques subtilités. Pour faire simple, pour regénérer une zone de l'image, on va commencer par faire un trou (supprimer les informations que l'on connaît de cette région). Puis petit à petit, venir coller des patchs de pixel trouvé ailleurs dans l'image jusqu'à recouvrir complètement le masque.
Pour mon implémentation final, je génère plusieurs versions de l'image de plus en plus pixélisé (faible résolution). Je prends la plus pixélisé d'entre elles puis je remplis le trou. Enfin, pour toutes les autres résolutions, je viens recouvrire le masque avec les patches qui ressemble le plus avec le masque rempli de la résolution précédente.
Pour remplir ce qu'il y a sous le masque, pour chaque pixel, je cherche plusieurs fois le patch le plus adapté puis chaque patch vote pour la valeur des pixels. Puis la valeur des pixels est déterminée par la moyenne pondérée de tout les votes.
Pour trouver le patch le plus adapté à une zone, on cherche ce patch autour de cette zone puis on le cherche aléatoirement dans toutes l'image. On détermine si un patch est un meilleur candidat qu'un autre en fonction de sa distance avec la zone (pas la distance physique, mais la distance des valeurs de chaque pixel une à une).
Cette distance est calculée par le carré de la différence des valeurs des pixels.
## Tentatives infructueuses:
### knn:
Cet algorithme était plutôt simple, lorsque l'on a généré un trou, on vient le remplir en faisant un knn sur tous les pixels en périphérie de ce trou jusqu'à avoir recouvert entièrement le trou. Cet algorithme n'est adapté qu'au patch de forme rectangulaire et il ne marche bien que si le fond que l'on veut régénérer est plutôt lisse et sans texture.
### PatchMatch2:
Dans cette tentative, j'ai implémenté très naïvement ce que je comprenais de l'algorithme patch match pour l'inpainting. Cependant, même si cet algorithme marche un peu mieux avec des fonds texturé, il crée tout de même une démarcation claire entre l'image de base et la masque.
### smothPatch:
Pour palier au problème de démarcation claire entre patch, j'ai fusionné les deux algorithmes précédents. Je commence par recouvrir le masque de patch de l'extérieur vers l'intérieur jusqu'à ce que le masque soit entièrement recouvert. Puis entre toutes les bordures de patch, je viens appliquer l'algorithme knn sur la bordure pour faire une transition plus douce entre les patchs. À ce moment, je commençais à trouver ce résultat satisfaisant. Cependant, on voyait encore les démarcations entre le masque et le reste de l'image.
### multiScale:
Pour cette implémentation, je suis repartie de PatchMatch2 et je l'ai appliqué sur différentes tailles de résolution. Le résultat produit n'était pas très bon, car ma recherche de patch était défaillante. Cependant, malgré des résultats mitigés, on pouvait entrevoir du potentiel. J'ai donc décidé de partir de cette base pour réaliser la version final de mon algorithme qui en plus de la taille multiple, fait du multi masque (applique différents masques au même endroit pour faire réduire la variation).
## Inspirations:
- https://gfx.cs.princeton.edu/pubs/Barnes_2009_PAR/patchmatch.pdf
- https://www.youtube.com/watch?v=XTRO6yQOvJc
- https://helios2.mi.parisdescartes.fr/~jdelon/enseignement/tp_image/org/TP_inpainting.html
- https://wenfulee.github.io/CS-766-Computer-Vision/

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Loading…
Cancel
Save