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 :

Compter le nombre de carré dans une image PNG en utilisant Numpy et en évitant les boucles imbriquées [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut Compter le nombre de carré dans une image PNG en utilisant Numpy et en évitant les boucles imbriquées
    Je veux être plus efficace avec mon code. J'ai un PNG et je veux découper l'image en boîtes. Le but est de compter le nombre de boîtes où j'ai au moins un pixel non noir. Je n'ai qu'une seule variable N.
    Cette variable définit la longueur de chaque boîte. Si nous laissons P être la plus grande longueur de mon image, alors la longueur de chaque boîte est P/N.
    Nous découpons également l'image de manière à ce qu'il y ait une boîte dans le coin supérieur gauche. De plus, il se peut ,par la taille de l'image, que mes cases ne soient pas carrés.
    Dans ce cas-là, on les considère toujours comme des boîtes dont une partie est totalement noir.

    Voici mon programme :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from skimage import io
    import numpy as np
     
    def nombre_boite(img, N):
          t=0
          i,j,k = img.shape
          step=int(max(i,j)/N)
          for k1 in range(0, i, step):
             for k2 in range(0, j, step):
                if (img[k1:k1+step,k2:k2+step] == 0).any():
                   t += 1
          return N

    Pour moi, c'est lent. Le gros problème, ce sont mes deux boucles imbriquées. Je veux m'en débarrasser mais je ne sais pas comment y parvenir.
    Je dirais que le broadcasting de Numpy pourrait m'aider mais je ne vois pas comment dans cette situation. Merci pour votre aide !

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Jotadiolne Voir le message
    Le gros problème, ce sont mes deux boucles imbriquées.!
    Non, déjà le gros problème c'est que ta fonction reçoit N, n'y touche pas et le renvoie tel quel. De là on peut se demande à quoi elle sert.

    Sinon pour optimiser des boucles imbriquées qui cherchent "un" truc, tu peux sortir de la boucle dès que le truc est trouvé (cf compter le nb de boites où tu as au-moins un pixel noir => dès que tu trouves un pixel tu peux passer à la boite suivante).

    Et enfin il y a le module "itertools" qui permet de créer des boucles. Comme il a probablement été écrit en C, il sera plus rapide que les boucles Python

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/env python3
    # coding: utf-8
     
    for i in range(5):
    	for j in range(7):
    		print("(%d, %d)," % (i, j), end=' ')
    print()
     
    import itertools
    print(tuple(itertools.product(range(5), range(7))))
    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 habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut
    Oui effectivement je viens d'écrire une erreur quand j'ai voulu réécrire mon algorithme. Pardonnez-moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from skimage import io
    import numpy as np
     
    def nombre_boite(img, N):
          t=0
          i,j,k = img.shape
          step=int(max(i,j)/N)
          for k1 in range(0, i, step):
             for k2 in range(0, j, step):
                if (img[k1:k1+step,k2:k2+step] != 0).any():
                   t += 1
          return t
    Le programme doit renvoyer t pas N.
    Je ne vois pas comment itertools pourrait m'aider dans cette situation. Parce que pour le test, c'est déjà assez rapide.
    Mais pour une image grande et une valeur de N grande, les boucles imbriquées posent problèmes.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jotadiolne Voir le message
    Oui effectivement je viens d'écrire une erreur quand j'ai voulu réécrire mon algorithme
    Et ça fonctionne (img[k1:k1+step,k2:k2+step] != 0).any() ??? A première vue, (img[k1:k1+step,k2:k2+step] != 0) c'est un booléen et un booléen n'a pas de méthode "any()"...

    Citation Envoyé par Jotadiolne Voir le message
    Je ne vois pas comment itertools pourrait m'aider dans cette situation. Parce que pour le test, c'est déjà assez rapide.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def nombre_boite(img, N):
    	i,j,k = img.shape
    	step=max(i, j) // N
    	return len(tuple(filter(lambda k: img[k[0]:k[0]+step, k[1]:k[1]+step] != 0, itertools.product(range(0, i, step), range(0, j, step)))))
    Après il n'y a pas de miracle. Une image c'est de la 2D et pour balayer un tableau 2D il faut 2 boucles...
    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]

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 8
    Par défaut
    Et bien img[k1:k1+step,k2:k2+step] est un tableau de tableau d'entiers (C'est un PNG). Donc quand img[k1:k1+step,k2:k2+step] != 0 est un tableau de tableau de bouléen.
    Le .any() est nécessaire pour vérifier si j'ai au moins un TRUE dans mon tableau de tableau.

    Je vais tester ton code !

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jotadiolne Voir le message
    Et bien img[k1:k1+step,k2:k2+step] est un tableau de tableau d'entiers (C'est un PNG). Donc quand img[k1:k1+step,k2:k2+step] != 0 est un tableau de tableau de bouléen.
    Ben... non. Comparer un tableau avec 0 donne un booléen, pas un tableau de booléen
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a=[1, 2, 3, 4]
    >>> a != 0
    True
    Et même un tableau rempli de 0 n'est pas égal à 0
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a=[0,] * 5
    >>> a
    [0, 0, 0, 0, 0]
    >>> a != 0
    True
    Après, peut-être que "img" c'est un objet particulier qui a redéfini l'opérateur __eq__ et dans ce cas ok, tout est possible.

    Citation Envoyé par Jotadiolne Voir le message
    Je vais tester ton code !
    Je l'ai écrit en partant du principe que "img" était un simple tableau. Mais si c'est un objet spécifique, rajoute-lui alors le ".any()" que je n'ai pas mis (tu devrais arriver à l'adapter)
    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]

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

Discussions similaires

  1. Compter le nombre d'éléments dans une image
    Par guykams.univ dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 02/12/2010, 19h38
  2. Réponses: 2
    Dernier message: 06/05/2007, 23h43
  3. Compter le nombre de colonne dans une table
    Par Coin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/12/2006, 16h03
  4. Compter le nombre de caractere dans une chaine
    Par jmjmjm dans le forum C++
    Réponses: 13
    Dernier message: 19/11/2006, 11h37
  5. Comptage du nombre d'objets dans une image
    Par fire.stone dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 27/02/2006, 21h26

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