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 :

Programmation d'un filtre passe-haut en utilisant scipy


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Programmation d'un filtre passe-haut en utilisant scipy
    Bonjour,

    Je suis débutante en Python et je dois programmer un filtre passe-haut dans ce langage en utilisant scipy.misc pour gérer l'image et non le module Image. Voici 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
     
    import numpy as np
    from scipy import misc
    import matplotlib.pyplot as plt
     
    img = misc.imread("fichier_initial.png")
     
    Filtre = [[0, -4, 0], [-4, 18, -4], [0, -4, 0]]
     
     
    def convolution2D(Filtre, TPix, x, y):
        p0 = p1 = p2 = 0
        for i in range(-1, 1):
            for j in range(-1, 1):
                p0 += Filtre[i + 1][j + 1] * TPix[x + j, y + i][0]
                p1 += Filtre[i + 1][j + 1] * TPix[x + j, y + i][1]
                p2 += Filtre[i + 1][j + 1] * TPix[x + j, y + i][2]
        p0 = int(p0 / 9.0)
        p1 = int(p1 / 9.0)
        p2 = int(p2 / 9.0)
        return (p0, p1, p2)
     
     
    def filtre_convolution(img_orig):
        im = np.copy(img_orig)  # On fait une copie de l'original
        for x in range(1, img_orig.shape[0] - 1):
            for y in range(1, img_orig.shape[1] - 1):
                p = convolution2D(Filtre, img_orig, x, y)
                im[x, y] = p
        return im
     
    image = filtre_convolution(img)
    plt.imshow(image)
    plt.show()
    Dans l'absolu le code fonctionne, il donne quelque chose. Mais ce n'est pas le bon résultat, autrement dit ce n'est pas ce qui est attendu avec un filtre passe-haut. Cela fait un moment que je travaille dessus et je ne trouve pas la solution ni pourquoi il y a cette pixélisation.
    Est-ce que quelqu'un pourrait m'aider s'il vous plait?
    Merci d'avance.

  2. #2
    Membre habitué
    Avatar de Grumphette
    Homme Profil pro
    Validation manager
    Inscrit en
    Juillet 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Validation manager

    Informations forums :
    Inscription : Juillet 2008
    Messages : 81
    Points : 192
    Points
    192
    Par défaut
    C'est un peu compliqué comme ça sans autre information que "ça ne marche pas". Un peu de contexte devrait aider un peu.

    Tu veux faire quoi exactement ? Tu as quoi ? et tu attendais quoi ?


    Edit : j'ai prit le temps de regarder ton code un peu. Je piges pas tout, mais déjà faire un cast en int d'une division flottante, c'est une mauvaise idée vu que tu tronques ton chiffre.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Effectivement j'ai été un peu radine.

    J'ai une image initial et je veux appliquer dessus un filtre passe-haut par convolution. Un filtre passe haut favorise les hautes fréquences spatiales, comme les détails, et de ce fait, il améliore le contraste. Donc mon image devrait être moins "flou" je pense.
    Voici l'image d'origine : Nom : fichier_initial.png
Affichages : 1592
Taille : 42,7 Ko
    Et voici ce que j'obtiens : Nom : filtre_passe_haut.png
Affichages : 1557
Taille : 280,2 Ko
    Et voici ce que je devrais obtenir : Nom : image_chat_filtre_passe_haut.png
Affichages : 1513
Taille : 63,9 Ko

    J'ai obtenu le dernier programme en utilisant le module Image en changeant à peine le programme :
    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
    import Image
     
    def convolution2D(Filtre, TPix, x, y):
        p0 = p1 = p2 = 0
        for i in range(-1, 1):
            for j in range(-1, 1):
                p0 += Filtre[i + 1][j + 1] * TPix[y + 1, x + j][0]
                p1 += Filtre[i + 1][j + 1] * TPix[y + 1, x + j][1]
                p2 += Filtre[i + 1][j + 1] * TPix[y + 1, x + j][2]
        p0 = int(p0 / 9.0)
        p1 = int(p1 / 9.0)
        p2 = int(p2 / 9.0)
        return (p0, p1, p2)
     
     
    img = Image.open("/home/laubourg/Documents/CAPES/sujet 16/fichier_initial.png")
    TabPixel = img.load()
    imgF = Image.new(img.mode, img.size)
     
    for x in range(1, img.size[1] - 1):
        for y in range(1, img.size[0] - 1):
            p = convolution2D(Filtre, TabPixel, x, y)
            imgF.putpixel((y, x), p)
    imgF.show()
    Cependant je n'ai pas le droit d'utiliser ce module. J'essaie donc avec scipy mais comme vous pouvez le voir ça donne un résultat différent d'avec le module Image et je ne vois pas pourquoi.

  4. #4
    Membre habitué
    Avatar de Grumphette
    Homme Profil pro
    Validation manager
    Inscrit en
    Juillet 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Validation manager

    Informations forums :
    Inscription : Juillet 2008
    Messages : 81
    Points : 192
    Points
    192
    Par défaut
    Tu peux me dire pourquoi tu cast en int les divisions par 9.0 ?

    Une autre question me taraude, pourquoi tu n'utilises pas la fonction de convolution 2D qui existe déjà dans scipy ?

    Edit : http://machinelearninguru.com/comput...olution_1.html ça devrait t'aider

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Parce qu'à la base je voulais le faire par moi même pour comprendre comment le programme fonctionnait.

  6. #6
    Membre habitué
    Avatar de Grumphette
    Homme Profil pro
    Validation manager
    Inscrit en
    Juillet 2008
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Validation manager

    Informations forums :
    Inscription : Juillet 2008
    Messages : 81
    Points : 192
    Points
    192
    Par défaut
    Ok, alors réfère toi au lien que j'ai posté plus haut. ça explique pas à pas

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Pour moi le code a l'air OK.
    On comprend clairement que tu itères sur un patch de 3 x 3 pixels et que tu retournes la moyenne des valeurs pour chaque composante R, V, et B.

    Je pense que si tu n'as pas le résultat ce soit plutôt à cause des valeurs choisies pour le filtre. Essaye avec d'autres valeurs pour voir.

    Aussi, il n'est pas impossible que tu aies des valeurs négatives, j'ignore si ça puisse avoir une influence mais, pour fermer une porte essaye ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        p0 = abs(int(p0 / 9.0))
        p1 = abs(int(p1 / 9.0))
        p2 = abs(int(p2 / 9.0))
    Citation Envoyé par Grumphette Voir le message
    Tu peux me dire pourquoi tu cast en int les divisions par 9.0 ?
    Parce qu'il lui faut la moyenne des neuf valeurs et que les valeurs R, V, B doivent être des entiers dans son cas.

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses.

    J'ai essayé de rajouter les valeurs absolues mais ça ne change pas l'image obtenue.
    Après les deux programmes que j'ai posté se basent sur le même filtre, donc normalement je devrais obtenir quand même obtenir le même résultat non?
    D'ailleurs les deux programmes se ressemblent fortement.... Du coup je ne pense pas que le problème vienne de la fonction convolution2D mais je peux me tromper.

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Comme ton image est un png tu es sûre d'avoir une image RVB et non pas RVBA très courante en png ?

    Si c'est le cas ça se résout simplement avec return (p0, p1, p2, 255)

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    C'était une bonne idée, mais ce n'est pas cela le problème....
    Mais au lieu de faire comme vous m'avez dit car ça me mettait une erreur (après je mets p dans im[x,y]) j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    img = misc.imread("/home/laubourg/Documents/CAPES/sujet 16/fichier_initial.png", mode = 'RGB')
    Et j'ai aussi appliqué le programme sur la même image mais en jpeg (l'original, d'ailleurs je ne sais même pas pourquoi je n'utilise pas l'image en jpeg) ça me donne exactement les mêmes résultats.

Discussions similaires

  1. [Débutant] Utilisation d'un filtre passe-haut
    Par rob408231 dans le forum Images
    Réponses: 0
    Dernier message: 23/01/2014, 17h13
  2. filtre passe haut
    Par lo9nina dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 30/12/2010, 19h11
  3. traiter image filtre passe haut
    Par okba09 dans le forum Images
    Réponses: 5
    Dernier message: 21/09/2010, 11h04
  4. Filtre passe haut et passe bas d'une image
    Par SmileSoft dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 26/03/2008, 20h30
  5. Filtre passe haut wave
    Par Flow_75 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/11/2006, 11h50

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