在使用 OpenCV 的 cv2.imread() 函数读取图像时,第二个参数(标志)决定了图像的读取方式。具体来说,0、1 和 -1 分别对应不同的读取模式:
读取模式 | 标志 | 值 |
---|---|---|
灰度 | cv2.IMREAD_GRAYSCALE | 0 |
彩色(忽略透明度通道) | cv2.IMREAD_COLOR | 1 |
彩色(包括 Alpha 透明度通道,如果存在) | cv2.IMREAD_UNCHANGED | -1 |
这里不讨论处理包含透明度通道的图像
使用 img.shape 判断图像类型
在 OpenCV 中,当你使用 cv2.imread() 函数读取一张图像时,它会将图像加载到内存中,并将其存储为一个 NumPy 数组。img.shape 是 NumPy 数组的一个属性,它返回一个包含数组各维度大小的元组。通过检查这个元组的长度(即维度的数量),我们可以确定数组的类型或结构。
1 2 3 4 5 |
# img 是一个 NumPy 数组 if len(img.shape) == 2: print("这是一个灰度图像") elif len(img.shape) == 3: print("这是一个彩色图像") |
1 |
plt.imshow(img, cmap='gray') |
理解cmap='gray'
直接imshow 会使用默认的颜色映射(通常是 viridis),这通常不是期望的灰度效果。需要明确指定颜色映射 (cmap) 为 'gray',这样可以确保图像中的每个像素值都被正确地映射到灰度级别。
OpenCV读取到的色彩通道顺序为BGR, Matplotlab读取显示的色彩通道为RGB,所以需要读取时转换通道
1 |
plt.imshow(img[:, :, ::-1]) |
理解 img[:, :, ::-1]
第一维和第二维分别代表图像的高度和宽度,第三维有三个通道:红(R)、绿(G)、蓝(B)