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图像类型。同时,本文还分别介绍了三种库中图像的表示方式、像素值范围和类型等相关问题。通过本文的学习,读者将能够更加灵活地使用三种库中的图像处理方法,实现更多的机器学习应用。
极客笔记