函数 cv2.split() 将 3 通道 BGR 彩色图像分离为 B、G、R 单通道图像。
函数说明:
cv2.split(img[, mv]) -> retval # 图像拆分为 BGR 通道
参数说明:
注意事项:
基本例程:
# 1.19 图像拆分通道
img1 = cv2.imread("../images/imgB1.jpg", flags=1) # flags=1 读取彩色图像(BGR)
cv2.imshow("BGR", img1) # BGR 图像
# BGR 通道拆分
bImg, gImg, rImg = cv2.split(img1) # 拆分为 BGR 独立通道
cv2.imshow("rImg", rImg) # 直接显示红色分量 rImg 显示为灰度图像
# 将单通道扩展为三通道
imgZeros = np.zeros_like(img1) # 创建与 img1 相同形状的黑色图像
imgZeros[:,:,2] = rImg # 在黑色图像模板添加红色分量 rImg
cv2.imshow("channel R", imgZeros) # 扩展为 BGR 通道
print(img1.shape, rImg.shape, imgZeros.shape)
cv2.waitKey(0)
cv2.destroyAllWindows() # 释放所有窗口
本例程的运行结果如下:
(512, 512, 3) (512, 512) (512, 512, 3)
运行结果表明:
扩展例程:
使用 NumPy 切片得到分离通道更为简便,而且运行速度比 cv2.split 更快。
# 1.20 图像拆分通道 (Numpy切片)
img1 = cv2.imread("../images/imgB1.jpg", flags=1) # flags=1 读取彩色图像(BGR)
# 获取 B 通道
bImg = img1.copy() # 获取 BGR
bImg[:, :, 1] = 0 # G=0
bImg[:, :, 2] = 0 # R=0
# 获取 G 通道
gImg = img1.copy() # 获取 BGR
gImg[:, :, 0] = 0 # B=0
gImg[:, :, 2] = 0 # R=0
# 获取 R 通道
rImg = img1.copy() # 获取 BGR
rImg[:, :, 0] = 0 # B=0
rImg[:, :, 1] = 0 # G=0
# 消除 B 通道
grImg = img1.copy() # 获取 BGR
grImg[:, :, 0] = 0 # B=0
plt.subplot(221), plt.title("1. B channel"), plt.axis('off')
bImg = cv2.cvtColor(bImg, cv2.COLOR_BGR2RGB) # 图片格式转换:BGR(OpenCV) -> RGB(PyQt5)
plt.imshow(bImg) # matplotlib 显示 channel B
plt.subplot(222), plt.title("2. G channel"), plt.axis('off')
gImg = cv2.cvtColor(gImg, cv2.COLOR_BGR2RGB)
plt.imshow(gImg) # matplotlib 显示 channel G
plt.subplot(223), plt.title("3. R channel"), plt.axis('off')
rImg = cv2.cvtColor(rImg, cv2.COLOR_BGR2RGB)
plt.imshow(rImg) # matplotlib 显示 channel R
plt.subplot(224), plt.title("4. GR channel"), plt.axis('off')
grImg = cv2.cvtColor(grImg, cv2.COLOR_BGR2RGB)
plt.imshow(grImg) # matplotlib 显示 channel GR
plt.show()
本例程的运行结果如下,GR channel 是消除 B通道(保留 G/R 通道的图像):