bonjour kronanberg,
Je tiens à préciser que le code que j'ai fourni à nejilover pour son problème servait simplement à illustrer la méthode... j'ai écrit ça en 3 minutes sans prendre le temps de soigner mon code. Si tu veux t'en servir, il te faudra surement reprendre des trucs.
Dans la ligne
uv = max(round([x,y,1] * inv_H),1);
la fonction max prends 2 arguments : les coordonnées calculées par application de l'homographie inverse, et la valeur 1. Cela renvoie le maximum des deux arguments. Concrètement, si une coordonnée quelconque obtenue est inférieure à 1, on la remplace par 1. Ca évite d'aller demander la valeur d'un pixel qui n'existe pas. (Ce problème intervient car le coin inférieur gauche de l'image déformée se trouvait légèrement en dehors de l'image originale)
Fait on un étirement de l'image ou un agrandissement ?
Je ne conçois pas de différence entre ces deux termes.
Ce que l'on fait, c'est qu'on définit dès le début les dimensions que doit posséder notre image résultat. En l'occurence, ce sont celles d'un rectangle, mais on peut prendre n'importe quel quadrilatère.
Pour chaque pixel de l'image résultat, on calcule la position théorique de son transformé (par l'homographie inverse) dans l'image d'origine. On prend la valeur du pixel le plus proche de cette position (c'est le role du 'round') et on l'affecte au pixel résultat.
C'est une approche par "plus proche voisin", qui est rapide à coder, mais assez simpliste. Pour reconstruire une image plus proprement, tu peux t'amuser à utiliser une interpolation bilinéaire ou bicubique.
Bon courage pour ta présentation !
Partager