本文分别介绍了使用 OpenCV 和 Matplotlib 进行图像读取与显示的方法,如 cv2.imread ()、cv2.imshow ()、plt.imread ()、plt.imshow () 等,并提及了使用 OpenCV 时的注意事项。
cv2.imread()
函数读取图像,默认读取的图像格式是BGR(蓝绿红)。plt.imread()
函数读取图像,默认读取的图像格式是RGB(红绿蓝)。cv2.imshow()
函数显示图像,窗口会自动调整大小以适应图像。plt.imshow()
函数显示图像,可以通过设置figsize
参数来调整图像的大小。由于OpenCV默认读取的图像格式是BGR,因此如果想要使用matplotlib来正常显示原来的图片需要对图片的格式进行转换(因为matplotlib默认为RGB格式),使用cv2.cvtColor()函数将其转换为RGB格式,这部分的差异在下文会再次提到并且进行对比。
cv2.imread()是 OpenCV 库中用于读取图像文件的函数。它可以将多种格式的图像文件(如 JPEG、PNG、BMP 等)读取到内存中,以numpy.ndarray(多维数组)的形式存储图像数据,方便后续的图像处理操作。基本语法为:
cv2.imread(filename, flags = cv2.IMREAD_COLOR)
C:/Users/Username/Pictures/image.jpg
,也可以是相对路径,例如./data/image.png
,其中./
表示当前目录。cv2.IMREAD_COLOR
(默认值):以彩色模式读取图像。在这种模式下,对于彩色图像,它会忽略图像的透明度通道(如果有的话),将图像读取为 BGR(蓝 - 绿 - 红)格式的彩色图像。例如,一张 RGB 格式的图像,使用这个模式读取后会转换为 BGR 格式,存储在numpy.ndarray
中。cv2.IMREAD_GRAYSCALE
:以灰度模式读取图像。无论原始图像是彩色还是灰度,读取后的图像都将是单通道的灰度图像,每个像素点的值表示该点的灰度强度,范围一般是 0 - 255。cv2.IMREAD_UNCHANGED
:按原始图像的格式读取,包括图像的颜色模式和透明度通道(如果有的话)。如果原始图像是彩色且有透明度通道(如 PNG 图像),读取后的numpy.ndarray
会有相应的通道来存储透明度信息。cv2.imshow()是 OpenCV库中的一个函数,用于在窗口中显示图像。函数的基本语法如下:
cv2.imshow(window_name, image)
window_name
:这是一个字符串,表示要显示图像的窗口的名称。这个名称是自定义的,例如可以设置为 "My Image"
、 "Display Window"
等。.jpg
、.png
等格式),其数据类型一般numpy.ndarray。具体的操作见下面的代码,代码中有较为详细的注释。
# 导入模块
import cv2
from matplotlib import pyplot as plt
image_bgr = cv2.imread("./luffy.jpeg", flags=-1) #读取图像
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB) # 转换为RGB格式
# 创建一个窗口并显示BGR图像
cv2.imshow('BGR Image', image_bgr)
# 创建一个窗口并显示RGB图像
cv2.imshow('RGB Image', image_rgb)
# 等待键盘输入并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
使用cv2.imshow()图像的显示结果如下(第一张为RGB显示图像,第二张为BGR显示图像):
大家可以自行对比一下。
以下将Matplotlib简称为plt
plt.imread()属于matplotlib库。它主要的功能是读取图像文件,将图像数据加载到内存中,以便后续使用matplotlib库进行图像的展示、处理等操作。基本语法为:
image_array = plt.imread(fname, format=None)
cv2.imread
中的文件名参数类似,它可以是绝对路径或者相对路径。例如,绝对路径/home/user/images/picture.jpg
或者相对路径../data/image.png
(..
表示上级目录)。matplotlib
会根据文件扩展名自动尝试识别图像格式。它可以是如'jpg'
、'png'
、'gif'
等常见的图像格式名称。不过在实际应用中,一般很少手动指定这个参数,因为matplotlib
的自动识别功能已经很强大。plt.imread
读取的彩色图像通常是 RGB 格式,而cv2.imread
默认读取的彩色图像是 BGR 格式。这在将图像数据用于不同的图像处理算法或者库时需要注意,如果要在两个库之间传递彩色图像数据,可能需要进行格式转换。cv2.imread
主要用于为 OpenCV 库中的图像处理操作提供图像数据,OpenCV 侧重于计算机视觉相关的功能,如目标检测、图像滤波等。而plt.imread
主要是为matplotlib
库中的图像展示和简单的图形处理提供数据,matplotlib
更侧重于数据可视化和简单的绘图操作。plt.imshow()是matplotlib库中的一个函数,主要用于显示图像。它可以将各种类型的图像数据(如二维数组表示的灰度图像、三维数组表示的彩色图像等)以可视化的方式展示在图形界面或者输出设备(如 Jupyter Notebook 等)上。基本语法为:
plt.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, data=None, **kwargs)
在常见的使用场景中,只需要使用前面几个参数
numpy.ndarray
类型。对于灰度图像,是一个二维数组;对于彩色图像,是一个三维数组(例如 RGB 图像的形状通常是 (height, width, 3))。'gray'
,它会将像素值从黑到白进行映射。对于一些特殊的数据可视化,如热度图,可以使用'hot'
颜色映射来显示数据的热度分布等。aspect='auto'
会自动调整图像的纵横比,使图像能够完整地显示在给定的绘图区域内;aspect='equal'
则会保持图像的原始纵横比。示例代码:
# 导入模块
from matplotlib import pyplot as plt
# 读取图像
image_rgb = plt.imread("./luffy.jpeg")
print(image_rgb.shape) # 高度,宽度,通道数
print(image_rgb.size) # 高度 x 宽度 x 通道数
print(image_rgb.dtype) # 数据类型
plt.imshow(image_rgb)
plt.show()
图像结果如下:
Over !!散会!