Keras 深度学习库提供了一个复杂的 API,用于加载、准备和增强图像数据。
API 中还包含一些未公开的函数,允许您快速轻松地加载、转换和保存图像文件。这些函数在开始计算机视觉深度学习项目时非常方便,让您能够最初使用相同的 Keras API 来检查和处理图像数据。
在本教程中,您将了解如何使用 Keras API 提供的基本图像处理函数。
完成本教程后,您将了解:
- 如何使用 Keras API 加载和显示图像。
- 如何使用 Keras API 将加载的图像转换为 NumPy 数组,然后再转换回 PIL 格式。
- 如何使用 Keras API 将加载的图像转换为灰度并保存到新文件。
通过我的新书《深度学习计算机视觉》**启动您的项目**,其中包括**分步教程**和所有示例的 **Python 源代码**文件。
让我们开始吧。
教程概述
本教程分为五个部分;它们是:
- 测试图像
- Keras 图像处理 API
- 如何使用 Keras 加载图像
- 使用 Keras 转换图像
- 使用 Keras 保存图像
测试图像
第一步是选择一个用于本教程的测试图像。
我们将使用 Isabell Schulz 拍摄的悉尼邦迪海滩的照片,该照片在宽松的知识共享许可下发布。

悉尼邦迪海滩
下载图像并将其放入您的当前工作目录,文件名为“bondi_beach.jpg”。
Keras 图像处理 API
Keras 深度学习库提供了用于处理图像数据的实用程序。
主要的 API 是 ImageDataGenerator 类,它结合了数据加载、准备和增强功能。
本教程将不涉及 ImageDataGenerator 类。相反,我们将仔细研究一些鲜为人知或未公开的函数,这些函数在处理图像数据和使用 Keras API 进行建模时可能很有用。
具体来说,Keras 提供了用于加载、转换和保存图像数据的函数。这些函数位于 utils.py 文件中,并通过 image.py 模块公开。
这些函数在启动新的深度学习计算机视觉项目或需要检查特定图像时可能很有用。
当在 API 文档的Applications(应用程序)部分中使用预训练模型时,会演示其中一些函数。
Keras 中所有的图像处理都需要安装 Pillow 库。如果未安装,您可以查阅安装说明。
我们来依次仔细研究一下这些函数。
想通过深度学习实现计算机视觉成果吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
如何使用 Keras 加载图像
Keras 提供了 `load_img()` 函数,用于从文件加载图像作为 PIL 图像对象。
以下示例从文件加载邦迪海滩照片作为 PIL 图像,并报告加载图像的详细信息。
1 2 3 4 5 6 7 8 9 10 11 |
# 使用 Keras API 加载图像的示例 from keras.preprocessing.image import load_img # 加载图像 img = load_img('bondi_beach.jpg') # 报告图像详情 print(type(img)) print(img.format) print(img.mode) print(img.size) # 显示图像 img.show() |
运行示例会加载图像并报告有关已加载图像的详细信息。
我们可以确认图像已作为 PIL 图像加载,格式为 JPEG,使用 RGB 通道,大小为 640 乘 427 像素。
1 2 3 4 |
<class 'PIL.JpegImagePlugin.JpegImageFile'> JPEG RGB (640, 427) |
然后,加载的图像将使用工作站上的默认应用程序显示,在本例中,macOS 上的“预览”应用程序。

使用默认应用程序显示 PIL 图像的示例
“load_img()”函数提供了在加载图像时可能很有用的额外参数,例如“grayscale”允许图像以灰度加载(默认为 False),“color_mode”允许指定图像模式或通道格式(默认为 rgb),以及“target_size”允许指定一个(高度,宽度)元组,在加载后自动调整图像大小。
如何使用 Keras 转换图像
Keras 提供了 `img_to_array()` 函数,用于将 PIL 格式的加载图像转换为 NumPy 数组,以便与深度学习模型一起使用。
该 API 还提供了 `array_to_img()` 函数,可用于将像素数据的 NumPy 数组转换为 PIL 图像。如果像素数据在数组格式下被修改,然后可以保存或查看,这会很有用。
以下示例加载测试图像,将其转换为 NumPy 数组,然后将其转换回 PIL 图像。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 使用 Keras API 转换图像的示例 from keras.preprocessing.image import load_img from keras.preprocessing.image import img_to_array from keras.preprocessing.image import array_to_img # 加载图像 img = load_img('bondi_beach.jpg') print(type(img)) # 转换为numpy数组 img_array = img_to_array(img) print(img_array.dtype) print(img_array.shape) # 转换回图像 img_pil = array_to_img(img_array) print(type(img)) |
运行示例首先加载 PIL 格式的照片,然后将图像转换为 NumPy 数组并报告数据类型和形状。
我们可以看到像素值从无符号整数转换为 32 位浮点值,并且在本例中转换为 [高度,宽度,通道] 的数组格式。最后,图像被转换回 PIL 格式。
1 2 3 4 |
<class 'PIL.JpegImagePlugin.JpegImageFile'> float32 (427, 640, 3) <class 'PIL.JpegImagePlugin.JpegImageFile'> |
如何使用 Keras 保存图像
Keras API 还提供了 `save_img()` 函数,用于将图像保存到文件。
该函数接受保存图像的路径和 NumPy 数组格式的图像数据。文件格式从文件名推断,但也可以通过“`file_format`”参数指定。
如果您已经操作了图像像素数据(例如缩放),并希望保存图像以备将来使用,这会很有用。
以下示例加载灰度格式的照片,将其转换为 NumPy 数组,然后保存到新的文件名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 使用 Keras API 保存图像的示例 from keras.preprocessing.image import load_img from keras.preprocessing.image import save_img from keras.preprocessing.image import img_to_array # 将图像作为灰度加载 img = load_img('bondi_beach.jpg', grayscale=True) # 将图像转换为 numpy 数组 img_array = img_to_array(img) # 使用新文件名保存图像 save_img('bondi_beach_grayscale.jpg', img_array) # 加载图像以确认其已正确保存 img = load_img('bondi_beach_grayscale.jpg') print(type(img)) print(img.format) print(img.mode) print(img.size) img.show() |
运行示例首先加载图像并强制其格式为灰度。
然后,图像被转换为 NumPy 数组并保存到当前工作目录中名为“bondi_beach_grayscale.jpg”的新文件。
为了确认文件已正确保存,它再次作为 PIL 图像加载,并报告图像的详细信息。
1 2 3 4 |
<class 'PIL.Image.Image'> 无 RGB (640, 427) |
加载的灰度图像随后使用工作站上的默认图像预览应用程序显示,在 macOS 中,该应用程序是“预览”。

使用默认图像查看应用程序显示保存的灰度图像示例
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
文章
API
总结
在本教程中,您了解了如何使用 Keras API 提供的基本图像处理函数。
具体来说,你学到了:
- 如何使用 Keras API 加载和显示图像。
- 如何使用 Keras API 将加载的图像转换为 NumPy 数组,然后再转换回 PIL 格式。
- 如何使用 Keras API 将加载的图像转换为灰度并保存到新文件。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
先生,
如何查看 save.model.h5 中的数据..如何打开..告诉我
您可以使用 load_model() 函数加载它,然后通过 get_weights() 检查权重
旋转图像需要做什么?
我在这里给出例子
https://machinelearning.org.cn/how-to-load-and-manipulate-images-for-deep-learning-in-python-with-pil-pillow/
先生您好,感谢您的解释。我有一个问题:我有一张 RGB 图像 (nChannels=3),其模式值为 16。图像大小为 470*430(宽度*高度),当我使用 img_to_array 时,我得到一个形状为 (430,470,3) 的数组。您知道如何将其转换为形状为 (3,470,430) 的数组吗?
背景如下:我已经在 Spark 中导入了相同的图像,Spark 可以通过新支持的“图像”格式读取我的图像。但是,数据被导入到一个大的数组中,我想知道如何才能理解这个大数组的结构。例如,raw[469] 给出的结果与 x[0][0][469] 相同,但 raw[470] 与 x[0][1][0] 不同,其中 raw 是使用 Spark 图像数据格式导入的图像,X 是 img_to_array 的结果。如果您能提供帮助,提前感谢!
此致
很好的问题!
是的,我在这里展示了如何操作
https://machinelearning.org.cn/a-gentle-introduction-to-channels-first-and-channels-last-image-formats-for-deep-learning/
先生您好,感谢您的信息。
我对在 Python Keras 中加载许多数据集进行训练感到困惑,您能否解释一下如何从磁盘加载我自己的数据集进行训练的步骤。
请看这个教程
https://machinelearning.org.cn/load-machine-learning-data-python/
嗨,Jason,
谢谢。
我如何将只有一个通道的图像(比如它是灰度图像,只有一个通道,甚至只有一个二维数组-矩阵)转换为具有 3 个通道(或 RGB 或 3D 数组-张量,始终 3 个通道)的图像?有没有相关的参考资料或教程?
我提出这个问题是为了能够应用需要图像或 3D 数组-张量(始终为 3 个通道)的 Keras 应用程序。
您可以将一个通道复制到每个颜色通道。
好的。谢谢,我就是这么做的。
但由于 Keras 图像函数,我以为会有更优雅、快速和高效的方法来实现!
也许有,我不记得了,抱歉。
先生,在图像处理过程中如何加载“.zip”文件格式?
解压缩,然后加载图像。
你好,是否可以使用 img_to_array 函数为多张图像生成一个数组?
我不认为可以,也许你可以试一试。
如何将整个图像数据集(即所有图像)一起转换为 CNN?
如果你没有很多图片,你可以将它们全部加载到内存中进行准备,然后保存结果。
如果你有很多图片,你可以即时准备它们。
https://machinelearning.org.cn/how-to-load-large-datasets-from-directories-for-deep-learning-with-keras/
嗨,Jason,
如何使用 Keras API 增强图像(模糊图像)?
也许你可以将这个问题建模为一个使用 pix2pix GAN 的图像翻译问题?
不确定,我是 Python 新手。我将对此进行探索。顺便问一下,您能给我提供任何关于图像超分辨率的参考资料吗?
手头没有,抱歉。
我正在尝试实现 cycle-gangs,但我无法理解数据集的结构。
根据文章,数据集要加载为 2 个 NumPy 数组。在迭代了 2 个训练集之后,我创建了 2 个 NumPy 数组并将它们作为数据集传递。但是后来我卡在了 randint 函数上,因为它接受 2 个参数,但您给了它 3 个参数,所以我删除了其中一个,但现在我卡住了。
您指的是哪个代码?我在这里没看到 randint。