2016-09-18 14 views
12

FD ** - Jestem nowicjuszem w Pythonie, a także przepełnieniem stosu, jak można powiedzieć. Edytowałem pytanie na podstawie komentarzy.np. Tablice są niezmienne - "miejsce przeznaczenia jest tylko do odczytu"

Moim celem jest odczytanie zestawu plików PNG, utworzenie obrazu (obrazów) za pomocą Image.open ("nazwa pliku") i przekonwertowanie ich na proste tablice 2D z tylko 1s i 0s. Plik PNG ma format RGBA, a wartościami są tylko 255 i 0. Dość często na obrazach krawędzie są wartościami skali szarości, których chciałbym uniknąć w tablicy 2D.

Stworzyłem tablicę 2D z obrazu za pomocą np.asarray (Image) pobierając tylko kanał "Red". W każdej z matryc obrazów 2d chciałbym ustawić wartość komórki = 1, jeśli bieżąca wartość jest różna od zera.

Tak, pętla do 2d tablicy i sprawdzić wartość komórki i spróbuj ustawić go na 1.

To daje mi błąd informujący, że tablica jest tylko do odczytu. Przeczytałem kilka wątków przepełnienia stosu, omawiając, że np. Tablice są niezmienne i jest jeszcze trochę niejasna. Używam PIL i numpy

Dzięki @ user2314737. Spróbuję ustawić tę flagę. @Eric, dzięki za twoje uwagi.

from PIL import Image 
import numpy as np 

Odpowiedni kod:

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 

Błąd „przypisanie docelowe jest tylko do odczytu” jest w ostatnim wierszu.

Dziękuję wszystkim za pomoc.

+0

istnieją liczne linki http://stackoverflow.com/questions/13572448/change -values-in-a-numpy-array sugeruje co najmniej dwa: – NaN

+0

Skąd się wzięło 'img' i dlaczego potrzebujesz' asarray'? – Eric

+2

Cała ta część kodu może być lepiej napisana 'prArray = prArray! = 0' – Eric

Odpowiedz

16

Sprawdź, czy tablica jest zapisywalny z

>>> img.flags 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : False 
    OWNDATA : True 
    WRITEABLE : False 
    ALIGNED : True 
    UPDATEIFCOPY : False 

Jeśli WRITEABLE jest fałszywy, należy zmienić go

img.setflags(write=1) 
+4

Może istnieć dobry powód, że tablica jest tylko do odczytu - warto byłoby zastanowić się, dlaczego producent' img' zadecydował o wyniku jest tylko do odczytu przed zmianą flag. Jeśli powód jest dobry, zastanów się nad użyciem 'img = img.copy()' – Eric

Powiązane problemy