L'inclinaison d'une image à l'aide de Perspective Transforme
Je suis en train d'effectuer une inclinaison sur une image, comme celle qui est présentée ici
http://i.msdn.microsoft.com/3b575a03.TransformedClimber%28en-us VS.90%29.png.
J'ai un tableau de pixels représentant mon image et je suis pas sûr de quoi faire avec eux.
L'impact de votre image, vous n'avez pas besoin de la perspective de la transformation. Une transformation affine est assez.
OriginalL'auteur user293895 | 2010-03-15
Vous devez vous connecter pour publier un commentaire.
Une bien meilleure façon de le faire est par correspondance inverse.
Essentiellement, vous voulez "courbure" de l'image, à droite? Ce qui signifie que chaque pixel de l'image source qui va à un point prédéfini - la prédéfinition est une matrice de transformation qui vous indique comment faire pivoter, redimensionner, de traduire, de cisaillement, etc. l'image qui est essentiellement la prise de certains coordonner
(x,y)
sur votre image et de dire, "Ok, la nouvelle position de ce pixel est(f(x),g(y))
.C'est essentiellement ce que "déformation".
Maintenant, pensez à la mise à l'échelle d'une image ... disons, dix fois la taille. Ce qui signifie que, le pixel à
(1,1)
devient le pixel à(10,10)
- et puis le prochain pixel,(1,2)
devient le pixel(10,20)
dans la nouvelle image. Mais si vous continuez à faire cela, vous n'aurez pas de valeurs d'un pixel,(13,13)
parce que,(1.3,1.3)
n'est pas défini dans votre image d'origine et vous aurez un tas de trous dans votre image, vous aurez pour interpoler la valeur à l'aide des quatre pixels qui l'entourent dans la nouvelle image, c'est à dire(10,10) , (10,20), (20,10), (200,2)
- ce qui est appelé la méthode d'interpolation bilinéaire.Mais ici, c'est un autre problème, supposons que votre transformation n'était pas simple de mise à l'échelle et a été affine (comme l'exemple de l'image que vous avez posté)- puis
(1,1)
deviendrait quelque chose comme(2.34,4.21)
et vous devrez alors autour d'eux dans l'image de sortie(2,4)
et puis que vous avez à faire interpolation bilinéaire sur la nouvelle image pour remplir les trous ou plus compliqué interpolation - salissante, droit?Maintenant, il y a aucun moyen de sortir de l'interpolation, mais on peut s'en sortir en faisant la méthode d'interpolation bilinéaire, juste une fois. Comment? Simple, correspondance inverse.
Au lieu de le regarder comme la source de l'image aller à la nouvelle image, pensez à l'endroit où les données pour la nouvelle image dans l'image source! Donc,
(1,1)
dans la nouvelle image de la cartographie dans l'image source, disons,(3.4, 2.1)
et ensuite faire la méthode d'interpolation bilinéaire sur la source de l'image pour déterminer la valeur correspondante!Matrice de Transformation
Ok, alors comment pouvez-vous définir une matrice de transformation pour une transformation affine? Ce site internet vous indique comment le faire par la composition différente des matrices de transformation pour la rotation, déformation, etc.
Transformations:
Composition:
La finale de la matrice peut être obtenue par la composition de chaque matrice dans l'ordre et vous inverser pour obtenir la correspondance inverse - ce calculer les positions des pixels de l'image source et l'interpolation.
Wow, c'est tellement simple quand vous l'expliquer de cette façon. J'étais en train de penser à elle de cette façon, mais partout où j'ai regardé jusqu'à maintenant, saute dans la matrice de maths trop tôt.
OriginalL'auteur Jacob
Si vous n'avez pas envie de ré-inventer la roue, découvrez la bibliothèque OpenCV. Elle met en œuvre de nombreuses fonctions de traitement d'image y compris les transformations de perspective. Découvrez la cvWarpPerspective que j'ai utilisé pour accomplir cette tâche assez facilement.
OriginalL'auteur jeff7
Comme commenté par KennyTM vous avez juste besoin d'une transformation affine qui est une cartographie linéaire obtenu en multipliant chaque pixel par une matrice M et en ajoutant le résultat d'un vecteur de translation V. Il est simple de math
où M est une composition de transformations simples de type rotation ou mise à l'échelle et V est un vecteur qui se traduit par chaque point de vos images en ajoutant fixe les coefficients de chaque pixel.
Par exemple, si vous souhaitez faire pivoter l'image, vous pouvez avoir une matrice de rotation défini comme:
où
a
est l'angle que vous souhaitez faire pivoter votre image en.La mise à l'échelle utilise une matrice de la forme:
où
s1
ets2
sont des facteurs d'échelle sur les deux axes.Pour la traduction, vous avez juste le vecteur V:
qui ajoute
t1
ett2
pour les coordonnées des pixels.Vous ensuite de combiner les matrices en une seule transformation, par exemple si vous avez une mise à l'échelle, la rotation et la translation vous finirez par avoir quelque chose comme:
où:
x1
ety1
sont les coordonnées des pixels avant d'appliquer la transformation,x2
ety2
sont des pixels après la transformation,M1
etM2
sont des matrices utilisées pour la mise à l'échelle et la rotation (RAPPELEZ-vous: la composition de matrices n'est pas commutative! GénéralementM1 * M2 * Vect != M2 * M1 * Vect
),T
est un vecteur de translation utiliser pour traduire chaque pixel.OriginalL'auteur Jack