Numpy 使用Numpy和OpenCV读取图像,并将它们转换为Keras图像类型

Numpy 使用Numpy和OpenCV读取图像,并将它们转换为Keras图像类型

简介

Numpy,OpenCV和Keras是机器学习中常用的Python库,而使用这些工具时,经常需要使用图像和数组。其中,Numpy和OpenCV被广泛运用于数组和图像处理,而Keras则被广泛运用于深度学习。在使用这些库时会遇到多种数据类型,尤其是在读取和处理图像时。因此,本文将带领读者学习如何使用Numpy中的图像数组,将OpenCV和Keras的图像读取进行匹配。

阅读更多:Numpy 教程

读取图片

在处理图像前,我们需要将图像读取到内存。在Numpy中,我们可以使用imread()方法将图片读取为Numpy数组。

import numpy as np
from PIL import Image

img = Image.open("test.jpg")
arr = np.array(img)

以上代码中,我们先使用PIL库中的Image.open()方法读取图像为PIL对象,再将其转换为Numpy数组。在图像读取完成后,imread()方法返回一个数组,数组的维数为(H,W,C)。

Numpy数组的表示方式

在深度学习中,常用的表示方式为(H,W,C),其中,H表示高度,W表示宽度,C表示通道数。通常,我们使用以下命令检查数组的维数:

print(arr.shape)

但在使用OpenCV时,数组的表示方式与Numpy略有不同。在OpenCV中,数组的表示方式为(H,W,C),其中,H表示高度,W表示宽度,C表示通道,也就是RGB通道。

OpenCV中读取图像

在OpenCV中,我们可以使用imread()方法来读取图像为OpenCV数组。

import cv2

img = cv2.imread("test.jpg")
print(img.shape)

以上代码中,我们使用了OpenCV库中的imread()方法。在读取图像之后,我们可以使用shape属性获取图像的维度信息。此时,维度的量级逐渐变化,从(高度,宽度,通道数)到(行数,列数,通道数),所以在后续代码编写中要格外留意维度信息的变化。

将OpenCV数组转换为Numpy数组

在将OpenCV中读取的图像数组转换为Numpy数组时,我们需要使用cv2.cvtColor()方法将图像从BGR格式转换为RGB格式:

import cv2
import numpy as np

img = cv2.imread("test.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
arr = np.array(img)

在以上代码中,我们在读取图像后,使用了cv2.cvtColor()方法将BGR格式的数组转换到RGB格式。接着,我们将得到的RGB格式数组转换为Numpy类型的数组。

将Keras读取的图像视为Numpy数组

在使用Keras时,我们可以通过image.img_to_array()方法将图像读取为Numpy数组:

from keras.preprocessing import image

img = image.load_img("test.jpg", target_size=(224, 224))
arr = image.img_to_array(img)

需要注意的是,这里读取出来的图像的大小并不是原图大小,而是经过target_size参数处理之后的大小。在本例中,我们将大小设置为了(224,224)。通过这种方式,Keras读取的图像能够轻松地转换为Numpy数组。

像素值范围和类型

在图像处理过程中,我们需要关注像素值范围和类型。在Numpy中,数组元素的类型可以通过dtype属性获取,而像素值范围的最大和最小值可以通过max()min()方法获取。在OpenCV中,数据类型和像素值范围会根据读取的图像类型不同而有所不同。

在本例中,我们可以使用以下代码获取像素值范围和类型:

import cv2
import numpy as np

img = cv2.imread("test.jpg")
print("OpenCV读取的图像类型为:", type(img))
print("OpenCV读取的图像类型为:", img.dtype)
print("OpenCV读取的图像像素值范围为:", img.min(), "至", img.max())

img_np = np.array(img)
print("Numpy数组类型为:", img_np.dtype)
print("Numpy数组像素值范围为:", img_np.min(), "至", img_np.max())

从结果可以看到,OpenCV中读取的图像类型为uint8,像素值范围为0到255。而在将OpenCV中读取的图像转换为Numpy数组后,Numpy数组类型和像素值范围与OpenCV的数组一致。

实例演练

在下面的实例中,我们将分别使用Numpy和OpenCV读取同一张图像,并将它们转换为Keras的图像类型,以展示如何将三种库的图像处理方法进行合并。

首先,我们使用Numpy和OpenCV分别读取图像,并将其转换为Keras图像类型。

import numpy as np
import cv2
from keras.preprocessing import image

# Numpy读取图像,转换为Keras图像类型
img_np = np.array(Image.open("test.jpg"))
img_np_keras = image.array_to_img(img_np)

# OpenCV读取图像,转换为Keras图像类型
img_cv = cv2.imread("test.jpg")
img_cv_keras = image.array_to_img(cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB))

在以上代码中,我们分别使用Numpy和OpenCV读取图像,并将它们转换为Keras图像类型。在将OpenCV读取的图像颜色空间转换为RGB时,我们使用了cv2.cvtColor()方法。

接下来,我们将Numpy和OpenCV读取的图像进行对比:

import matplotlib.pyplot as plt

plt.subplot(1, 2, 1)
plt.imshow(img_np_keras)
plt.title("Numpy读取的图像")

plt.subplot(1, 2, 2)
plt.imshow(img_cv_keras)
plt.title("OpenCV读取的图像")

plt.show()

在显示图像时,我们使用了Matplotlib库。

可以看出,对于BGR颜色空间,使用OpenCV读取的图像和Numpy读取的图像存在视觉上的区别,而在RGB颜色空间下它们基本相同。此外,在使用Numpy读取图像时,我们能够看到更多的细节。

总结

本文介绍了如何使用Numpy和OpenCV读取图像,并将它们转换为Keras图像类型。同时,本文还分别介绍了三种库中图像的表示方式、像素值范围和类型等相关问题。通过本文的学习,读者将能够更加灵活地使用三种库中的图像处理方法,实现更多的机器学习应用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程