Rotation image (matrice) ?

Signaler
Messages postés
249
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
9 août 2008
-
Messages postés
249
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
9 août 2008
-
Bonjour,





voilà, je suis sur un petit projet. Il consite a charger une image en .RAW (binaire) et de l'afficher sous diéfrente forme.





Donc, je charge cette image .RAW (128x128) je stock chaque octet dans un tableau de 128x128 (c est ma matrice)





Avec Gtk j'affiche donc mon ma matrice, et cella m'affiche mon image .raw





j'ai déja fait quelque truc, comme la symétrie (vertical,horizontal etc..)





mais je bloque sur la Rotation :S





je sais que pour faire une rotation il faut cette formule :





X' = cos(alpha) * X + (-sin(alpha) * Y);


X' = sin(alpha) * X + (cos(alpha) * Y);








mais je sais comment mettre ca en pratique .....





si quelqu'un peut me donner un coup de main?





merci

9 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Tu auras besoin d'une seconde matrice (c'est plus simple) pour stocker
le résultat. Sinon je vois pas ou est le pb, tu prends chaques pixel de
ton image, tu lui appliques la transformation, et tu stokes le point
final dans la matrice résultat. Le pb est qu'il va rester des points
blancs.



Donc peut etre qu'il vaut mieux prendre le pb dans le sens inverse. Tu
prends chaque pixel de la matrice résultat, tu regardes quels pixels
doit aller à cette place. Donc a partir de la formule, tu exprimes X et
Y en fonction et X' et Y'. En fait ca revient a faire la rotation dans
le sens inverse.



Bon en première approximation ca devrait aller. Pour avoir un meilleur
résultat, comme X et Y ne seront pas des entiers, tu peux faire une
interpolation linéaire.
Messages postés
249
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
9 août 2008

d'abord merci beacoup d'aovoir répondu,



J'ai pensé faire comme tu m'as dit , mais le probleme, c'est que quand
je calcul X' ou Y' je me retrouve avec des chiffre negatife :S



donc je comprend pas comment stocker ce nouveau pt dans ma matrice resultat



Dison que j'ai ma matrice 5 x 5 avec mon dessin (tres grossierement c ets jste pour s imaginer)





1 2 3 4 5

1 XOOXX

2 OXXOX

3 OXXOX

4 XOOXX

5 XXXXX



et Ma Matrice Resultat



1 2 3 4 5


1 XXXXX


2 XXXXX


3 XXXXX


4 XXXXX


5 XXXXX



Donc je prend mon pixel qui se trouve dans 1,1



X' = cos(90) * 1 + (-sin(90) * 1);

Y' = sin(90) * 1 + (cos(90) * 1);



X' = -1

Y' = 1



la comment je fait pour mettre ce point puisque il sera en -1 ?





merci
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
Attention... Avec les transformations géométriques, tu ne sais jamais si le point transformé appartient à l'image finale. Du coup, tu auras des zones "indéfinies". Le mieux c'est de partir des points de l'image résultat et d'appliquer la transformation inverse.

Dans ton cas, il faut vérifier si ton point calculé appartient bien à l'image

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Oui bruno, ce que j'avais dis en gros :), mais quand tu fais une
rotation ton image résultat doit etre plus grosse puisque justement
elle est tournée :). La hauteur de ton image doit etre égale à la
hauteur de l'ancienne plus 2 fois sin(angle_de_rotation) * longueur de
l'ancienne. Pour la nouvelle largeur je te laisse faire.
Messages postés
249
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
9 août 2008

aaaaaa



attand la je commance a plus rien comprendre :S



comment ca elle devien 2 fois plus grosse? je la tourne l'image je vois pas commetn elle peut grandire :S





et oui je sais si je fait comme j'avais moi en cherchant X' et Y' j'auai des blanc



mais pour trouve X je vais devoir faire la matrice inverse et la je sais pas comment on fait---
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
La matrice inverse d'une rotation d'angle alpha est tout simplement la matrice de rotation d'angle -alpha

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Messages postés
249
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
9 août 2008

ok,ok merci,



donc maintenant que j'ai les X et Y a paritr des X' et Y'



je fait un truc du style



mCosinus := Cos(-90.0);

mSinus := Sin(-90.0);



//Modif Matrice

loop de la hauteur de ma matrice //128x128

loop de la longeur de ma matrice //128x128



X := J*mCosinus + I*(-mSinus);

Y := J*Msinus + I*Mcosinus;



MatriceResultat(I,J):= MatriceImage(X,Y);



end loop;

end looP;



Mais la le probleme c est encore que j'aurai surement des X ou Y négatif :(

et donc je fait comment pour acceder a cette case negative? (j ai
essayé de faire la valeur absolu mais au final ma matrice resultat est
identique a l'original...)





merci
Messages postés
15154
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 octobre 2021
99
Laisse tomber les valeurs "incorrectes". Il faut un test:
- si coordonnées obtenues appartiennent à l'image alors prendre la couleur correspondante
- sinon, mettre en noir par exemple

Buno
Messages postés
249
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
9 août 2008

Oki,



bon voila j'ai reussi a faire ma rotation, et maitenant je comprend pourquoi il fallait agrandire la Matrice resultat :)

"

La hauteur de ton image doit etre égale à la hauteur de l'ancienne plus 2 fois sin(angle_de_rotation) * longueur de l'ancienne"



j'ai essayé, mais ca me donne beacoup trop haut



comment as-tu fait pour savoir de combien agrandir?





merci