Bonjour,
Voici quelques indices concernant le miniprojet sur la base des questions auxquelles nous avons répondu ces deux dernières semaines.
Les fonctions to_grayscale et apply_kernel n'ont pas le droit de modifier l'image qu'elles reçoivent en paramètre. Elles doivent les deux créer une nouvelle image (de même taille) via la fonction new_image_grey et retourner cette nouvelle image.
Si vous avez des soucis parce que np.sqrt doit prendre des racines de valeurs négatives et qu'il y a une erreur ou un avertissement dans le terminal, cela signifie qu'il y a un overflow dans la représentation intermédiaire de sobel_x² + sobel_y². Pour régler ceci, allez modifier dans la fonction new_image_grey de miniprojectutils.py cette ligne:
return np.zeros((height, width), dtype=np.int16)
pour avoir ceci à la place:
return np.zeros((height, width), dtype=np.int32)
Cela réserve 32 bits par pixel, ce qui sera suffisant à tous les coups pour stocker ces valeurs intermédiaires.
Si votre code est très lent (plus de 15-20 secondes juste pour apply_kernel par exemple), c'est fort probablement que votre fonction clamp_index fait trop de travail. (Elle n'a pas besoin de créer de liste, notamment!) Attention également que votre clamp_index retourne toujours une valeur: si d'aventure elle retourne None et que vous utilisez ce None comme index, vous aurez des surprises dans vos valeurs de retour.
Attention au (a) de find_seam: vous devez créer une liste de liste de PixelData, où chaque cellule aura sa valeur par défaut, qui sera modifiée au (b) et (c). Une valeur par défaut de PixelData s'obtient avec simplement PixelData(). Mais vous devez faire créer une telle valeur pour chaque pixel de l'image que vous traitez. Vous ne pouvez pas en créer une seule et ensuite l'insérer x fois dans une liste, car cette liste pointera alors x fois vers la même instance de PixelData. En fait, c'est un cas de figure très similaire à ce que nous avions fait à la semaine 5 pour créer une matrice n × m qui contenait de 0 partout — sauf qu'ici, ce ne sont pas des 0, mais des PixelData().
Quand vous avez quelque chose qui fonctionne, vous pouvez modifier à l'envi votre fonction seam_carving, mais les fonctions que vous avez eu à implémenter vous (rgb_to_grey, to_grayscale, clamp_index, apply_kernel et find_seam) doivent faire le travail tel que décrit ces deux dernières semaines (n'optimisez par exemple pas find_seam de manière à déjà supprimer le seam de l'image passée en paramètre). Pour tester votre code, nous allons en effet appeler ces fonctions directement (sans passer par seam_carving), et il faut qu'elles fonctionnent comme décrit.
Bonne suite de travail,
Jean-Philippe Pellet