4 min read
cv2.imread() 返回的 Ndarray
总结一下 cv2.imread() 读取图像后返回的 NumPy 数组 (Ndarray) 的维度、通道顺序和数据类型。
views
| comments
在 Python 计算机视觉领域,OpenCV 是最常用的库。而一切图像处理工作,都始于 cv2.imread() 函数。理解读取图片后返回的数据结构很重要,因为这直接决定了我们如何访问、操作和修改图像的像素数据。
简单来说,cv2.imread() 读取的图像最终被表示为一个 NumPy 数组(numpy.ndarray)。
理解 cv2.imread() 返回的 NumPy 数组,特别是它的 BGR 通道顺序和 (高度, 宽度, 通道数) 的结构,是进行任何进一步图像处理(如颜色转换、滤波、特征提取)的基础。
1. 核心结构:NumPy Ndarray#
NumPy 数组是 Python 中用于科学计算的基础数据类型,具有多维和同质的特性。当 OpenCV 读取图像时,它将图像的像素信息和颜色深度全部映射到这个结构中。
1.1 数据类型 (.dtype)#
默认情况下,cv2.imread() 返回数组的元素类型是 uint8(无符号 8 位整数)。
- 这意味着每个颜色通道的强度值范围是 0 到 255 。
- 代表最暗(黑色), 代表最亮(白色)。
1.2 通道顺序(BGR vs. RGB)#
这是初学者最容易混淆的地方:OpenCV 读取彩色图像的通道顺序是 蓝色 (B)、绿色 (G)、红色 (R),即 BGR 格式,而不是通常在 Web 或 Matplotlib 中使用的 RGB 格式。
- 要将其正确显示在 Matplotlib 或进行其他 RGB 处理,需要使用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)进行转换。
2. 维度解析:.shape 属性#
cv2.imread() 返回的数组的维度(即 .shape 属性)取决于读取的是彩色图像还是灰度图像。
| 图像类型 | 维数 (.ndim) | 形状 (.shape) 结构 | 含义 |
|---|---|---|---|
| 彩色图像 | 3 维 | (高度, 宽度, 3) | 3 个通道(B、G、R)。例如:一张 的彩色图,形状为 (480, 640, 3)。 |
| 灰度图像 | 2 维 | (高度, 宽度) | 只有 1 个通道(亮度)。例如:一张 的灰度图,形状为 (480, 640)。 |
| 读取失败 | None | N/A | 如果文件不存在或路径错误,cv2.imread() 返回 None。 |
备注: 图像的高度(行数)总是排在 宽度(列数)之前,这符合 NumPy 数组的索引习惯。
3. 图像操作的关键属性#
作为 NumPy 数组,图像对象继承了所有强大的 Ndarray 属性,这些属性在处理图像时非常实用:
| NumPy 属性 | 描述 | 示例代码 |
|---|---|---|
.shape | 数组的维度,确定图像的尺寸和通道数。 | img.shape (H, W, C) |
.dtype | 数组元素的数据类型,通常是 uint8。 | img.dtype dtype('uint8') |
.size | 数组中元素的总数(总像素数 通道数)。 | img.size |
.ndim | 数组的维数(2 或 3)。 | img.ndim |
.itemsize | 单个元素占用的字节数(uint8 为 1 字节)。 | img.itemsize 1 |
在彩色图像中,可以使用标准的 NumPy 索引来访问或修改特定位置的像素值。
# 假设 img 是一个彩色图像 (H, W, 3)
# 访问第 50 行,第 100 列的像素
pixel = img[50, 100]
print(f"像素值 (BGR): {pixel}")
# 举例来说:[255 128 50] -> B=255, G=128, R=50python