@ -10,21 +10,32 @@ Vous avez également à la racine du projet, la version final de mon 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.
Pour lancer la version final de l'algorithme en mode console, mettez-vous à la racine du projet. Puis lancez 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```.
Pour lancer la version final de l'algorithme en mode gui, mettez-vous à la racine du projet. Puis lancez cette commande ```./python interface.py```. Puis suivez les instructions affiché via les box de dialogue.
## 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.
En image, vous pouvez rentrer ```./asset/vache.png``` et pour le masque, vous pouvez dessiner le vôtre ou utiliser ```./asset/demo1_mask.png``` ou tout autre combo image et mask présent dans asset et demo ou dans votre disque dur (le programme accèpte les images .png .jpg .bmp ...).
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).
## Principe de l'algorithme:
Cette distance est calculée par le carré de la différence des valeurs des pixels.
Le principe de cet algorithme est assez simple à comprendre, mais son implémentation comporte quelques subtilités.</br>
On commence cet algorithme avec une image et un mask (image booléene de même dimension que l'image). Dans un premier temp, on génère en boucle une version à chaque fois deux fois plus petite de l'image jusqu'a ce que la largeur ou la hauteur de l'image face 2 pixel. Ensuite, il suffirat de remplir le trou pour la première image (la plus réduite) puis de compléter les images suivantes à partir des précédentes jusqu'a obtenir l'image en résolution complête.</br>
Mais la question est comment remplir ce trou et compléter l'image à partir des autres? Pour cela on vas venir trouver dans l'image actuel via une recherche par proximité géographique puis de manière random (plusieurs fois pour réduire les erreurs) un patch (un groupe de pixel) qui a une faible distance avec l'emplacement que l'on veut remplacer (distance dans le sens différence entre les valeurs des pixels). Une fois que l'on a trouver plusieurs patchs pour une zone, chaque patch vas voté pour la valeur des pixels en fonction d'un poid inversement proportionel à la distance (plus le patch est différent de la zone moins son vote a de l'importance).</br>
On procède ainsi pour toutes les zones dans le troue jusqu'a obtenir l'image. Ensuite on recommence ce procèsse plusieurs fois pour chaque résolution de l'image (en prenant en modèle la version précédente de l'image pas la résolution précédente) afin de réduire la différence entre les patchs et ainsi augmenter la cohérence globale de l'image.<br>
Le dernier point à développer est le calcule de la distance entre deux patchs. Pour cela, je viens calculer la différence élevé au carré des valeurs des pixels. Et lorsque le patch survol le mask ou est en dehors de l'image alors sa distance est la distance maximum (255*255*3) pour que le patch ne soit pas selectioné.