„Image.fromarray” jest trochę brzydki, ponieważ przycinam przychodzące dane do [0,255], konwertuję na bajty, a następnie tworzę obraz w skali szarości. Pracuję głównie w kolorze szarym.
To kończy się błędem TypeError: long() argument must be a string or a number, not 'PixelAccess'i patrząc na dokumentację PixelAccessklasy PIL , nie wydaje się, aby zawierała ona metody, które umożliwiłyby np.arraykonwersję danych źródłowych do ndarrayformatu. Musisz pominąć użycie img.load()i zająć się tylko wynikiem Image.open(...).
ely
Img.load () rozwiązuje dziwny problem z buforowaniem w PIL. Dane nie zostaną załadowane, dopóki nie będą wyraźnie potrzebne. Przykład nadal działa dla mnie z wyjątkiem zmiany opcji „import Image” na „from PIL import Image” podczas pracy z Pillow (widelcem PIL).
David Poole
Głosuj za użyciem tylko PIL, a nie OpenCV. Nie jestem jednak przeciwny OpenCV.
Wielkie dzięki ... Czy mógłbyś mi również pomóc dowiedzieć się, że jeśli utworzę obraz za pomocą 'cv.CreateImage (szerokość, wysokość, kanały)' ... Jak można go przekonwertować na tablicę numpy?
Shan
Myślę, że musisz zamiast tego użyć cv.CreateMat lub cv.CreateMat i skopiować z obrazu na matę za pomocą cv.CvtColor lub czegoś podobnego. Spójrz na link, który Paul zamieścił powyżej.
Justin Peel,
3
Korzystając z odpowiedzi Davida Poole'a, otrzymuję błąd SystemError z plikami PNG w skali szarości i być może innymi plikami. Moje rozwiązanie to:
import numpy as np
from PIL importImage
img =Image.open( filename )try:
data = np.asarray( img, dtype='uint8')exceptSystemError:
data = np.asarray( img.getdata(), dtype='uint8')
Właściwie img.getdata () działałoby dla wszystkich plików, ale jest wolniejsze, więc używam go tylko wtedy, gdy inna metoda zawodzi.
Format obrazu OpenCV obsługuje interfejs tablicy numpy. Można utworzyć funkcję pomocniczą obsługującą obrazy w skali szarości lub kolorowe. Oznacza to, że konwersja BGR -> RGB może być wygodnie wykonana za pomocą numpy plaster, a nie pełnej kopii danych obrazu.
Uwaga: jest to sztuczka krokowa, więc modyfikacja tablicy wyjściowej spowoduje również zmianę danych obrazu OpenCV. Jeśli chcesz kopię, użyj .copy()metody na tablicy!
import numpy as np
def img_as_array(im):"""OpenCV's native format to a numpy array view"""
w, h, n = im.width, im.height, im.channels
modes ={1:"L",3:"RGB",4:"RGBA"}if n notin modes:raiseException('unsupported number of channels: {0}'.format(n))
out = np.asarray(im)if n !=1:
out = out[:,:,::-1]# BGR -> RGB conversionreturn out
Przyjąłem również imageio, ale znalazłem następujące maszyny przydatne do przetwarzania wstępnego i końcowego:
import imageio
import numpy as np
def imload(*a,**k):
i = imageio.imread(*a,**k)
i = i.transpose((1,0,2))# x and y are mixed up for some reason...
i = np.flip(i,1)# make coordinate system right-handed!!!!!!return i/255def imsave(i, url,*a,**k):# Original order of arguments was counterintuitive. It should# read verbally "Save the image to the URL" — not "Save to the# URL the image."
i = np.flip(i,1)
i = i.transpose((1,0,2))
i *=255
i = i.round()
i = np.maximum(i,0)
i = np.minimum(i,255)
i = np.asarray(i, dtype=np.uint8)
imageio.imwrite(url, i,*a,**k)
Powodem jest to, że używam numpy do przetwarzania obrazu, a nie tylko do wyświetlania obrazu. W tym celu uint8 są niewygodne, więc konwertuję na wartości zmiennoprzecinkowe z zakresu od 0 do 1.
Podczas zapisywania obrazów zauważyłem, że musiałem sam wyciąć wartości spoza zakresu, w przeciwnym razie otrzymałem naprawdę szary wynik. (Szary wynik był wynikiem kompresji imageio pełnego zakresu, który był poza [0, 256), do wartości znajdujących się w tym zakresie).
Było też kilka innych dziwactw, o których wspomniałem w komentarzach.
Możesz łatwo uzyskać tablicę numpy obrazu rgb używając numpyiImage from PIL
import numpy as np
from PIL importImageimport matplotlib.pyplot as plt
im =Image.open('*image_name*')#These two lines
im_arr = np.array(im)#are all you need
plt.imshow(im_arr)#Just to verify that image array has been constructed properly
from keras.preprocessing import image
X_test=image.load_img('four.png',target_size=(28,28),color_mode="grayscale");#loading image and then convert it into grayscale and with it's target size
X_test=image.img_to_array(X_test);#convert image into array
cv
jest to moduł OpenCV, powinieneś oznaczyć go jako taki. Ten link może pomóc: opencv.willowgarage.com/documentation/python/ ...Odpowiedzi:
Możesz użyć nowszego interfejsu Pythona OpenCV (jeśli się nie mylę, jest dostępny od OpenCV 2.2). Natywnie używa tablic numpy:
wynik:
źródło
$ pip install opencv-python
aby zainstalować opencvTypeError: 'mode' is an invalid keyword argument for imread()
mode
argument. Zobacz moją odpowiedź poniżej, aby uzyskać zaktualizowaną metodę.PIL (Python Imaging Library) i Numpy dobrze ze sobą współpracują.
Używam następujących funkcji.
„Image.fromarray” jest trochę brzydki, ponieważ przycinam przychodzące dane do [0,255], konwertuję na bajty, a następnie tworzę obraz w skali szarości. Pracuję głównie w kolorze szarym.
Obraz RGB wyglądałby tak:
źródło
TypeError: long() argument must be a string or a number, not 'PixelAccess'
i patrząc na dokumentacjęPixelAccess
klasy PIL , nie wydaje się, aby zawierała ona metody, które umożliwiłybynp.array
konwersję danych źródłowych dondarray
formatu. Musisz pominąć użycieimg.load()
i zająć się tylko wynikiemImage.open(...)
.Możesz również użyć do tego matplotlib .
wynik:
<class 'numpy.ndarray'>
źródło
Na dzień dzisiejszy najlepiej jest użyć:
Zobaczysz
img
tablicę numpy typu:źródło
Późna odpowiedź, ale wolę
imageio
moduł od innych alternatywPodobnie jak
cv2.imread()
domyślnie tworzy tablicę numpy, ale w postaci RGB.źródło
Musisz użyć cv.LoadImageM zamiast cv.LoadImage:
źródło
Korzystając z odpowiedzi Davida Poole'a, otrzymuję błąd SystemError z plikami PNG w skali szarości i być może innymi plikami. Moje rozwiązanie to:
Właściwie img.getdata () działałoby dla wszystkich plików, ale jest wolniejsze, więc używam go tylko wtedy, gdy inna metoda zawodzi.
źródło
Format obrazu OpenCV obsługuje interfejs tablicy numpy. Można utworzyć funkcję pomocniczą obsługującą obrazy w skali szarości lub kolorowe. Oznacza to, że konwersja BGR -> RGB może być wygodnie wykonana za pomocą numpy plaster, a nie pełnej kopii danych obrazu.
Uwaga: jest to sztuczka krokowa, więc modyfikacja tablicy wyjściowej spowoduje również zmianę danych obrazu OpenCV. Jeśli chcesz kopię, użyj
.copy()
metody na tablicy!źródło
Przyjąłem również imageio, ale znalazłem następujące maszyny przydatne do przetwarzania wstępnego i końcowego:
Powodem jest to, że używam numpy do przetwarzania obrazu, a nie tylko do wyświetlania obrazu. W tym celu uint8 są niewygodne, więc konwertuję na wartości zmiennoprzecinkowe z zakresu od 0 do 1.
Podczas zapisywania obrazów zauważyłem, że musiałem sam wyciąć wartości spoza zakresu, w przeciwnym razie otrzymałem naprawdę szary wynik. (Szary wynik był wynikiem kompresji imageio pełnego zakresu, który był poza [0, 256), do wartości znajdujących się w tym zakresie).
Było też kilka innych dziwactw, o których wspomniałem w komentarzach.
źródło
Możesz łatwo uzyskać tablicę numpy obrazu rgb używając
numpy
iImage from PIL
źródło
załaduj obraz, używając następującej składni: -
źródło