0
votes

Itérer sur tous les pixels pour vérifier quels pixels sont blancs et qui sont noirs

J'essaie de faire itérair une image avec seulement des pixels noirs et blancs. Pour chaque pixel noir, je veux diminuer un score, alors que pour chaque pixel blanc, je voudrais augmenter un score. Toutefois, lors du test du code suivant, je reçois cette erreur: xxx

Il a quelque chose à voir avec le img [i, j] instruction. Comment peut-il y avoir plusieurs pixels dans cette arie? Suis-je pas spécifiquement appeler un pixel en utilisant img [i, j] ? Est-ce que quelqu'un sait comment je pourrais résoudre ce problème, ou s'il existe une autre méthode de travail pour accéder à 1 pixel spécifique? xxx

L'image a été lue à l'aide de la bibliothèque OpenCV. L'image d'origine est ensuite filtrée pour une couleur spécifique, avec laquelle un masque est créé. Ce masque n'a que des pixels noirs et blancs, comme mentionné précédemment. xxx


5 commentaires

img a trois dimensions, donc img [i, j] n'est pas une valeur unique, mais un vecteur. Si la troisième dimension est 1 , vous pouvez simplement faire img [i, j, 0] à la place. Cependant, dans ce cas, vous pouvez simplement faire score = 2 * npount_nonzero (img) - img.size .


Tout d'abord impression (score) ne fonctionnera pas, pouvez-vous également montrer quelle bibliothèque (au moins, le mieux sera la meilleure façon de définir) vous utilisez pour créer l'image


L'indentation de l'impression était fausse, je l'ai réparée. Pour créer l'image, j'ai utilisé OpenCV. Je vais mettre à jour la question.


Le nom de la variable et de la fonction sont les mêmes .. pas une bonne idée!


Il existe une API OpenCV pour interroger le format d'image, le nombre de canaux, la profondeur ECC. Veuillez faire cela et, après, mettre à jour votre question, les réponses suivantes n'ont aucun sens si vous ne spécifiez pas les détails de l'image.


3 Réponses :


1
votes

Cela se produit car img [i, j] donne une matrice avec les valeurs RVB

img [i, j] = [0, 0, 0] # pour le noir

img [i, j] = [255, 255, 255] # pour blanc

et ces tableaux ne sont pas associés à true ou false . Vous devez modifier votre état. xxx

Votre condition nécessite un tout () .


4 commentaires

J'ai changé le test if-test sur si img [i, j] == [255.255.255]: mais toujours la même erreur


C'est un tableau, pas une liste, plus une matrice similaire ([255, 255, 255])


Hmm étrange, même avec numpy.array ([255.255.255]) Aucune différence


Mon mauvais, vient de réaliser que la comparaison donne une matrice, vous devez l'entourer avec tout () pour obtenir une valeur.



0
votes

Cela signifie que votre tableau a 3 dimensions. Vous pouvez imprimer img [i, j] pour voir comment on ressemble. La valeur que vous voulez est probablement souvent à la même position, appelant img [i, j, 0] ou img [i, j, 1] devrait fonctionner


1 commentaires

Si je change mon test if-test sur si img [i, j, 0] == [255.255.255]: ou si img [i, j, j, 1] == [255.255 255]: < / Code> Cela me donne toujours la même erreur.



0
votes

Ici vous allez = ^ .. ^ =

from PIL import Image

# load image
img = Image.open('BlackWhite.gif').convert('RGB')
pixel = img.load()

# calculate the score
score = 0
w=img.size[0]
h=img.size[1]
for i in range(w):
  for j in range(h):
      if pixel[i, j] == (255, 255, 255):
          score += 1
      elif pixel[i, j] == (0, 0, 0):
          score -= 1


0 commentaires