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 :

Programme python prépa


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mars 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mars 2021
    Messages : 9
    Par défaut Programme python prépa
    Salut à tous,

    J'ai une amie actuellement en prépa qui galère en python, elle à un programme qui est déjà bien avancé mais elle a un soucis que je n'arrive pas à résoudre... Voilà le but de programme :

    La première partie du programme permet de déterminer le nom de la maladie à partir des images des feuilles. Et après dans une deuxième partie on veut modéliser la propagation de la maladie en modifiant l'image de la feuille. Pour faire ça on convertie l'image en une matrice avec des 1, des 2 et des 0 et après on travaille sur cette matrice pour ensuite reconvertir cette matrice modifiée en image mais le problème c'est que ce programme m'affiche une image de feuille qui ne correspond pas du tout à l'image de départ et je comprend d'où il me sort cette autre image de feuille

    Je vous met en PJ les fichiers nécessaires :

    programme.py : le programme
    2 images avec un fond bleu : elles sont nécessaires au fonctionnement
    1 fichier texte : fichier nécessaire pour les maladies des feuilles

    Le problème : Vous allez pouvoir le constater, j'ai une fonction "modélisation" tout à la fin qui me retourne une erreur avec "img" qui n'existe pas, de mon côté je n'ai pas pu répondre à ce problème, deuxième problème : le programme est censé faire une modélisation de l'avancé de la maladie, sauf que lorsqu'elle lance le programme en ben ça fait un peu n'importe quoi... Je vous met en pj également (erreur.jpg).

    Si vous avez une solution je suis preneur
    Python.zip

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Salut

    Pas facile de t'aider. Déjà tu ne parles pas en ton nom mais au nom d'un tiers (double déformation possible), et en plus le programme fonctionne... sauf qu'il donne de mauvais résultats. Donc ce n'est pas un souci Python mais un souci de logique et il faudrait donc pouvoir connaitre la logique attendue pour voir en quoi ce code ne la suit pas.

    Ce que j'ai remarqué
    • fonction critere_maladie (inutilement complexe): le fichier est ouvert mais pas refermé
    • fonction critere_tache: il est créé une variable "str" alors que "str" est un nom de type
    • les fonctions qui retournent si un truc est ou n'est pas (exemple homogeneite_tache, jaunissement) retournent des strings, ce qui nécessite donc une connaissance du langage utilisé pour analyser leur retour. Elles devraient retourner True/False qui est universel
    • la fonction "modelisation_mildiou" est trop caractérisée. Dans les règles de l'art, il devrait être fait une fonction plus générale ex "modelisation_maladie" qui pourrait gérer tout type de maladie selon ses caractéristiques
    • le fichier "maladies feuille.txt" n'est pas écrit en utf8 donc en fait ton code chez-moi ne pouvait pas le lire, mais je pense que c'est une erreur de transfert


    Un truc facile: j'ai réécrit "critere_maladie" pour te montrer comment on fait de façon simple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def critere_maladie():
    	"fonction qui permet de créer un liste de critères des maladies"
    	critere=[]
    	with open('maladies feuille.txt','r') as fp:
    		for l in fp:
    			critere.append(l.strip().split(":"))
    	return critere

    Et une version équivalente mais plus condensée (utilisation de la notion des listes en intensions, qui sont une façon plus concise de créer des listes)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def critere_maladie():
    	"fonction qui permet de créer un liste de critères des maladies"
    	with open('maladies feuille.txt','r') as fp:
    		return tuple(l.strip().split(":") for l in fp)

    Citation Envoyé par Atou Rien Voir le message
    j'ai une fonction "modélisation" tout à la fin qui me retourne une erreur avec "img" qui n'existe pas
    Ah ? Ce n'est plus le code de ta copine mais le tien maintenant ?
    Ok, on s'en fout. Donc effectivement, dans cette fonction la variable "img" n'existe pas. Là on ne peut rien faire contre ça. Tu ne peux pas taper dans img[x] si "img" n'existe pas mais c'est toi qui dirige ton code, pas ton code qui te dirige. A toi donc de le rectifier. D'autant plus que dans cette fonction, la variable "M" n'est créée que si la maladie est "mildiou" mais M est quand-même dans tous les cas traité.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mars 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mars 2021
    Messages : 9
    Par défaut
    Salut,

    Merci beaucoup de ta réponse, je te confirme que ce n'est pas mon code mais celui de mon amie
    Tu pourrais me dire quel logiciel tu utilises pour exécuter le programme ? Je vais essayer de me pencher dessus histoire de trouver une solution, j'utilise "pyzo" de mon côté mais il n'a pas l'air de marcher étonnement

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Par défaut
    Hello,

    Egalement dans la liste de maladies oidium et mildiou ont la même description ; il doit y avoir une erreur.

    J'ai essayé de débuguer mais j'obtiens cette image qui ne me paraît pas convaincante non plus (je ne sais pas pourquoi de mon côté ça lit au format RGBA au lieu de RGB...)

    Nom : Figure_1.png
Affichages : 121
Taille : 16,2 Ko

    J'ai utilisé un dictionnaire, comme suggéré par Sve@r et retourné img (en plus de M) dans tache() et modelisation_mildiou() ; aussi ligne 222, à cause de l'erreur de description dans le fichier .txt, j'ai rajouté (il y a un espace dans la condition juste après...)

    Je n'ai pas utilisé global car le code est un peu long et je me méfie toujours de ce genre d'opérateur qui peuvent modifier ma variable "à distance"...

    EDIT : ok, en relisant le code je crois que l'aspect "carré" est dû à la modélisation, en effet, la maladie se propage en vertical ou horizontal exclusivement (pas en diagonal)... c'est assez étrange... cela vient du bout de code en ligne entre 208 et 211
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    L=[l,c-1,l,c+1,l+1,c,l-1,c] #coordonnées des pixels autour du pixel infecté
    for i in range(4):
        if M[L[2*i]][L[2*i+1]]==0:     #tous les pixels non infectés
            M[L[2*i]][L[2*i+1]]=-1
    J'ai remplacé par ceci (pour rajouter les diagonales et enlever les espèces de modulos positionnels) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in [-1,0,1] : #On explore les plus proches voisins
        for j in [-1,0,1] : #On explore les plus proches voisins
            if i==j : continue #Il s'agit du pixel infecté, on squeeze
            if not M[l+i,c+j] : M[l+i,c+j]=-1 # Si le pixel n'était pas infecté, maintenant oui :)
    Et j'obtiens ceci :
    Nom : Figure_1_variante.png
Affichages : 131
Taille : 15,3 Ko

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mars 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mars 2021
    Messages : 9
    Par défaut
    Salut,

    Merci beaucoup de ta réponse, tu pourrais me faire parvenir le fichier complet du programme avec les modifications que tu a réalisé ? C'est déjà bien mieux que ce que j'ai pu faire

  6. #6
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mars 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mars 2021
    Messages : 9
    Par défaut
    Si tu peux me faire parvenir aussi le fichier texte avec tes modifs cela m'aiderais pas mal aussi

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Atou Rien Voir le message
    Tu pourrais me dire quel logiciel tu utilises pour exécuter le programme ? Je vais essayer de me pencher dessus histoire de trouver une solution, j'utilise "pyzo" de mon côté mais il n'a pas l'air de marcher étonnement
    Sous Linux j'utilise le python standard de la distrib sur laquelle je me trouve (3.8.5 sous Xubuntu). Et si je dois aller sous Windows, j'utilise une version officielle standard, qu'on télécharge sur python.org.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre du Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Mars 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Mars 2021
    Messages : 9
    Par défaut
    Exact Charliemtx c'est le programme2 qui j'ai exécuté, je trouve ça aussi étonnant que la maladie se propage sur les bords de la feuille mais c'est déjà mieux

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Par défaut
    Hello,

    Je n'avais jamais vraiment travaillé avec des images, du coup j'ai trouvé votre exercice plutôt amusant et j'ai essayé de cleaner un peu...
    J'ai muni la classe Color de la méthode closest_color() pour déterminer la couleur générique la "plus pertinente" pour chaque pixel. Au final j'obtiens le même résultat que vous mais le code à l'air moins complexe. Ceci dit, je n'ai pas fait toute la partie moyenne/écart-type (que je ne trouve pas très pertinente si je peux me permettre)... c'est pour cette raison que j'ai mis le bloc sur le "green_reference" en commentaire, car pas utile dans mon code

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    import matplotlib.image as mi
    import matplotlib.pyplot as plt
    import matplotlib
    matplotlib.use('TkAgg')
     
    class Color :
        def __init__(self, R=0, V=0, B=0, tuple=None) :
            if tuple : self.R, self.V, self.B = tuple
            else :
                self.R = R
                self.V = V
                self.B = B
     
        def __add__(self, other) : # Addition
            r,v,b = self.R+other.R, self.V+other.V, self.B+other.B
            return Color(r,v,b)
     
        def __truediv__(self, k) : # Division
            r, v, b = self.R/k, self.V/k, self.B/k
            return Color(r,v,b)
     
        # Shortcuts
        def __iadd__(self, other) : return self+other
        def __itruediv__(self, k) : return self/k
     
        # Euclidian distance to another color
        def absolute_distance(self, other) :
            r = (self.R-other.R)**2
            v = (self.V-other.V)**2
            b = (self.B-other.B)**2
            return (r+v+b)**.5
     
        # Closest color according dictionary
        def closest_color(self) :
            min_dist, color = 1, 'black'
            for color,code in colors.items() :
                dist = self.absolute_distance(code)
                if dist < min_dist : min_dist, match = dist, color
            return match
     
        # Return 4-items array to fill imread
        def tolist(self) : return [self.R, self.V, self.B, 1]
     
    #Defining arbitrary colors
    colors = {
    'background':Color(0,0,1),
    'brown':Color(88/255,41/255,0),
    'green':Color(0,1,0),
    'white':Color(1,1,1),
    'yellow':Color(1,1,0),
    'black':Color(0,0,0),
    'red':Color(1,0,0),
    'orange':Color(1,.5,0)
    }
     
    # Loading images
    goodleaf = mi.imread('goodleaf.png')
    badleaf = mi.imread('badleaf.png')
     
    # Defining green-reference / Not really useful for this animation...
    #C = 256
    #r,v,b,n = 0,0,0,0
    #for i in range(goodleaf.shape[0]) :
    #    for j in range(goodleaf.shape[1]) :
    #        R,V,B,_ = goodleaf[i][j]
    #        if R>40/C and B<200/C and V>40/C :
    #            r += R
    #            v += V
    #            b += B
    #            n += 1
    #
    #greenColor = (r/n,v/n,b/n)
    #colors['green'] = Color(tuple=greenColor)
     
    # Create matrix, transform RGB color to [0,1,2] color
    matrix = []
    infected = []
    cleanedleaf = badleaf.copy()
    for i in range(badleaf.shape[0]) :
        line = []
        for j in range(badleaf.shape[1]) :
            R,V,B,_ = badleaf[i,j]
            closest = Color(R,V,B).closest_color()
            cleanedleaf[i,j] = colors[closest].tolist() # Determine the closes color
            if closest == 'background' : line.append(0)
            elif closest == 'white' :
                line.append(2)
                infected.append((i,j))
            else : line.append(1)
        matrix.append(line)
     
     
    # Propagation
    rounds = 20
    for r in range(rounds) :
        new_infected = [] # Creating a tuple-list of new infected for next iteration
        for px,py in infected :
            for i in [-1,0,1] :
                for j in [-1,0,1] :
                    if i==j : continue # Squeeze the center, which is already equals to 2
                    pxi, pyj = px+i, py+j
                    if matrix[pxi][pyj] == 1 : # If was not infected, not it is !
                        matrix[pxi][pyj] = 2
                        new_infected.append((pxi, pyj))
                        cleanedleaf[pxi,pyj] = [1,1,1,1] # Infected cell in RGB is white
     
        infected = new_infected # Update infected list
     
        # Animation of propagation
        plt.imshow(cleanedleaf)
        plt.title('Iteration n°%d'%r)
        plt.pause(0.1)

Discussions similaires

  1. Réponses: 145
    Dernier message: 15/02/2009, 11h51
  2. Faire communiquer deux programmes python
    Par bestdomdom dans le forum Général Python
    Réponses: 5
    Dernier message: 26/10/2006, 09h30
  3. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59

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