J'essaie d'effectuer une fausseté sur une image, comme l'une montre ici p>
J'ai un éventail de pixels représentant mon image et je suis incertain de quoi faire avec eux. P>
(source: Microsoft.com < / a>) sub>
. p>
3 Réponses :
Comme commenté par KennyTM, vous avez juste besoin d'une transformation affine qui est une cartographie linéaire obtenue en multipliant chaque pixel par une matrice m em> et en ajoutant le résultat à un vecteur de traduction v em> v em> . C'est simple maths où m em> est une composition de transformations simples telles que les rotations ou les échecs et v em> est un vecteur qui traduit chaque point de Vos images en ajoutant des coefficients fixes à chaque pixel. p> Par exemple, si vous souhaitez faire pivoter l'image, vous pouvez avoir une matrice de rotation définie comme suit: p> où pendant que l'échelle utilise une matrice du formulaire: p> Pour la traduction, vous avez juste le vecteur v em>: < / p> qui ajoute vous combinez ensuite les matrices dans Une seule transformation, par exemple si vous avez une échelle, une rotation et une traduction, vous finirez par avoir quelque chose comme: p> où: p> A code> est l'angle que vous souhaitez faire pivoter votre image par. p>
S1 code> et
S2 code> sont des facteurs d'échelle sur les deux axes. P>
t1 code> et
t2 code> sur les coordonnées de pixels. p>
x1 code> et
y1 code> sont des coordonnées de pixels avant d'appliquer la transformation, li>
x2 code> et
y2 code> sont des pixels après la transformation, li>
m1 code> et
m2 code> sont des matrices utilisées pour la mise à l'échelle et la rotation ( N'oubliez pas: strong> La composition des matrixes n'est pas commutative! Habituellement
M1 * M2 * vect! = M2 * m1 * vect code>), li>
t code> est une utilisation vectorielle de traduction pour traduire tous les pixels. LI>
ul> p>
Une meilleure façon de le faire est par mapping inverse. Em> p>
Essentiellement, vous voulez « chaîne » l'image, à droite? Ce qui signifie que chaque pixel de l'image source va à un point prédéfini - la prédéfinition est une matrice de transformation qui vous indique comment faire pivoter, échelle, traduire, cisaillement, etc. l'image qui est essentiellement prendre quelques coordonnées C'est essentiellement ce "gauchissement" fait. P>
Maintenant, pensez à l'échelle d'une image ... disons, à dix fois la taille. Donc, cela veut dire, le pixel à Mais voici un autre problème, supposons que votre transformation n'a pas été mise à l'échelle simple et était affines (comme l'image échantillon que vous avez posté) - puis Maintenant, il y a aucun moyen strong> pour sortir de l'interpolation, mais nous pouvons faire sortir avec interpolation bilinéaire, juste une fois strong>. Comment? Simple, mapping inverse. Em> p>
Au lieu de regarder comme l'image source va à la nouvelle image, pensez où les données de la nouvelle image proviendra de l'image source! Donc, Ok, alors comment définissez-vous une matrice de transformation pour une transformation affine? Ce site vous indique comment le faire par compositing différentes matrices de transformation pour la rotation, le cisaillement, etc. p>
p>
p>
La matrice finale peut être obtenue en compositing chaque matrice dans l'ordre et vous Inverser strong> pour obtenir le mappage inverse -. Utiliser ce calcul les positions des pixels de l'image source et interpoler < / p> (x, y ) code> sur votre image et en disant que, « Ok, la nouvelle position de ce pixel est
(f (x), g (y)) code>. p>
(1,1) code> est le pixel à
(10,10) code> - puis le pixel suivant,
(1,2) code> devient le pixel
(10,20) code> dans la nouvelle image. Mais si vous continuez à faire cela, vous aurez aucune valeur pour un pixel,
(13,13) code> car,
(1.3,1.3) code> n'est pas défini dans votre image originale et vous aurez un tas de trous dans votre nouvelle image - vous devez interpoler pour cette valeur en utilisant les quatre pixels autour d'elle dans la nouvelle image, par exemple
(10,10), (10,20), (20 , 10), (200,2) code> -. ce qu'on appelle bilinéaire interpolation < / p>
(1,1) code> deviendrait quelque chose comme
(2.34,4.21) code> et vous auriez à les arrondir à l'image de sortie
(2,4) code> et puis strong> vous auriez à faire interpolation bilinéaire sur la nouvelle image pour remplir les trous ou une interpolation plus compliquée - droit désordre p>
(1,1) code> dans la nouvelle image venir d'une cartographie inverse dans l'image source, par exemple,
(3.4, 2.1) code> et puis faire une interpolation bilinéaire sur la image source à déterminer la valeur correspondant! p>
Transformation matrice h2>
Transformations: h3>
Compositing: h3>
Wow, c'est si simple quand vous l'expliquez de cette façon. J'y pensais de cette façon, mais partout où j'ai regardé jusqu'à présent, saute dans la matrice Math trop tôt.
Si vous n'avez pas envie de réinventer la roue, consultez la bibliothèque OpenCV. Il met en œuvre de nombreuses fonctions de traitement d'image utiles, y compris des transformations en perspective. Découvrez le CVWARppersperspective que j'ai utilisé pour accomplir cette tâche assez facilement. p>
Pour l'effet de votre image, vous n'avez pas besoin de transformer la perspective. Une transformation affine suffit.