如何将图像转换为NumPy数组
图像是表示工作模型的一种更简单的方式。在机器学习中,Python使用高度、宽度、通道格式的图像数据,即图像被转换为高度、宽度、通道格式的Numpy数组。在这篇文章中,我们将看到如何将图像转换成NumPy数组?
需要的模块:
- NumPy:在Python的较高版本中,如3.x以后,默认情况下,NumPy是可用的,如果没有(在较低的版本中),可以通过以下方式安装
pip install numpy
pip install Pillow
通过Pillow Library加载图片
让我们检查一个PNG或JPEG格式的图像。图像可以通过它的路径被引用。图像类是PIL的核心。它有open()函数,可以打开一个图像,数字文件格式和像素格式都可以被检索到。
使用的图片:
from PIL import Image
image = Image.open('Sample.png')
# summarize some details about the image
print(image.format)
print(image.size)
print(image.mode)
输出 :
PNG
(400, 200)
RGB
将图像转换为NumPy数组
Python提供了许多模块和API用于将图像转换为NumPy数组。让我们来讨论如何在Python中把图像转换成NumPy数组。
使用NumPy模块将图像转换为NumPy数组
Numpy模块本身就提供了各种方法来做同样的事情。这些方法是 –
例子1:使用asarray()函数
asarray()函数用于将PIL图像转换成NumPy数组。这个函数将输入的数据转换为数组
# Import the necessary libraries
from PIL import Image
from numpy import asarray
# load the image and convert into
# numpy array
img = Image.open('Sample.png')
# asarray() class is used to convert
# PIL images into NumPy arrays
numpydata = asarray(img)
# <class 'numpy.ndarray'>
print(type(numpydata))
# shape
print(numpydata.shape)
输出 :
<class 'numpy.ndarray'>
(200, 400, 3)
例子2:使用numpy.array()函数
通过使用numpy.array()函数,该函数将图像作为参数并转换为NumPy数组。
from PIL import Image
import numpy
img= Image.open("Sample.png")
np_img = numpy.array(img)
print(np_img.shape)
输出 :
(200, 400, 3)
为了得到NumPy数组图像的每个像素的值,我们需要打印从asarray()函数或array()函数中得到的检索数据。
# Import the necessary libraries
from PIL import Image
from numpy import asarray
# load the image and convert into
# numpy array
img = Image.open('Sample.png')
numpydata = asarray(img)
# data
print(numpydata)
输出 :
[[[111 60 0]
[116 65 0]
[122 69 0]
...
[ 97 47 0]
[ 99 47 0]
[100 49 0]]
[[111 61 0]
[118 65 0]
[122 69 0]
...
[ 97 47 0]
[ 99 48 0]
[100 49 0]]
[[118 65 0]
[122 69 0]
[126 73 3]
...
[ 98 48 0]
[100 49 0]
[100 49 0]]
...
[[ 96 44 7]
[ 95 43 6]
[ 93 41 4]
...
[225 80 3]
[228 80 0]
[229 78 0]]
[[ 93 40 6]
[ 90 37 5]
[ 85 32 0]
...
[226 81 4]
[231 80 1]
[232 79 1]]
[[ 89 36 4]
[ 84 31 0]
[ 79 26 0]
...
[228 81 4]
[232 81 4]
[233 80 2]]]
从转换后的Numpy数组中取回图像
Image.fromarray()函数帮助我们从转换后的numpy数组中取回图像。来回转换后,我们得到的像素也是一样的。因此,这是很有效的
img = Image.open('Sample.png')
numpydata = asarray(img)
print(type(numpydata))
# shape
print(numpydata.shape)
# Below is the way of creating Pillow
# image from our numpyarray
pilImage = Image.fromarray(numpydata)
print(type(pilImage))
# Let us check image details
print(pilImage.mode)
print(pilImage.size)
输出 :
<class 'numpy.ndarray'>
(200, 400, 3)
<class 'PIL.Image.Image'>
RGB
(400, 200)
使用Keras API将图像转换为NumPy数组
Keras API提供了加载、转换和保存图像数据的功能。Keras可以在TensorFlow框架的基础上运行,因此,这是必须要有的。深度学习计算机视觉图像需要Keras API。要安装它,请在终端键入以下命令
pip install keras
因为Keras需要TensorFlow 2.2或更高版本。如果没有,需要安装它。为了安装它,在终端键入以下命令。
pip install tensorflow
from keras.preprocessing.image import load_img
import warnings
# load the image via load_img
# function
img = load_img('sample.png')
# details about the image printed below
print(type(img))
print(img.format)
print(img.mode)
print(img.size)
输出 :
<class 'PIL.PngImagePlugin.PngImageFile'>
PNG
RGB
(400, 200)
使用Keras API,将图像转换为Numpy数组,并将图像从Numpy数组中还原。
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import array_to_img
# details about the image printed below
print(type(img))
print(img.format)
print(img.mode)
print(img.size)
# convert the given image into numpy array
img_numpy_array = img_to_array(img)
print("Image is converted and NumPy array information :")
# <class 'numpy.ndarray'>
print(type(img_numpy_array))
# type: float32
print("type:", img_numpy_array.dtype)
# shape: (200, 400, 3)
print("shape:", img_numpy_array.shape)
# convert back to image
img_pil_from_numpy_array = array_to_img(img_numpy_array)
# <class 'PIL.PngImagePlugin.PngImageFile'>
print("converting NumPy array into image:",
type(img_pil_from_numpy_array))
输出 :
<class 'PIL.PngImagePlugin.PngImageFile'>
PNG
RGB
(400, 200)
Image is converted and NumPy array information :
<class 'numpy.ndarray'>
type: float32
shape: (200, 400, 3)
converting NumPy array into image: <class 'PIL.Image.Image'>
从上面的输出,我们可以检查出源图像PIL.Image.Image和目标图像类型是相同的。
使用OpenCV库将图像转换为NumPy数组
OpenCV 3.x版本有DNN和Caffe框架,它们对解决深度学习问题很有帮助。它可以通过以下方式安装
cv2软件包有以下方法
- imread()函数用于加载图像,它还以NumPy数组格式读取给定的图像(PIL图像)。
- 然后我们需要将图像颜色从BGR转换为RGB。
- imwrite()用于在文件中保存图像。
import cv2
image = cv2.imread('Sample.png')
# BGR -> RGB
img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imwrite('opncv_sample.png', img)
print (type(img))
输出 :
<class 'numpy.ndarray'>
总结
Python是一个非常灵活的工具,我们已经看到了将图像转换为Numpy数组的方法,同样也看到了使用不同的API将图像转换回来。操作转换后的数组并形成不同的图像数据,就可以将其送入深度学习神经网络。