6
votes

Comment boucler toutes les pixels d'image et dire si elles sont noires ou blanches

J'ai une image simple blanche et blanche uniquement GIF (400x400px disons).

J'ai besoin d'obtenir tous les pixels de cette image et de trouver s'ils sont noirs ou blancs. J'ai besoin de créer un dictionnaire avec les informations sur les pixels et leurs couleurs alors. P>

Je suis assez nouveau à Python, donc je suis un peu en difficulté avec cela. Mais voici mon script jusqu'à présent: p> xxx pré>

essentiellement je veux que le dictionnaire final soit quelque chose comme ceci: p> xxx pré>

Edit: P>

Quand j'essaie: P>

Traceback (most recent call last):
  File "D:\python-projects\backprop.py", line 15, in <module>
    print aImage[0, 0]
  File "C:\Python26\lib\site-packages\pil-1.1.7-py2.6-win32.egg\Image.py", line
512, in __getattr__
    raise AttributeError(name)
AttributeError: __getitem__


2 commentaires

Vous ne pouvez pas utiliser d'indexation de cette manière que si vous utilisez charge . Voir les réponses de Paulo et peut commenter dessus.


Le dictionnaire que vous voulez existe déjà .. comme le AIMAGE struct. juste faire aimage.getpixexl ((0,0)) == (255.255.255) .


5 Réponses :


7
votes

Essayez:

pix = aImage.load()
print pix[x, y]


3 commentaires

@Richard: utilisez-vous une ancienne version de PIL? pythonware.com/library/pil/handbook/image.htm dit Cela fonctionnera dans PIL 1.1.6+


@Richard: corrigé. L'accès avec cette méthode est beaucoup plus rapide que GetPixel et Putpixel.


@Brian: Il y avait une erreur dans le code de l'échantillon avant l'édition.



-1
votes

êtes-vous sûr vous voulez faire cela? Il serait horriblement inefficace d'utiliser un dictionnaire pour stocker ces données.

Je penserais qu'une matrice numpy serait beaucoup plus appropriée ...


1 commentaires

Ceci est juste une petite image (400x400 pixels), donc je ne pense pas que cela compte. Mais je pourrais refroidir le code une fois que je reçois tout ce que j'ai besoin de travailler afin qu'il soit plus efficace.



9
votes

Vous devez utiliser getpixel plutôt que d'utiliser des opérateurs d'indexation. Notez que cela peut être très lent. Vous feriez mieux d'utiliser getdata , qui renvoie tous les pixels en tant que séquence.

Voir http://effbot.org/imagingbook/image.htm .


2 commentaires

Je ne pense pas que cette information est correcte. Accès via l'objet renvoyé par image.Open () est beaucoup plus rapide que GetPixel et Putpixel.


@Paulo: Mon point était qu'il devait utiliser getpixel car l'indexation ne compilerait pas avec son code, et non qu'il devrait utiliser getpixel en général. Comme mon message dit, getpixel est lent. Cependant, je pense que getdata et indexation sont probablement également appropriés d'une perspective d'efficacité.



1
votes

Si vous vouliez voir si un pouce était mono, vous pouvez essayer ceci: -

True
False


0 commentaires

0
votes

Si vous pouvez vous assurer que votre image est en mode noir et blanc, vous pouvez faire: xxx

ceci utilise le getpixel mentionné dans d'autres réponses et la clé de votre dictionnaire sera le tuple (x, y) xxx

vérifier que getpixel renvoie-y et zéros


0 commentaires