Question

Je suis en train d'effectuer un biais sur une image, comme celle montrée ici


(source: microsoft.com )
.

J'ai un tableau de pixels représentant mon image et je suis pas sûr de ce qu'il faut faire avec eux.

Était-ce utile?

La solution

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 faites 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. Cela signifie donc que, le pixel à (1,1) devient le pixel à (10,10) - puis le pixel suivant, (1,2) devient le (10,20) de pixel dans la nouvelle image. Mais si vous continuez à faire cela, vous aurez aucune valeur pour un pixel, (13,13) parce que, (1.3,1.3) ne définit pas l'image d'origine et vous aurez un tas de trous dans votre nouvelle image - vous devez interpoler pour cette valeur à l'aide les quatre pixels autour d'elle dans la nouvelle image, à savoir (10,10) , (10,20), (20,10), (200,2) - c'est appelé interpolation bilinéaire

Mais voici un autre problème, supposons que votre transformation n'a pas été simple mise à l'échelle et était affines (comme l'image de l'échantillon que vous avez posté) - alors (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 une interpolation bilinéaire sur la nouvelle image pour remplir les trous ou une interpolation plus complexe - 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! Ainsi, (1,1) dans la nouvelle image venir d'une cartographie inverse dans l'image source, par exemple, (3.4, 2.1) puis faire une interpolation bilinéaire sur l'image source pour déterminer la valeur correspondante!

matrice de transformation

Ok, alors comment définissez-vous une matrice de transformation pour une transformation affine? Ce site vous indique comment faire par compositing autre transformation des matrices de rotation, 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 cette calculer les positions des pixels dans l'image source et interpoler

Autres conseils

Si vous ne vous sentez pas comme réinventer la roue, vérifier la bibliothèque OpenCV. Il met en œuvre de nombreuses fonctions de traitement d'images utiles, y compris les transformations en perspective. Consultez le cvWarpPerspective que je l'ai utilisé pour accomplir cette tâche très facilement.

Comme commenté par KennyTM vous avez juste besoin d'une transformation affine qui est une application linéaire obtenue en multipliant chaque pixel par une matrice M et en ajoutant le résultat à un vecteur de translation V . Il est simple de math

end_pixel_position = M*start_pixel_position + V

M est une composition de transformations simples comme la rotation ou battitures et V est un vecteur qui se traduit tous les points de vos images en ajoutant des coefficients fixes à chaque pixel.

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

    | cos(a) -sin(a) |
M = |                |
    | sin(a)  cos(a) |

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

Bien que l'échelle utilise une matrice de la forme:

    | s1   0 |
M = |        |
    | 0   s2 |

s1 et s2 sont des facteurs d'échelle sur les deux axes.

Pour la traduction que vous avez juste le vecteur V :

    | t1 |
V = |    |
    | t2 |

qui ajoute t1 et t2 à des coordonnées de pixel.

Vous pouvez ensuite combiner les matrices en une seule transformation, par exemple si vous avez soit mise à l'échelle, la rotation et la traduction vous finirez par avoir quelque chose comme:

| x2 |             | x1 |
|    | = M1 * M2 * |    | + T
| y2 |             | y1 |

où:

  • x1 et y1 sont coordonnées pixel avant d'appliquer la transformation,
  • x2 et y2 sont des pixels après la transformation,
  • M1 et M2 sont utilisés pour matrices et mise à l'échelle de rotation ( RAPPELEZ-VOUS: la composition n'est pas commutative matrices Habituellement M1 * M2 * Vect != M2 * M1 * Vect),
  • T est une utilisation de vecteur de traduction pour traduire chaque pixel.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top