1. 彩色图像的通道概念
在数字图像中,彩色图像通常使用 三通道 表示:
-
R(Red 红色通道):记录每个像素的红色强度。
-
G(Green 绿色通道):记录绿色强度。
-
B(Blue 蓝色通道):记录蓝色强度。
💡 在 OpenCV 中默认是 BGR 顺序:
-
OpenCV 读取的彩色图像是
(高度, 宽度, 3)
的 NumPy 数组,最后一个维度存储 B、G、R 三个通道的像素值。 -
每个通道是一个二维数组(灰度图),取值范围是 0~255(uint8 类型)。
-
例如:
img.shape # (480, 640, 3)
说明图片高 480 像素,宽 640 像素,有 3 个颜色通道。
2. 为什么要分离通道?
通道分离常用于:
-
颜色分析:单独观察红色、绿色、蓝色的分布情况。
-
特征提取:在计算机视觉中,可能只处理某一个颜色通道(例如检测红色物体时只用 R 通道)。
-
图像处理:对某个通道进行增强、滤波,再合并回去。
-
颜色操作:交换通道顺序、去掉某个通道等。
3. 常用函数
cv2.split(img)
-
作用:将三通道彩色图像分离成三个单通道图像。
-
返回值:B、G、R 三个灰度图。
-
注意:
cv2.split()
会复制数据,比直接切片略慢。 -
示例:
b, g, r = cv2.split(img)
cv2.merge([b, g, r])
-
作用:将单通道图像合并成多通道图像。
-
参数:通道顺序决定最终的颜色。
-
示例:
merged = cv2.merge([b, g, r])
💡 小技巧:可以用数组切片直接获取通道:
b = img[:, :, 0] # 蓝色通道
g = img[:, :, 1] # 绿色通道
r = img[:, :, 2] # 红色通道
这种方法速度更快,因为它不会复制数据。
4. 显示通道
-
直接显示通道:会看到灰度图,因为通道本质是强度值。
-
彩色显示通道:需要将其他两个通道置 0,然后合并成彩色图像,才能看到真实颜色的效果。
示例:
import numpy as np
zero = np.zeros_like(b)
blue_img = cv2.merge([b, zero, zero])
green_img = cv2.merge([zero, g, zero])
red_img = cv2.merge([zero, zero, r])
5. 可能的坑
-
颜色顺序错误:在 OpenCV 中是 BGR,如果按 RGB 合并会导致颜色失真。
-
数据类型:必须保持
uint8
,否则显示时可能出错。 -
通道尺寸不一致:合并前要确保三个通道的尺寸完全一致,否则会报错。
6. 练习任务
-
分离出三通道并分别显示(灰度模式)。
-
将蓝色通道置 0,重新合并,看看颜色变化。
-
交换通道顺序(如 R 和 B 对调),观察图像颜色变化。
-
对某个通道做增强(如增加亮度),再合并回去。