2017-10-08 3 views
0

J'ai lu quelque part (mais je ne me souviens pas exactement où) il était possible de faire pivoter les pixels d'une image en appliquant une seule matrice (juste des additions et des multiplications).Application d'une rotation à une image sans sinus et cosinus

Cela a été fait sans les fonctions sinus et cosinus.

Je me demande si j'avais un rêve ou si cela est vraiment possible ...

Merci

Répondre

0

Oui et non.

Vous appliquez une rotation avec une matrice, car il s'agit d'une transformation affine (https://en.wikipedia.org/wiki/Affine_transformation).

Mais si l'amplitude de rotation est spécifiée par un angle, vous ne pouvez pas éviter l'utilisation des fonctions trigonométriques pour évaluer les coefficients.

Une dernière remarque: c'est totalement inoffensif, pourquoi s'inquiéter?

1

Les matrices de transformation 3x3 sont l'abstraction standard dans le travail graphique 2D. Voir: https://en.m.wikipedia.org/wiki/Transformation_matrix. Que cela évite le sinus et le cosinus est un peu un débat, car on utilise généralement ces fonctions trigonométriques pour construire une matrice de rotation si on part d'un angle.

+0

Avez-vous un code source exemple ++ C qui fait manuellement le calcul de la matrice appliquant à l'image? Chaque code que je trouve fonctionne avec opencv donc je ne vois pas comment cela fonctionne en interne. Merci – Bob5421

0

Dans les graphiques, nous utilisons généralement homogenuous transform matrices pour des tâches comme celle-ci. Ainsi, le algo est comme ceci:

  1. créer la matrice de transformation

    tenant toutes les transformations que vous voulez. Pour 2D il est 3x3 matrice de transformation homogène ou 2x2 matrice de rotation (pas de traductions).

  2. processus Tous les pixels de destination

    copier essentiellement pixel de la source à l'image de destination, mais les boucles sont en boucle chaque pixel de destination (pour éviter les trous arrondis). Alors laissez la boucle passe par (x,y) de sorte que vous venez de copier pixels ...

    dst[y][x] = src[y'][x'] 
    

    où:

    (x',y') = Matrix2x2 * (x,y) 
    

    ou

    (x',y',w) = Matrix3x3 * (x,y,1) 
    

Peu importe si vous utilisez 2x2 ou matrice 3x3 ou multiplication codée en dur (comme dans l'exemple) voir:

mais vous devez utiliser sin,cos pour les valeurs de la matrice (une fois par rotation).La seule rotation sans sin,cos est rotation par 90 deg Où:

(x',y') = (-y,x) 

ou:

(x',y') = (y,-x)