直接打开/加载图像作为 numpy ndarray

Open / load image as numpy ndarray directly

我曾经使用 scipy 将图像从文件直接加载到 ndarray 中。

from scipy import misc
img = misc.imread('./myimage.jpg')
type(img)
>>> numpy.ndarray

但现在它给了我 DeprecationWarningdocs 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.