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

2025年3月17日 | 阅读 10 分钟

在图像的不同维度上训练机器学习模型需要将图像转换为 NumPy 数组。通常,转换是隐式发生的;但是,有多种方法可以显式执行相同的操作。它可以用于以光速执行复杂的计算。

诸如 OpenCV 等 Python 包用于以三维 NumPy 数组的形式存储图像,以便进行快速操作。有时,像 PIL、Scikit-image、Keras 这样的包用于以特殊格式包装图片,以便更轻松地进行图像处理。

由于 NumPy 包中没有内置函数可以将图像转换为 NumPy 数组;因此,我们必须使用 OpenCV、PIL、Scikit-image 或 Keras 等外部工具来完成此任务。

在下面的教程中,我们将了解用于将图像转换为 NumPy 数组的不同方法。我们还将学习如何在 Python 编程语言中将 NumPy 数组转换回图像。

那么,让我们开始吧。

设置所需的模块

为了开始将图像转换为 NumPy 数组,我们需要在本地系统上安装一些模块。这些模块包括

  1. NumPy:NumPy 是一个 Python 库,用于处理多维数组和矩阵。它拥有广泛的数学函数来操作这些数组。
  2. Pillow (PIL):Python 图像库,缩写为 PIL,是一个免费的开源 Python 库,提供对处理和操作包括 BMP、JPEG、PNG 和 TIFF 在内的各种图像文件格式的支持。
  3. TensorFlow:TensorFlow 是一个免费的开源 Python 编程语言库,用于机器学习和人工智能。它用于各种任务,如训练神经网络、图像识别和自然语言处理。
  4. Keras:Keras 也是一个开源库,为人工神经网络提供 Python 接口。它设计为用户友好、模块化且易于扩展。
  5. Scikit-Image:Scikit-Image 是一个用于 Python 的开源图像处理库,包括用于分割、几何变换、色彩空间操作、分析、过滤、形态学、特征检测等算法。
  6. OpenCV-Python:OpenCV 是一个庞大的开源库,用于计算机视觉、机器学习和图像处理。OpenCV 支持 Python、C++、Java 等多种编程语言。它可以用于处理图像和视频,以识别物体、人脸,甚至是人类的笔迹。

为了在系统中安装或更新这些库,我们必须在命令提示符中运行以下命令,最好在管理员模式下运行

语法

验证安装

为了检查所需的库是否已正确安装在系统中,我们可以尝试导入这些模块并执行程序。

安装完成后,创建一个新的 Python 文件并在其中输入以下语法。

示例

现在,保存文件并在命令提示符下使用以下命令运行该文件。

语法

如果程序运行没有引发任何导入错误,则所有模块都已正确安装。否则建议重新安装该模块并参考其官方文档。

现在,我们接下来将逐一介绍所有上述库将图像转换为 NumPy 数组的实现。

本教程中将使用的图像如下所示,用户可以保存以下图像,或使用他们想要的任何图像。

文件:sample-image.png

How to Convert Images to NumPy Array

方法 1:使用 OpenCV 将图像转换为 NumPy 数组

OpenCV 是一个开源库,用于在 Python 中进行实时计算机视觉和图像处理。它支持执行用于训练和其他机器学习算法的模型。它广泛用于图像和视频处理,以识别物体、人脸、人类笔迹等等。

imread() 和 imwrite() 方法是 OpenCV 库中广泛使用的方法。这些方法通常分别用于读取图像文件并将其保存为指定文件。

我们可以使用这些方法将图像文件转换为 NumPy 数组。让我们考虑以下代码片段来说明这一点。

示例

输出

The image has been converted from PNG format to  

文件:open_cv_sample_image.png

How to Convert Images to NumPy Array

说明

在上面的代码片段中,我们导入了 OpenCV 模块。然后我们使用 imread() 方法读取图像文件的内容并将其存储在一个变量中。然后我们使用 cvtColor() 方法通过传递 cv2.COLOR_BGR2RGB 属性将图像颜色从 BGR 转换为 RGB。然后我们使用 imwrite() 方法将图像写入文件。最后,我们打印了转换后图像的类型。

结果,图像已使用 OpenCV 库成功转换为 NumPy 数组。

方法 2:使用 Pillow (PIL) 将图像转换为 NumPy 数组

Pillow 库是 Python 编程语言中用于操作图像的强大库之一。Pillow 库用于根据要求以不同格式存储图像。我们还将使用 NumPy 模块的 asarray() 方法将图像转换为数组并存储。

让我们考虑以下示例,分别说明使用 PIL 和 NumPy 库将图像转换为数组。

示例

输出

The type after conversion is: 
dimensions of the array (465, 911)
The Pixel Information of the image: 
[[239 239 239 ...   3   3   3]
 [239 239 239 ...   3   3   3]
 [239 239 239 ...   3 131   3]
 ...
 [215 215  68 ... 188 169 132]
 [215  68 215 ... 155 188 188]
 [215  68 239 ... 169 188 155]]

说明

在上面的代码片段中,我们导入了所需的模块和方法,包括 PIL 库中的 Image 模块和 NumPy 模块中的 asarray() 方法。然后我们使用 Image.open() 方法加载图像文件。然后我们使用 asarray() 方法将 PIL 图像转换为 NumPy 数组。然后我们打印了转换后图像的类型及其形状和像素信息。

结果,PIL 图像已使用 PIL 和 NumPy 库成功转换为 NumPy 数组。

方法 3:使用 Scikit-Image 将图像转换为 NumPy 数组

Scikit-Image 是一个用于图像处理的开源 Python 库。该库包含各种用于分割、色彩空间操作、几何变换、分析、形态学、过滤、特征检测等算法和方法。它旨在与 NumPy 和 SciPy 等其他 Python 库互操作。

Scikit-Image 可以让我们高效地将图像转换为 NumPy 数组。我们可以使用 io.imread() 方法来读取图像文件的内容并将其转换为 NumPy 数组。

让我们考虑以下代码片段,说明 Scikit-Image 在将图像转换为 NumPy 数组中的使用。

示例

输出

The type of the transformed image: 
The data type of the image: uint8
The dimensions of the original image: (465, 911, 3)
The Pixel Information of the image:
[[[106  40  62]
  [106  40  62]
  [106  40  62]
  ...
  [222 104  94]
  [222 104  94]
  [222 104  94]]

 [[106  40  62]
  [106  40  62]
  [106  40  62]
  ...
  [222 104  94]
  [222 104  94]
  [222 104  94]]

 [[106  40  62]
  [106  40  62]
  [106  40  62]
  ...
  [222 104  94]
  [221  94  81]
  [222 104  94]]

 ...

 [[115  49  67]
  [115  49  67]
  [126  48  66]
  ...
  [175  94  84]
  [177  88  81]
  [176  82  89]]

 [[115  49  67]
  [126  48  66]
  [115  49  67]
  ...
  [180  89  94]
  [175  94  84]
  [175  94  84]]

 [[115  49  67]
  [126  48  66]
  [106  40  62]
  ...
  [177  88  81]
  [175  94  84]
  [180  89  94]]]

说明

在上面的代码片段中,我们从 skimage 库中导入了 io 模块。然后我们使用 io.imread() 方法读取图像文件,将格式转换为 NumPy 数组并将其存储在一个变量中。然后我们打印了转换后图像的类型、数据类型、维度和像素信息。

结果,PIL 图像已使用 Scikit-Image 库成功转换为 NumPy 数组。

方法 4:使用 Keras API 将图像转换为 NumPy 数组

Keras 是一个开源库,为人工神经网络提供 Python 接口。Keras 需要 TensorFlow 作为其工作接口。此方法也有助于将图像转换为 NumPy 数组。

让我们考虑以下代码片段,说明 Keras API 在将图像转换为 NumPy 数组中的使用。

示例

输出

The mode of the original image: RGB
The dimensions of the original image: (911, 465)
Details about the image after conversion:
The datatype of the transformed image: 
The type of the array: float32
The shape of the image: (465, 911, 3)
Pixel Information of the image:
[[[106.  40.  62.]
  [106.  40.  62.]
  [106.  40.  62.]
  ...
  [222. 104.  94.]
  [222. 104.  94.]
  [222. 104.  94.]]

 [[106.  40.  62.]
  [106.  40.  62.]
  [106.  40.  62.]
  ...
  [222. 104.  94.]
  [222. 104.  94.]
  [222. 104.  94.]]

 [[106.  40.  62.]
  [106.  40.  62.]
  [106.  40.  62.]
  ...
  [222. 104.  94.]
  [221.  94.  81.]
  [222. 104.  94.]]

 ...

 [[115.  49.  67.]
  [115.  49.  67.]
  [126.  48.  66.]
  ...
  [175.  94.  84.]
  [177.  88.  81.]
  [176.  82.  89.]]

 [[115.  49.  67.]
  [126.  48.  66.]
  [115.  49.  67.]
  ...
  [180.  89.  94.]
  [175.  94.  84.]
  [175.  94.  84.]]

 [[115.  49.  67.]
  [126.  48.  66.]
  [106.  40.  62.]
  ...
  [177.  88.  81.]
  [175.  94.  84.]
  [180.  89.  94.]]]

说明

在上面的代码片段中,我们导入了所需的模块和方法。然后我们使用 load_img() 方法加载图像并打印原始图像的各种详细信息。然后我们使用 img_to_array() 方法将原始图像转换为 NumPy 数组并打印转换后图像的不同详细信息。

结果,图像已使用 Keras API 成功转换为 NumPy 数组。

将图像转换为 NumPy 数组的一些主要优点

以下是将图像转换为 NumPy 数组的一些优点

  1. 高效计算
    1. NumPy 提供优化的数学运算,允许快速进行像素级计算(例如,过滤、变换)。
    2. 矢量化操作减少了对循环的需求,提高了性能。
  2. 易于操作
    1. 直接访问像素值允许用户轻松执行裁剪、调整大小、旋转和颜色调整等操作。
    2. 元素级算术使亮度、对比度调整等任务变得非常简单。
  3. 与库的兼容性
    1. 许多科学和机器学习库(OpenCV、TensorFlow、PyTorch、SciPy)都使用 NumPy 数组进行图像操作。
    2. 与深度学习框架无缝集成,用于在图像数据上训练模型。
  4. 内存效率
    1. NumPy 数组使用连续内存存储,使其比 Python 列表更高效。
    2. 支持不同的数据类型(uint8、float32)以优化内存使用。
  5. 多维处理
    1. 支持多通道图像(例如,RGB、RGBA、灰度)和批量处理。
    2. 允许轻松重塑和变换以用于模型输入。

结论

我们可以将图像以 NumPy 数组的形式馈送给复杂的神经网络以进行高效操作。有各种深度学习算法会隐式地将图像转换为数组;但是,程序和用户可以根据需要显式地执行转换。

Python 作为一种极具适应性的语言,允许程序员轻松编写人工网络和机器学习模型。借助高级 API 和不同的库,图像处理在 Python 环境中变得轻而易举。

在上面的教程中,我们学习了在各种 Python 库(包括 OpenCV、Pillow、NumPy、Scikit-Image、TensorFlow 和 Keras)的帮助下将图像转换为 NumPy 数组的各种方法。我们了解了实现这些库的不同方法来操作图像。我们还讨论了将图像转换为 NumPy 数组的几个优点。