Partage
  • Partager sur Facebook
  • Partager sur Twitter

Rotation d'une image

Sujet résolu
    21 novembre 2010 à 4:24:27

    Bonsoir,
    Le but est de faire une rotation de 90 degree vers la droite d'une image. Cette image est mise sous forme d'une matric de triplet.
    Mon probleme avec mon code est que il me renvoie:
    [[['2', '2', '2'], ['4', '4', '4']], [['2', '2', '2'], ['4', '4', '4']]]
    


    alors que je voudrais justement:
    [[['2', '2', '2'], ['3', '3', '3']], [['1', '1', '1'], ['4', '4', '4']], [['0', '0', '0'], ['5', '5', '5']]]
    


    L'exemple de matrice que j'utilise est racourcis, elle doit marcher avec n importe quelle longeure de matrice.
    Voici mon code avec la matrice que j'utilise:

    def ROTD(the_matrix):
        res = []
        res2 = []
        index = 0
        counter = 0
        while counter <= len(the_matrix):
            res = []
            index = 0
            for line in the_matrix:
                           
                res.append(line[index])
                
                index += 1
                res2.append(res)
                    
            return res2
        print res2
                
                
                
            
               
    the_matrix= [[['2', '2', '2'], ['1', '1', '1'], ['0', '0', '0']], [['3', '3', '3'], ['4', '4', '4'], ['5', '5', '5'] ]]
    



    Merci pour tout information que vous puissiez me donner.
    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2010 à 6:36:15

      tu n'as juste droit qu'aux foncions built-in ?
      admettons ... documentes-toi sur les méthodes des listes, le slicing et zip().
      sinon dans l'idée ta méthode n'est pas fausse, mais la variable counter toujours égale à zéro ne sert à rien ;)
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        21 novembre 2010 à 12:15:00

        zip() me renvoie un tuple, ce que je ne veux pas, je veux que des listes. Et je ne vois pas comment la methode slice me permet d 'atteindre ce que je veux =S


        """
        Image originale
        4*2
        0 0 0   1 1 1   2 2 2   3 3 3
        4 4 4   5 5 5   6 6 6   7 7 7
        
        
        90 degrees right:
        2*4
        4 4 4   0 0 0
        5 5 5   1 1 1
        6 6 6   2 2 2
        7 7 7   3 3 3
        """
        
        
        [[['0', '0', '0'], ['1', '1', '1'], ['2', '2', '2']], [['3', '3', '3'], ['4', '4', '4'], ['5', '5', '5']]]
        #Devient
        [[['3', '3', '3'], ['0', '0', '0']],[['4', '4', '4'], ['1', '1', '1']], [['5', '5', '5'], ['2', '2', '2']]]
        """
        Pour mieux visualiser:
        [[['0', '0', '0'], ['1', '1', '1'], ['2', '2', '2']],
        [['3', '3', '3'], ['4', '4', '4'], ['5', '5', '5']]]
        
        rotation de 90 degree vers la droite de l'image:
        
        
        [[['3', '3', '3'], ['0', '0', '0']],
        [['4', '4', '4'], ['1', '1', '1']],
        [['5', '5', '5'], ['2', '2', '2']]]
        """
        
        • Partager sur Facebook
        • Partager sur Twitter
          21 novembre 2010 à 12:54:56

          Salut,

          Ta fonction n'est pas mal.

          Comme tu as eu le mérite de chercher et de poster un bout de code, voici :

          J'y ai effectué quelques modifications :
          def ROTD_ME(tab):
              largeur =len(tab[0])
              res2 = []
              index = 0
          
              while index<largeur:
                  res = []
                  for line in tab:
                      res.append(line[index])
                  
                  res.reverse() #Si on n'applique pas cette ligne, on obtient une transposée de matrice au lieu d'une rotation
                  res2.append(res)
                  index +=1
                          
              return res2
          


          Autre proposition :
          def rotation(tab):
              """ """
              #Récupération des dimensions de la liste originale:
              hauteur = len(tab)
              largeur = len(tab[0])
              
              #Forme de la matrice finale:
              tab_rot = [[0 for i in range(hauteur)] for j in range(largeur)]
              
              #Remplissage de la matrice finale:
              for y, ligne in enumerate(tab):
                  for x, colonne in enumerate(ligne):
                      #tab_rot[largeur-x-1][y]=tab[y][x] #Sens trigo
                      tab_rot[x][hauteur-y-1]=tab[y][x] #Sens non trigo
              
              return tab_rot
          


          Bonne journée.
          • Partager sur Facebook
          • Partager sur Twitter
            21 novembre 2010 à 12:56:30

            Bonjour, il est possible que tu ait fait une erreur dans ton code, donc mets ton code, on pourrait peut-être t'aider.

            Bonne continuation
            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2010 à 13:34:57

              Merci Vapula pour la modification de ma fonction =D
              • Partager sur Facebook
              • Partager sur Twitter
                21 novembre 2010 à 16:04:00

                :o Un galérien de l'unif :) bienvenue au club ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  21 novembre 2010 à 21:22:40

                  Citation : Opus X

                  zip() me renvoie un tuple, ce que je ne veux pas, je veux que des listes. Et je ne vois pas comment la methode slice me permet d 'atteindre ce que je veux =S



                  def ROTD(the_matrix):
                      return [list(i) for i in zip(*the_matrix)]
                  
                  the_matrix= [[['2', '2', '2'], ['1', '1', '1'], ['0', '0', '0']], [['3', '3', '3'], ['4', '4', '4'], ['5', '5', '5'] ]]
                  
                  print ROTD(the_matrix)
                  

                  [[['2', '2', '2'], ['3', '3', '3']], [['1', '1', '1'], ['4', '4', '4']], [['0', '0', '0'], ['5', '5', '5']]]

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Python c'est bon, mangez-en. 

                    21 novembre 2010 à 22:17:26

                    @josmiley :
                    Fonction intéressante, mais dans ce cas, le résultat reste une transposition de la matrice plutôt qu'une rotation.

                    Par contre, je serai assez intéresse par la notation *liste que tu as utilisé.
                    D'après ce que j'ai compris

                    zip(listeA, listeB, ...] #Vu dans une doc
                    zip(*listeZ) #Vu dans ton exemple, liste Z contenant elle même des listes
                    


                    Et quelques tests plus tard, je conclus que *liste fait référence à toutes les sous-listes d'une liste pour les paramètre de cette fonction.
                    Tu peux m'en dire plus à ce sujet, ou me suggérer une doc?

                    C'est une notation que j'ai l'impression avoir déjà vu quelque part en Python (je ne parle pas des pointeurs du langage C).

                    @pyr0technicien :
                    Qu'entends-tu par unif?
                    EDIT :Aux temps pour moi, tout me parait clair.

                    Bonne soirée.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 novembre 2010 à 8:24:35

                      Citation : vapula

                      @josmiley :
                      Fonction intéressante, mais dans ce cas, le résultat reste une transposition de la matrice plutôt qu'une rotation.



                      autant pour moi, je me basais sur l'exemple du PO.

                      voilà c'est corrigé ...

                      def ROTD(the_matrix):
                          '''pivote la matrice vers la droite'''
                          return [list(i) for i in zip(*the_matrix[::-1])]
                      
                      def ROTG(the_matrix):
                          '''pivote la matrice vers la gauche'''
                          return [list(i) for i in zip(*the_matrix)[::-1]]
                      
                      the_matrix = [[['0', '0', '0'], ['1', '1', '1'], ['2', '2', '2']], [['3', '3', '3'], ['4', '4', '4'], ['5', '5', '5']]]
                      
                      print ROTD(the_matrix)
                      
                      #affiche [[['3', '3', '3'], ['0', '0', '0']], [['4', '4', '4'], ['1', '1', '1']], [['5', '5', '5'], ['2', '2', '2']]]
                      
                      print ROTG(the_matrix)
                      
                      #affiche [[['2', '2', '2'], ['5', '5', '5']], [['1', '1', '1'], ['4', '4', '4']], [['0', '0', '0'], ['3', '3', '3']]]
                      
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Python c'est bon, mangez-en. 

                        22 novembre 2010 à 12:40:17

                        *liste, c'est "la liste des arguments passés à la fonction".
                        Si tu écris def ma_fonction(*args), dans le corps de la fonction, la liste "args" représentera la liste des arguments que tu as passés à la fonction. Par exemple, si tu appelles ma_fonction(1, 2, 3), args vaudra [1, 2, 3].

                        Si tu écris ma_fonction(*args), la fonction ma_fonction sera appelée avec les paramètres contenus dans la liste "args". Par exemple, ma_fonction(*[1, 2, 3]) est la même chose que ma_fonction(1, 2, 3).
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          22 novembre 2010 à 12:53:43

                          Le tutoriel de la docs officielle explique plutôt bien le principe (en anglais). ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 novembre 2010 à 0:00:26

                            Merci. Je vais relire ceci à tête plus reposée.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Rotation d'une image

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown