IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Variable Globale et paramètre


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 48
    Points
    48
    Par défaut Variable Globale et paramètre
    Bonjour,
    J'ai 3 noms de matrices que je veux passer en paramètre d'entrée pour une procédure qui chargera les valeurs binaires des pixels d'une image précise par matrice. Seulement, je n'arrive pas a passer uniquement les noms, et même en définissant mes variables avant, je ne sais pas comment modifier mes variables en globale dans la procédure, car si je met un "global Matrice" il me dit que Matrice ne peut pas être global et local... logique...
    Et si je met un "global Map, Pattern_1, Pattern2", une fois sorti de la procédure, mes variables restent inchangées par rapport a leur déclaration de base...

    Pour moi, l'idéal serait que les matrices soit passées vides et redimensionnées (grâce a la taille de l'image qui l'accompagne) dans la procédure et non avant!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    # -*- coding:Utf-8 -*-
    import Tkinter
    import os
    import PIL
    import Image, ImageTk
    from numpy import *
     
     
    def LOAD(PictureName, Matrice):
     
        #<--Preparation des données image -->
        #chargement de l'image
        Img = Image.open(PictureName)
     
        #couleur -> niveau de gris
        Img = Img.convert("L")
     
        #donnees image 
        DataImg = list(Img.getdata())
     
        #<-- chargement des listes de données binaires -->
        #Taille image : 
        Width, Height = Img.size
     
        #Initialisation de la matrice --> tous les pixels sont blanc.
        Matrice = ones((Width,Height))
     
        #Remplissage de la matrice de données binaires:
        Threshold = 200 #Valeur au dessous de laquelle le pixel sera considéré comme noir (0)
        Pixel = 0 #indice de parcours du DataImg pixel par pixel
        for j in range(0,Height,1):
            for i in range(0,Width,1):
                if DataImg[Pixel] < Threshold:
                    Matrice[i,j] = 0 #le pixel passe noir
                Pixel += 1
        print Matrice
     
    Side = 35
    Pattern_1, Pattern_2 = ones((Side,Side)), ones((Side,Side))
    Map = ones((250,200))
     
    LOAD("patt.bmp", Map)
    LOAD("patt1.bmp", Pattern_1)
    LOAD("patt2.bmp", Pattern_2)
    Merci.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 064
    Points : 1 402
    Points
    1 402
    Par défaut
    ta fonction ne retourne rien ....

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,


    Si j’ai bien compris, tu définis Pattern_1 comme ones((Side,Side)) avec Side=35 parce que tu sais que l’image "patt1.bmp" a cette taille et que Pattern_1 va devoir prendre les valeurs de pixel de cette image dans la fonction.
    Et de même pour les deux autres.

    Mais tu te mélanges un peu les pinceaux concernant l’utilité de la déclaration global et celle d’une fonction.

    À moins de se contenter de faire un truc du genre print dans un fonction, l’exécution d’une fonction doit remvoyer quelque chose, donc un return à la fin du bloc fonction.
    Comme manifestement tu veux conserver en dehors de la fonction les matrices obtenues à l’intérieur, c'est ce qui manque dans ton code.


    Je squeeze le passage des tailles comme arguments parce que la taille est fixée à l’intérieur de la fonction en fonction de chaque image.
    Ce qui donne, avec quelques réorganistions pour raccourcir tout ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # -*- coding:Utf-8 -*-
    import Tkinter
    import os
    import PIL
    import Image, ImageTk
    import numpy as np
     
     
    def LOAD(PictureName, Threshold = 200):
        #Threshold : Valeur par defaut au dessous de laquelle le pixel sera considéré comme noir (0)
     
        Img = Image.open(PictureName).convert("L") # "L" -> niveau de gris
        Grey_DataImg = [ 0 if Value_Pixel < Threshold else 1 for Value_Pixel in Img.getdata() ]
        Matrice = np.array(Grey_DataImg)
        Matrice.shape = Height,Width
     
        return Matrice
     
    Map       = LOAD("patt.bmp")
    Pattern_1 = LOAD("patt1.bmp" )
    Pattern_2 = LOAD("patt2.bmp")
    J’espère que je ne me suis pas trompé, mais c’est sans garantie car je n'ai pas numpy d'installé pour tester, actuellement.

    DataImg = list(Img.getdata()) m'a fait conclure que Img.getdata() est un itérateur, donc une boucle for dessus est utilisable dans une list comprehension, cette dernière écrite de façon à créer de suite une liste avec les bonnes valeurs en fonction de la valeur de Img.getdata() d’un pixel.

    shape pour transformer la matrice à une ligne en matrice à Height lignes et Width colonnes (si je ne me trompe pas dans l’ordre de Height et Width)

    J’espère que "patt1.bmp" et "patt2.bmp" ont bien toutes les deux des tailles (35,35) car j’ai éliminé la référence Side

    Mettre Threshold comme paramètre avec argument par défaut fixé à 200 permettra de faire varier ce seuil par simple passage d’une autre valeur comme argument.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Bonjour,

    pour moi, la meilleure façon de faire c'est de ne pas passer ton tableau numpy en argument de la fonction LOAD mais de le faire renvoyer par cette dernière.

    du coup LOAD serait quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    def LOAD(PictureName):
        #<--Preparation des données image -->
        #chargement de l'image
        Img = Image.open(PictureName)
     
        #couleur -> niveau de gris
        Img = Img.convert("L")
     
        #donnees image 
        DataImg = list(Img.getdata())
     
        #<-- chargement des listes de données binaires -->
        #Taille image : 
        Width, Height = Img.size
     
        #Initialisation de la matrice --> tous les pixels sont blanc.
        Matrice = ones((Width,Height))
     
        #Remplissage de la matrice de données binaires:
        Threshold = 200 #Valeur au dessous de laquelle le pixel sera considéré comme noir (0)
        Pixel = 0 #indice de parcours du DataImg pixel par pixel
        for j in range(0,Height,1):
            for i in range(0,Width,1):
                if DataImg[Pixel] < Threshold:
                    Matrice[i,j] = 0 #le pixel passe noir
                Pixel += 1
        print Matrice
        return Matrice
    et serait appelée comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Map = LOAD("patt.bmp")
    Pattern_1 = LOAD("patt1.bmp")
    Pattern_2 = LOAD("patt2.bmp")
    edit: pas vu le message de eyquem avant de poster

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Points : 48
    Points
    48
    Par défaut
    Parfait, merci a vous deux, j'ai pu effectivement obtenir ce que je souhaitais en mettant en paramètre en dur le "Threshold" et en utilisant un "return Matrice" tout en supprimant ma double déclaration des matrices.

    Merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/01/2011, 13h07
  2. Réponses: 1
    Dernier message: 17/07/2008, 17h41
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 20h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 14h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo