如何将图像转换为NumPy数组

如何将图像转换为NumPy数组

图像是表示工作模型的一种更简单的方式。在机器学习中,Python使用高度、宽度、通道格式的图像数据,即图像被转换为高度、宽度、通道格式的Numpy数组。在这篇文章中,我们将看到如何将图像转换成NumPy数组?

需要的模块:

  • NumPy:在Python的较高版本中,如3.x以后,默认情况下,NumPy是可用的,如果没有(在较低的版本中),可以通过以下方式安装
pip install numpy
  • Pillow :这在以后的版本中也必须明确安装。它是一个首选的图像处理工具。在Python 3中,Pillow python库不过是PIL的升级版。它可以通过以下方式安装
pip install Pillow 

通过Pillow Library加载图片

让我们检查一个PNG或JPEG格式的图像。图像可以通过它的路径被引用。图像类是PIL的核心。它有open()函数,可以打开一个图像,数字文件格式和像素格式都可以被检索到。

使用的图片:

如何将图像转换为NumPy数组?

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框架,它们对解决深度学习问题很有帮助。它可以通过以下方式安装

pip install opencv-contrib-python

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将图像转换回来。操作转换后的数组并形成不同的图像数据,就可以将其送入深度学习神经网络。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Numpy教程