W porządku, bawię się z konwertowaniem obiektu obrazu PIL tam iz powrotem na tablicę numpy, dzięki czemu mogę wykonywać szybsze transformacje piksel po pikselu, niż PixelAccess
pozwala obiekt PIL . Nauczyłem się, jak umieszczać informacje o pikselach w przydatnej macierzy liczb 3D w następujący sposób:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
Ale nie potrafię wymyślić, jak załadować go z powrotem do obiektu PIL po wykonaniu wszystkich moich niesamowitych transformacji. Zdaję sobie sprawę z tej putdata()
metody, ale nie wydaje mi się, żeby mogła się zachowywać.
pic.size[0]
ipic.size[1]
należy zamieniać (tj.reshape(pic.size[1], pic.size[0], 3)
), Ponieważsize
jestwidth x height
lubx * y
, podczas gdy porządkowanie macierzy jestrows x columns
.Odpowiedzi:
Nie mówisz, jak dokładnie
putdata()
się nie zachowuje. Zakładam, że robiszWynika to z faktu,
putdata
że oczekuje sekwencji krotek, a Ty dajesz jej tablicę numpy. Tobędzie działać, ale jest bardzo wolny.
Od PIL 1.1.6 „właściwym” sposobem konwersji między obrazami a tablicami liczbowymi jest po prostu
chociaż wynikowa tablica ma inny format niż twój (w tym przypadku tablica 3-d lub wiersze / kolumny / rgb).
Następnie, po dokonaniu zmian w tablicy, powinieneś być w stanie zrobić albo
pic.putdata(pix)
utworzyć nowy obraz za pomocąImage.fromarray(pix)
.źródło
Image.fromarray
nie ma go w dokumentacji PIL (!), Więc nigdy bym go nie znalazł, gdyby nie to.numpy.asarray(pic)
jako „właściwy” sposób konwersji, a nienumpy.array(pic)
. Zgodnie z tą odpowiedziąarray
zrobi kopię, podczas gdyasarray
nie będzie (ale wtedyasarray
wynik będzie tylko do odczytu).Otwórz
I
jako tablicę:Zrób kilka rzeczy
I
, a następnie przekonwertuj go z powrotem na obraz:Filtruj niezliczone obrazy za pomocą FFT, Python
Jeśli z jakiegoś powodu chcesz to zrobić jawnie, istnieją funkcje pil2array () i array2pil () za pomocą getdata () na tej stronie w correlation.zip.
źródło
import Image
pierwszy? Czy masz zainstalowany PIL?uint8
konwersja jest konieczna?numpy.asarray(Image.open(filename))
wydaje się działać dla obrazów .jpg, ale nie dla .png. Wynik wyświetla się jakoarray(<PngImagePlugin.PngImageFile image mode=LA size=500x500 at 0x3468198>, dtype=object)
. Wydaje się, że nie ma metod o oczywistych nazwachPngImagePlugin.PngImageFile
obiektu do rozwiązania tego. Chyba powinienem zadać to pytanie jako nowe pytanie, ale jest to bardzo istotne w tym wątku. Czy ktoś rozumie, co się tu dzieje nie tak?getdata()
zwraca obiekt podobny do sekwencji ( pillow.readthedocs.io/en/3.4.x/reference/... ), ale obraz poduszki implementuje to,__array_interface__
czegonumpy
można użyć, aby uzyskać dostęp do surowych bajtów obrazu bez konieczności przechodzenia przez iterator (patrz github.com/python-pillow/Pillow/blob/... i docs.scipy.org/doc/numpy/reference/arrays.interface.html ). Możesz nawet użyćnumpy.array(PIL.Image.open('test.jpg'))
Korzystam z Pillow 4.1.1 (następca PIL) w Pythonie 3.5. Konwersja między Pillow a Numpy jest prosta.
Jedną rzeczą, na którą należy zwrócić uwagę, jest to, że styl Poduszki
im
jest major-kolumna, podczas gdy styl numpyim2arr
-dur-dur. Jednak funkcjaImage.fromarray
już to uwzględnia. Oznacza to, żearr2im.size == im.size
iarr2im.mode == im.mode
w powyższym przykładzie.Podczas przetwarzania transformowanych tablic numpy, np. Przeprowadzania transformacji
im2arr = np.rollaxis(im2arr, 2, 0)
lubim2arr = np.transpose(im2arr, (2, 0, 1))
do formatu CxHxW, powinniśmy zadbać o format danych HxWxC.źródło
np.flipud
naprawy. Chociaż mój obraz PIL został utworzony od podstaw przy użyciuImageDraw.Draw
. Myślę, że trzeba uważać, skąd bierze się pochodzenie ich współrzędnych.Musisz przekonwertować obraz na tablicę numpy w następujący sposób:
źródło
.convert("L")
przez.convert("RGB")
Przykład, którego użyłem dzisiaj:
źródło
Jeśli twój obraz jest przechowywany w formacie Blob (tj. W bazie danych), możesz użyć tej samej techniki objaśnionej przez Billal Begueradj, aby przekonwertować swój obraz z obiektów Blob do tablicy bajtów.
W moim przypadku potrzebowałem obrazów, które były przechowywane w kolumnie obiektów blob w tabeli db:
Następnie utworzyłem funkcję pomocnika, aby zmienić mój zestaw danych na np.array:
Po tym byłem w stanie używać byteArrays w mojej sieci neuronowej.
źródło
Konwertuj
Numpy to PIL
obraz iPIL to Numpy
źródło
Możesz przekształcić obraz w numpy, parsując obraz w funkcję numpy () po wycięciu funkcji (nienormalizacja)
źródło