Baiklah, saya bermain-main dengan mengubah objek gambar PIL bolak-balik ke array numpy sehingga saya dapat melakukan beberapa transformasi pixel demi pixel yang lebih cepat daripada yang PixelAccess
diperbolehkan oleh objek PIL . Saya telah menemukan cara untuk menempatkan informasi piksel dalam array numpy 3D yang bermanfaat dengan cara:
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
Tapi sepertinya saya tidak tahu bagaimana cara memuatnya kembali ke objek PIL setelah saya melakukan semua transformasi yang luar biasa. Saya menyadari putdata()
metodenya, tetapi sepertinya tidak bisa berperilaku.
pic.size[0]
danpic.size[1]
harus ditukar (mis.reshape(pic.size[1], pic.size[0], 3)
), Karenasize
iswidth x height
ataux * y
, sedangkan pemesanan matriksrows x columns
.Jawaban:
Anda tidak mengatakan bagaimana tepatnya
putdata()
tidak berperilaku. Saya berasumsi Anda sedang melakukannyaIni karena
putdata
mengharapkan urutan tupel dan Anda memberikannya array yang numpy. Iniakan bekerja tetapi sangat lambat.
Pada PIL 1.1.6, cara "tepat" untuk mengkonversi antara gambar dan array numpy cukup sederhana
meskipun array yang dihasilkan dalam format yang berbeda dari milik Anda (array 3-d atau baris / kolom / rgb dalam kasus ini).
Kemudian, setelah Anda membuat perubahan pada array, Anda harus dapat melakukan
pic.putdata(pix)
atau membuat gambar baru denganImage.fromarray(pix)
.sumber
Image.fromarray
tidak tercantum dalam dokumentasi PIL (!) Jadi saya tidak akan pernah menemukannya jika bukan karena ini.numpy.asarray(pic)
sebagai cara "tepat" untuk mengonversi, bukannumpy.array(pic)
. Per jawaban iniarray
akan membuat salinan sedangkanasarray
tidak akan (tetapi kemudianasarray
hasilnya akan menjadi read-only).Buka
I
sebagai larik:Lakukan beberapa hal untuk
I
, lalu, konversikan kembali ke gambar:Saring gambar numpy dengan FFT, Python
Jika Anda ingin melakukannya secara eksplisit karena beberapa alasan, ada fungsi pil2array () dan array2pil () menggunakan getdata () pada halaman ini di dalam korelasi.zip.
sumber
import Image
pertama kali? Apakah Anda sudah menginstal PIL?uint8
konversi itu perlu?numpy.asarray(Image.open(filename))
tampaknya berfungsi untuk gambar .jpg tetapi tidak untuk .png. Hasilnya ditampilkan sebagaiarray(<PngImagePlugin.PngImageFile image mode=LA size=500x500 at 0x3468198>, dtype=object)
. Tampaknya tidak ada metode objek yang disebutkan dengan jelasPngImagePlugin.PngImageFile
untuk memecahkan masalah ini. Kira saya harus menanyakan ini sebagai pertanyaan baru tetapi sangat relevan dengan utas ini. Adakah yang mengerti apa yang salah di sini?getdata()
mengembalikan urutan seperti objek ( pillow.readthedocs.io/en/3.4.x/reference/… ), tetapi gambar bantal mengimplementasikan__array_interface__
yangnumpy
dapat digunakan untuk mengakses byte mentah gambar tanpa harus melewati iterator (lihat github.com/python-pillow/Pillow/blob/… dan docs.scipy.org/doc/numpy/reference/arrays.interface.html ). Anda bahkan dapat menggunakannumpy.array(PIL.Image.open('test.jpg'))
Saya menggunakan Pillow 4.1.1 (penerus PIL) dengan Python 3.5. Konversi antara Bantal dan numpy sangat mudah.
Satu hal yang perlu diperhatikan adalah bahwa bantal-gaya
im
adalah kolom-utama sedangkan gaya numpyim2arr
adalah baris-utama Namun, fungsiImage.fromarray
sudah mempertimbangkan ini. Yaitu,arr2im.size == im.size
danarr2im.mode == im.mode
dalam contoh di atas.Kita harus menjaga format data HxWxC ketika memproses array numpy yang ditransformasikan, misalnya melakukan transformasi
im2arr = np.rollaxis(im2arr, 2, 0)
atauim2arr = np.transpose(im2arr, (2, 0, 1))
ke dalam format CxHxW.sumber
np.flipud
perbaikan. Meskipun gambar PIL saya dibuat dari awal menggunakanImageDraw.Draw
. Saya pikir orang harus berhati-hati dari mana asal koordinat mereka.Anda perlu mengubah gambar Anda menjadi array numpy dengan cara ini:
sumber
.convert("L")
dengan.convert("RGB")
Contohnya, saya telah menggunakan hari ini:
sumber
Jika gambar Anda disimpan dalam format Blob (yaitu dalam database), Anda dapat menggunakan teknik yang sama yang dijelaskan oleh Billal Begueradj untuk mengubah gambar Anda dari Blobs ke array byte.
Dalam kasus saya, saya membutuhkan gambar saya di mana disimpan dalam kolom gumpalan di tabel db:
Saya kemudian membuat fungsi pembantu untuk mengubah dataset saya menjadi np.array:
Setelah ini, saya bisa menggunakan byteArrays di Jaringan Saraf saya.
sumber
Konversi
Numpy to PIL
gambar danPIL to Numpy
sumber
Anda dapat mengubah gambar menjadi fungsi numpy dengan mem-parsing gambar ke fungsi numpy () setelah menghilangkan fitur-fiturnya (tidak normalisasi)
sumber