直接打开/加载图像作为 numpy ndarray
Open / load image as numpy ndarray directly
我曾经使用 scipy 将图像从文件直接加载到 ndarray 中。
from scipy import misc
img = misc.imread('./myimage.jpg')
type(img)
>>> numpy.ndarray
但现在它给了我 DeprecationWarning
和 docs say it will be removed in 1.2.0.,我应该改用 imageio.imread。但是:
import imageio
img = imageio.imread('./myimage.jpg')
type(img)
>>> imageio.core.util.Image
我可以通过
转换它
img = numpy.array(img)
但这似乎很老套。有什么方法可以像我之前使用 scipy 的 misc.imread
(除了使用 OpenCV)那样将图像直接加载到 numpy 数组中吗?
imageio.imread
的结果已经是一个NumPy数组; imageio.core.util.Image
是一个主要存在的 ndarray 子类,因此数组可以有一个 meta
属性来保存图像元数据。
如果您想要一个完全 numpy.ndarray
类型的对象,您可以使用 asarray
:
array = numpy.asarray(img)
与numpy.array(img)
不同,这不会复制img
的数据。
如果是位图甚至是 jpeg,您可以这样做:
import matplotlib.pyplot as plt
import numpy as np
# 'pip install pillow' but import PIL
from PIL import Image
png_filepath = 'somepng.png'
png_pil_img = Image.open(png_filepath)
# this will print info about the PIL object
print(png_pil_img.format, png_pil_img.size, png_pil_img.mode)
png_np_img = np.asarray(png_pil_img)
plt.imshow(png_np_img) # this will graphit in a jupyter notebook
# or if its grayscale plt.imshow(png_np_img, cmap='gray')
# FWIW, this will show the np characteritics
print("shape is ", png_np_img.shape)
print("dtype is ", png_np_img.dtype)
print("ndim is ", png_np_img.ndim)
print("itemsize is ", png_np_img.itemsize) # size in bytes of each array element
print("nbytes is ", png_np_img.nbytes) # size in bytes of each array element
如果你有一个jpg,它的作用是一样的。 PIL.image 将解码压缩的 JPG,并为您将其转换为数组。从字面上看,它会完成所有 this for you. Perhaps you could load the raw bitmap 文件 io 跳过 header,yadda yadda,但 PIL 受欢迎是有原因的。
灰度 png 的输出将如下所示:
PNG (3024, 4032) L
shape is (4032, 3024)
dtype is uint8
ndim is 2
itemsize is 1
nbytes is 12192768
彩色 jpeg 的输出将如下所示:
JPEG (704, 480) RGB
shape is (480, 704, 3)
dtype is uint8
ndim is 3
itemsize is 1
nbytes is 1013760
在任何一种情况下,像素值的范围都是 0-255 作为整数。它们不是花车。彩色图像有红绿蓝三个通道对应。灰度图像分辨率更高,jpg.
我曾经使用 scipy 将图像从文件直接加载到 ndarray 中。
from scipy import misc
img = misc.imread('./myimage.jpg')
type(img)
>>> numpy.ndarray
但现在它给了我 DeprecationWarning
和 docs say it will be removed in 1.2.0.,我应该改用 imageio.imread。但是:
import imageio
img = imageio.imread('./myimage.jpg')
type(img)
>>> imageio.core.util.Image
我可以通过
转换它img = numpy.array(img)
但这似乎很老套。有什么方法可以像我之前使用 scipy 的 misc.imread
(除了使用 OpenCV)那样将图像直接加载到 numpy 数组中吗?
imageio.imread
的结果已经是一个NumPy数组; imageio.core.util.Image
是一个主要存在的 ndarray 子类,因此数组可以有一个 meta
属性来保存图像元数据。
如果您想要一个完全 numpy.ndarray
类型的对象,您可以使用 asarray
:
array = numpy.asarray(img)
与numpy.array(img)
不同,这不会复制img
的数据。
如果是位图甚至是 jpeg,您可以这样做:
import matplotlib.pyplot as plt
import numpy as np
# 'pip install pillow' but import PIL
from PIL import Image
png_filepath = 'somepng.png'
png_pil_img = Image.open(png_filepath)
# this will print info about the PIL object
print(png_pil_img.format, png_pil_img.size, png_pil_img.mode)
png_np_img = np.asarray(png_pil_img)
plt.imshow(png_np_img) # this will graphit in a jupyter notebook
# or if its grayscale plt.imshow(png_np_img, cmap='gray')
# FWIW, this will show the np characteritics
print("shape is ", png_np_img.shape)
print("dtype is ", png_np_img.dtype)
print("ndim is ", png_np_img.ndim)
print("itemsize is ", png_np_img.itemsize) # size in bytes of each array element
print("nbytes is ", png_np_img.nbytes) # size in bytes of each array element
如果你有一个jpg,它的作用是一样的。 PIL.image 将解码压缩的 JPG,并为您将其转换为数组。从字面上看,它会完成所有 this for you. Perhaps you could load the raw bitmap 文件 io 跳过 header,yadda yadda,但 PIL 受欢迎是有原因的。
灰度 png 的输出将如下所示:
PNG (3024, 4032) L
shape is (4032, 3024)
dtype is uint8
ndim is 2
itemsize is 1
nbytes is 12192768
彩色 jpeg 的输出将如下所示:
JPEG (704, 480) RGB
shape is (480, 704, 3)
dtype is uint8
ndim is 3
itemsize is 1
nbytes is 1013760
在任何一种情况下,像素值的范围都是 0-255 作为整数。它们不是花车。彩色图像有红绿蓝三个通道对应。灰度图像分辨率更高,jpg.