Comment faire une boucle tous les pixels de l'image et de dire si elles sont en noir ou blanc
J'ai une simple en noir et blanc uniquement image gif (400x400px disons).
J'ai besoin d'obtenir tous les pixels de l'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 les couleurs à l'époque.
Je suis assez nouveau à python donc je suis un peu du mal avec cela. Mais voilà mon script pour l'instant:
#!/usr/bin/env python
import os
import Image
os.chdir("D:/python-projects")
aImage = Image.open("input.gif")
aPixelsBlackOrWhiteDictionary = {}
# now I need to fill the dictionary with values such as
# "X,Y": 0
# "X,Y": 1
# where X,Y are coordinates and 0/1 i the pixel color (b/w)
Fondamentalement, je veux le dictionnaire pour être quelque chose comme ceci:
"0,0" : 0 # pixel with X=0,Y=0 coordinates is black
"1,0" : 1 # pixel with X=1,Y=0 coordinates is White
EDIT:
Quand j'essaie:
print aImage[0, 0]
J'obtiens une erreur:
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__
Vous ne pouvez pas utiliser l'indexation de cette manière, sauf si vous utilisez
le dictionnaire que vous souhaitez existe déjà.. comme le
load
. Voir Paulo réponses et peut-commentaires sur elle.le dictionnaire que vous souhaitez existe déjà.. comme le
aImage
struct. il suffit de ne aImage.getpixexl((0,0))==(255,255,255)
.OriginalL'auteur Richard Knop | 2010-10-19
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en utilisant
getpixel
plutôt que d'utiliser l'indexation des opérateurs. Notez que cela peut être très lent. Vous feriez mieux d'utilisergetdata
, qui renvoie tous les pixels comme une séquence.Mon point était qu'il devait utiliser
getpixel
parce que l'indexation ne serait pas compiler avec son code, ce n'est qu'il devrait utilisergetpixel
en général. Comme mon post dit,getpixel
est lente. Cependant, je pense quegetdata
et l'indexation sont probablement tout aussi approprié d'un point de vue de l'efficacité.désolé, j'ai mal lu votre réponse.
OriginalL'auteur Brian
Essayer:
Notez également que vous pouvez utiliser tuples, comme dictionnaire de touches, vous pouvez utiliser mydict[(x, y)] au lieu de mydict["x,y"].
Ce pixel informations déjà stockées dans l'image, pourquoi le stocker dans un dict?
Ne semble pas avoir très bien travaillé...
Vous utilisez une ancienne version de PIL? pythonware.com/library/pil/handbook/image.htm dit que cela va fonctionner dans PIL 1.1.6+
fixe. L'accès à cette méthode est beaucoup plus rapide que la méthode getpixel et putpixel.
il y a une erreur dans l'exemple de code avant d'édition.
OriginalL'auteur Paulo Scardine
Si vous voulais voir si un pouce était mono vous pouvez essayer ceci:-
OriginalL'auteur Dantalion
Si vous pouvez vous assurer que votre image est en noir&blanc de la mode, vous pouvez le faire:
Il utilise le
getpixel
mentionné dans d'autres réponses et les clé de votre dictionnaire sera le tuple(x,y)
vérifier que
getpixel
est le retour des uns et des zérosOriginalL'auteur Thiago Druciaki
Êtes-vous sûr ce que vous voulez faire? Il serait horriblement inefficace d'utiliser un dictionnaire pour stocker ces données.
Je pense à un tableau numpy serait beaucoup plus approprié...
C'est juste une petite image (400x400 pixels), donc je ne pense pas que cela importe. Mais j'ai peut-refactoriser le code une fois que je reçois tout ce que j'ai besoin de travail, il est donc plus efficace.
OriginalL'auteur SamB