Anda dapat menggunakan antarmuka python OpenCV yang lebih baru (jika saya tidak salah itu tersedia sejak OpenCV 2.2). Ini secara native menggunakan array numpy:
import cv2
im = cv2.imread("abc.tiff",mode='RGB')print type(im)
Berhati-hatilah bahwa cv2.imread () mengembalikan array numpy di BGR bukan RGB.
pnd
6
@pnd komentar Anda sakral!
Eduardo Pignatelli
4
Untuk referensi di masa mendatang: $ pip install opencv-pythonuntuk menginstal opencv
Kyle C
2
TypeError: 'mode' is an invalid keyword argument for imread()
Rishabh Agrahari
8
OpenCV tampaknya telah menjatuhkan modeargumen. Lihat jawaban saya di bawah untuk metode yang diperbarui.
belvederef
73
PIL (Python Imaging Library) dan Numpy bekerja sama dengan baik.
Saya menggunakan fungsi berikut.
from PIL importImageimport numpy as np
def load_image( infilename ):
img =Image.open( infilename )
img.load()
data = np.asarray( img, dtype="int32")return data
def save_image( npdata, outfilename ):
img =Image.fromarray( np.asarray( np.clip(npdata,0,255), dtype="uint8"),"L")
img.save( outfilename )
'Image.fromarray' sedikit jelek karena saya memotong data yang masuk ke [0,255], mengonversinya ke byte, lalu membuat gambar grayscale. Saya kebanyakan bekerja dengan warna abu-abu.
Ini gagal karena kesalahan, TypeError: long() argument must be a string or a number, not 'PixelAccess'dan melihat dokumentasi untuk PixelAccesskelas PIL , tampaknya tidak menawarkan metode yang akan memungkinkan np.arrayuntuk mengubah data yang mendasarinya ke dalam ndarrayformat. Anda perlu menghilangkan penggunaan img.load()dan hanya menangani hasil dari Image.open(...).
ely
Img.load () mengatasi masalah caching yang aneh di PIL. Data tidak akan dimuat sampai dibutuhkan secara eksplisit. Contoh ini masih berfungsi untuk saya dengan pengecualian mengubah "import Image" menjadi "from PIL import Image" saat bekerja dengan Pillow (garpu PIL).
David Poole
Beri suara positif untuk menggunakan PIL saja dan bukan OpenCV. Saya tidak menentang OpenCV.
Terima kasih banyak ... Bisakah Anda juga membantu saya untuk mengetahui bahwa jika saya membuat gambar menggunakan 'cv.CreateImage (lebar, tinggi, saluran)' ... Bagaimana cara mengubahnya menjadi numpy array?
Shan
Saya pikir Anda perlu menggunakan cv.CreateMat sebagai gantinya atau menggunakan cv.CreateMat dan menyalin dari gambar ke tikar menggunakan cv.CvtColor atau yang serupa. Lihat link yang diposting Paul di atas.
Justin Peel
3
Saat menggunakan jawaban dari David Poole, saya mendapatkan SystemError dengan PNG skala abu-abu dan mungkin file lainnya. Solusi saya adalah:
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')
Sebenarnya img.getdata () akan berfungsi untuk semua file, tetapi lebih lambat, jadi saya menggunakannya hanya ketika metode lain gagal.
Format gambar OpenCV mendukung antarmuka numpy array. Fungsi pembantu dapat dibuat untuk mendukung gambar grayscale atau berwarna. Ini berarti konversi BGR -> RGB dapat dengan mudah dilakukan dengan potongan numpy, bukan salinan lengkap data gambar.
Catatan: ini adalah trik langkah, jadi memodifikasi larik keluaran juga akan mengubah data gambar OpenCV. Jika Anda ingin menyalin, gunakan .copy()metode pada array!
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
Saya juga mengadopsi imageio, tetapi saya menemukan mesin berikut berguna untuk pra-dan pasca-pemrosesan:
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)
Alasannya adalah saya menggunakan numpy untuk pemrosesan gambar, bukan hanya menampilkan gambar. Untuk tujuan ini, uint8 terasa canggung, jadi saya mengonversi ke nilai floating point mulai dari 0 hingga 1.
Saat menyimpan gambar, saya perhatikan saya harus memotong sendiri nilai di luar kisaran, atau saya akan mendapatkan keluaran yang benar-benar abu-abu. (Keluaran abu-abu adalah hasil dari imageio yang mengompresi rentang penuh, yang berada di luar [0, 256), ke nilai yang berada di dalam rentang.)
Ada beberapa keanehan lain juga, yang saya sebutkan di komentar.
Anda bisa mendapatkan berbagai gambar rgb dengan mudah dengan menggunakan numpydanImage 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
memuat gambar dengan menggunakan sintaks berikut: -
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
adalah modul OpenCV, maka Anda harus menandainya seperti itu. Tautan ini mungkin membantu: opencv.willowgarage.com/documentation/python/…Jawaban:
Anda dapat menggunakan antarmuka python OpenCV yang lebih baru (jika saya tidak salah itu tersedia sejak OpenCV 2.2). Ini secara native menggunakan array numpy:
hasil:
sumber
$ pip install opencv-python
untuk menginstal opencvTypeError: 'mode' is an invalid keyword argument for imread()
mode
argumen. Lihat jawaban saya di bawah untuk metode yang diperbarui.PIL (Python Imaging Library) dan Numpy bekerja sama dengan baik.
Saya menggunakan fungsi berikut.
'Image.fromarray' sedikit jelek karena saya memotong data yang masuk ke [0,255], mengonversinya ke byte, lalu membuat gambar grayscale. Saya kebanyakan bekerja dengan warna abu-abu.
Gambar RGB akan menjadi seperti ini:
sumber
TypeError: long() argument must be a string or a number, not 'PixelAccess'
dan melihat dokumentasi untukPixelAccess
kelas PIL , tampaknya tidak menawarkan metode yang akan memungkinkannp.array
untuk mengubah data yang mendasarinya ke dalamndarray
format. Anda perlu menghilangkan penggunaanimg.load()
dan hanya menangani hasil dariImage.open(...)
.Anda juga dapat menggunakan matplotlib untuk ini.
keluaran:
<class 'numpy.ndarray'>
sumber
Mulai hari ini, taruhan terbaik Anda adalah menggunakan:
Anda akan melihat
img
akan menjadi jenis array numpy:sumber
Jawaban terlambat, tapi saya datang untuk lebih memilih
imageio
modul daripada alternatif lainMirip dengan
cv2.imread()
, ini menghasilkan array numpy secara default, tetapi dalam bentuk RGB.sumber
Anda perlu menggunakan cv.LoadImageM, bukan cv.LoadImage:
sumber
Saat menggunakan jawaban dari David Poole, saya mendapatkan SystemError dengan PNG skala abu-abu dan mungkin file lainnya. Solusi saya adalah:
Sebenarnya img.getdata () akan berfungsi untuk semua file, tetapi lebih lambat, jadi saya menggunakannya hanya ketika metode lain gagal.
sumber
Format gambar OpenCV mendukung antarmuka numpy array. Fungsi pembantu dapat dibuat untuk mendukung gambar grayscale atau berwarna. Ini berarti konversi BGR -> RGB dapat dengan mudah dilakukan dengan potongan numpy, bukan salinan lengkap data gambar.
Catatan: ini adalah trik langkah, jadi memodifikasi larik keluaran juga akan mengubah data gambar OpenCV. Jika Anda ingin menyalin, gunakan
.copy()
metode pada array!sumber
Saya juga mengadopsi imageio, tetapi saya menemukan mesin berikut berguna untuk pra-dan pasca-pemrosesan:
Alasannya adalah saya menggunakan numpy untuk pemrosesan gambar, bukan hanya menampilkan gambar. Untuk tujuan ini, uint8 terasa canggung, jadi saya mengonversi ke nilai floating point mulai dari 0 hingga 1.
Saat menyimpan gambar, saya perhatikan saya harus memotong sendiri nilai di luar kisaran, atau saya akan mendapatkan keluaran yang benar-benar abu-abu. (Keluaran abu-abu adalah hasil dari imageio yang mengompresi rentang penuh, yang berada di luar [0, 256), ke nilai yang berada di dalam rentang.)
Ada beberapa keanehan lain juga, yang saya sebutkan di komentar.
sumber
Anda bisa mendapatkan berbagai gambar rgb dengan mudah dengan menggunakan
numpy
danImage from PIL
sumber
memuat gambar dengan menggunakan sintaks berikut: -
sumber