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 :

filtre d'image png


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Par défaut filtre d'image png
    Bonjour,

    j'ai programmé un filtrage gaussien sur une image couleurs, mais je ne suis pas satisfait du résultat.
    Quelqu'un peut-il m'aider à trouver mon erreur ?
    J'utilise pyplot pour l'affichage de l'image et imageo comme module d'image.

    Nom : modele.png
Affichages : 308
Taille : 465,1 Ko

    Résultat :
    Nom : filtre_gauss.png
Affichages : 442
Taille : 500,1 Ko

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Sans aucun doute, si tu y postes ton code !!!

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Par défaut
    Merci.

    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
     
    def filtrer1(filtreA,matB):
        """filtreA est une matrice carree
         filtrage sur une couleur seulement 
    """
        nA=filtreA.shape[0] # taille de filtreA
        nb_ligneB=matB.shape[0] # nb de lignes de matB
        nb_colonneB=matB.shape[1]
        C=matB.copy() # on copie matB
        bordure=nA//2 ## taille du bord
        for i in range(bordure,nb_ligneB-bordure): # on eclut les lignes du bord
            for j in range(bordure,nb_colonneB-bordure): # idem pour les colonnes
                Bij=matB[i-bordure:i+bordure+1,j-bordure:j+bordure+1] # on crée la matrice autour de l'élément central bij
                C[i,j]=np.sum(np.dot(Bij,filtreA)) # on calcule le terme Cij
        return(C)
     
     
    def filtrer(filtreA,matB):
        nA=filtreA.shape[0]
        nb_ligneB=matB.shape[0]
        nb_colonneB=matB.shape[1]
        C=np.zeros((nb_ligneB,nb_colonneB,3),dtype='uint8')
        for k in range(3):
            Ck=filtrer1(filtreA,matB[:,:,k]) 
            for i in range(nb_ligneB):
                for j in range(nb_colonneB):
                    C[i,j,k]=Ck[i,j]
        return(C)
     
     
    def matriceFlouGaussien(taille,sigma):    
        """
        taille : taille de la matrice impaire
        sigma : ecart-type
        retourne un niveau gaussien
        """
        mat=np.zeros([taille,taille])
        taille=taille//2
        for x in range(-taille,taille+1):
            for y in range(-taille,taille+1):
                mat[taille+x,taille+y]=np.exp(-(x**2+y**2)/(2*sigma**2))
     
        s=np.sum(mat)
        return((1/s)*mat)
     
    def FloutageGaussien(tabPix,taille,sigma):
        filtreA=matriceFlouGaussien(taille,sigma)
        return(filtrer(filtreA,tabPix))
     
    picture_floute=FloutageGaussien(Picture,5,0.9)
    plt.figure(3)
    plt.imshow(picture_floute)
    plt.show()

  4. #4
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Erreur déjà chez moi dans la fonction filtrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        nb_ligneB=matB.shape[0]
     
    AttributeError: 'str' object has no attribute 'shape'
    [edit] C'est moi qui suis en cause.
    Par contre, tu ne montres pas ce qu'est Picture...
    Perso, j'utilise PIL pour ouvrir une image, ce n'est apparemment pas ton cas.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 11
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import imageio as mg 
    picture=mg.imread('modele.png')
    Picture=np.array(picture)

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Ligne 14

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                C[i,j]=np.sum(np.dot(Bij,filtreA)) # on calcule le terme Cij
    Ton nouveau point c'est une moyenne sur les points voisins. Bij, contient l'ensemble des points du voisinage. FiltreA les coefficient à appliquer pour calculer cette moyenne. np.dot va te calculer un produit matriciel, qui ici, je doute fort que ce soit cela que tu veux. Il te faut un produit terme à terme.

    En numpy cela se fait de manière assez trivial mais tu semble pas trop maitriser numpy. Ce qui me le fait dire c'est notemment cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            for i in range(nb_ligneB):
                for j in range(nb_colonneB):
                    C[i,j,k]=Ck[i,j]
    alors qu'en numpy justement on a plein de chose bien faites pour éviter de faire des boucles sur tous les indices :
    Un petit tour vers un bon tuto numpy semble donc inévitable pour toi. Et concernant ton problème isole ta ligne de code, donne toi un filtre (meme simple, avec des 1/9 partout), et un exemple de Bij, et voit si ca correspond au résultat attendu (que tu peux calculer à la main, ou bien aussi, en écrivant la moyenne pondérée de manière explicitée en python vu que là tu connais la dimension)

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

Discussions similaires

  1. [Image]Composition d'images PNG-24
    Par NikoGJ dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 22/11/2006, 21h05
  2. [D5] Zoom d'image PNG avec transparence
    Par Thierry Laborde dans le forum Delphi
    Réponses: 9
    Dernier message: 12/06/2006, 15h41
  3. [Cross-Browser] Couleur d'une image PNG
    Par [BkM-) dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/11/2005, 21h00
  4. Filtre d'image
    Par Azharis dans le forum Windows
    Réponses: 5
    Dernier message: 14/10/2005, 19h42
  5. [Image]setCursor() et les images *.png
    Par feed_our_vision dans le forum Graphisme
    Réponses: 4
    Dernier message: 13/09/2004, 01h51

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