FD ** - Je suis un newb Python ainsi qu'un débord de pile newb, comme vous pouvez le constater. J'ai modifié la question en fonction des commentaires.
Mon objectif est de lire un ensemble de fichiers PNG, de créer une ou plusieurs images avec Image.open ("nom de fichier") et de les convertir en tableaux 2D simples contenant uniquement des 1 et des 0. Le format PNG est du format RGBA, avec pour la plupart uniquement des valeurs de 255 et 0. Assez souvent dans les images, les bords sont des valeurs d'échelle de gris, ce que j'aimerais éviter dans le tableau 2D.
J'ai créé le tableau 2D à partir d'une image en utilisant np.asarray (Image) pour obtenir uniquement le canal "Rouge". Dans chacun des tableaux d'images en 2D, j'aimerais définir la valeur de la cellule = 1 si la valeur actuelle est différente de zéro.
Donc, je boucle dans le tableau 2d et je vérifie la valeur de la cellule et essayez de le définir à 1.
Cela me donne une erreur indiquant que le tableau est en lecture seule. J'ai lu à travers plusieurs threads de débordement de pile en expliquant que les tableaux np sont immuables et qu'il est encore un peu flou. J'utilise PIL et numpy
Merci @ user2314737. Je vais essayer de mettre ce drapeau. @ Eric, merci pour vos commentaires également.
from PIL import Image
import numpy as np
Le code correspondant:
prArray = [np.asarray(img)[:, :, 0] for img in problem_images]
for img in prArray:
for x in range(184):
for y in range(184):
if img[x][y] != 0:
img[x][y] = 1
L'erreur "La destination de l'affectation est en lecture seule" est dans la dernière ligne.
Merci à tous pour l'aide.
Vérifiez si le tableau est accessible en écriture avec
>>> img.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : False
ALIGNED : True
UPDATEIFCOPY : False
Si WRITEABLE
is est faux, changez-le avec
img.setflags(write=1)
Depuis numpy
version 1.16.0
, ce qui suit ne fonctionne plus:
img = np.asarray(Image.open(filename))
img.setflags(write=1)
Le problème est que maintenant OWNDATA
est défini sur False
et vous ne pouvez pas définir l'indicateur WRITEABLE
sur True
. Par conséquent, vous devriez simplement faire ce qui suit:
img = np.array(Image.open(filename))
Si je ne me trompe pas, cela fera une copie du tableau lors de sa conversion de l'objet Pillow
vers le tableau numpy
. Cependant, j’ai testé les performances temporelles dans numpy
1.16.0
et je n’ai trouvé aucune différence notable entre les deux méthodes.