10
votes

Broyser une image à l'aide de la perspective Transforms


1 commentaires

Pour l'effet de votre image, vous n'avez pas besoin de transformer la perspective. Une transformation affine suffit.


3 Réponses :


2
votes

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 et en ajoutant le résultat à un vecteur de traduction v v . C'est simple maths xxx

m est une composition de transformations simples telles que les rotations ou les échecs et v est un vecteur qui traduit chaque point de Vos images en ajoutant des coefficients fixes à chaque pixel.

Par exemple, si vous souhaitez faire pivoter l'image, vous pouvez avoir une matrice de rotation définie comme suit: xxx

A est l'angle que vous souhaitez faire pivoter votre image par.

pendant que l'échelle utilise une matrice du formulaire: xxx > Où S1 et S2 sont des facteurs d'échelle sur les deux axes.

Pour la traduction, vous avez juste le vecteur v : < / p> xxx

qui ajoute t1 et t2 sur les coordonnées de pixels.

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: xxx

où:

  • x1 et y1 sont des coordonnées de pixels avant d'appliquer la transformation,
  • x2 et y2 sont des pixels après la transformation,
  • m1 et m2 sont des matrices utilisées pour la mise à l'échelle et la rotation ( N'oubliez pas: La composition des matrixes n'est pas commutative! Habituellement M1 * M2 * vect! = M2 * m1 * vect ),
  • t est une utilisation vectorielle de traduction pour traduire tous les pixels.

0 commentaires

55
votes

Une meilleure façon de le faire est par mapping inverse.

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 (x, y ) sur votre image et en disant que, « Ok, la nouvelle position de ce pixel est (f (x), g (y)) .

C'est essentiellement ce "gauchissement" fait.

Maintenant, pensez à l'échelle d'une image ... disons, à dix fois la taille. Donc, cela veut dire, le pixel à (1,1) est le pixel à (10,10) - puis le pixel suivant, (1,2) devient le pixel (10,20) dans la nouvelle image. Mais si vous continuez à faire cela, vous aurez aucune valeur pour un pixel, (13,13) car, (1.3,1.3) 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) -. ce qu'on appelle bilinéaire interpolation < / p>

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 (1,1) deviendrait quelque chose comme (2.34,4.21) et vous auriez à les arrondir à l'image de sortie (2,4) et puis vous auriez à faire interpolation bilinéaire sur la nouvelle image pour remplir les trous ou une interpolation plus compliquée - droit désordre

Maintenant, il y a aucun moyen pour sortir de l'interpolation, mais nous pouvons faire sortir avec interpolation bilinéaire, juste une fois . Comment? Simple, mapping inverse.

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, (1,1) dans la nouvelle image venir d'une cartographie inverse dans l'image source, par exemple, (3.4, 2.1) et puis faire une interpolation bilinéaire sur la image source à déterminer la valeur correspondant!

Transformation matrice

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.

Transformations:

text alt

Compositing:

text alt

La matrice finale peut être obtenue en compositing chaque matrice dans l'ordre et vous Inverser pour obtenir le mappage inverse -. Utiliser ce calcul les positions des pixels de l'image source et interpoler < / p>


1 commentaires

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.



3
votes

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.


0 commentaires