Abotw's Space

Back

在 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 。
  • 00 代表最暗(黑色),255255 代表最亮(白色)。

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×640480 \times 640 的彩色图,形状为 (480, 640, 3)
灰度图像2 维(高度, 宽度)只有 1 个通道(亮度)。例如:一张 480×640480 \times 640 的灰度图,形状为 (480, 640)
读取失败NoneN/A如果文件不存在或路径错误,cv2.imread() 返回 None

备注: 图像的高度(行数)总是排在 宽度(列数)之前,这符合 NumPy 数组的索引习惯。

3. 图像操作的关键属性#

作为 NumPy 数组,图像对象继承了所有强大的 Ndarray 属性,这些属性在处理图像时非常实用:

NumPy 属性描述示例代码
.shape数组的维度,确定图像的尺寸和通道数。img.shape \rightarrow (H, W, C)
.dtype数组元素的数据类型,通常是 uint8img.dtype \rightarrow dtype('uint8')
.size数组中元素的总数(总像素数 ×\times 通道数)。img.size
.ndim数组的维数(2 或 3)。img.ndim
.itemsize单个元素占用的字节数(uint8 为 1 字节)。img.itemsize \rightarrow 1

在彩色图像中,可以使用标准的 NumPy 索引来访问或修改特定位置的像素值。

# 假设 img 是一个彩色图像 (H, W, 3)
# 访问第 50 行,第 100 列的像素
pixel = img[50, 100] 
print(f"像素值 (BGR): {pixel}") 
# 举例来说:[255 128 50] -> B=255, G=128, R=50
python
cv2.imread() 返回的 Ndarray
https://abotw.github.io/blog/cv2-imread
Author Abotw
Published at December 6, 2025
Comment seems to stuck. Try to refresh?✨