【OpenCV 例程300篇】11. 图像通道的拆分(cv2.split)

本文详细介绍了如何使用OpenCV的cv2.split()函数拆分BGR彩色图像的B、G、R通道,并通过示例展示了如何将单通道图像扩展为三通道以正确显示颜色。此外,还提到了使用NumPy切片实现通道拆分的简便方法,这种方法运行速度更快。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录:『youcans 的 OpenCV 例程300篇 - 总目录』


【OpenCV 例程300篇】11. 图像通道的拆分(cv2.split)


函数 cv2.split() 将 3 通道 BGR 彩色图像分离为 B、G、R 单通道图像。

函数说明:

cv2.split(img[, mv]) -> retval # 图像拆分为 BGR 通道

  • 函数 cv2.split() 传入一个图像数组,并将图像拆分为 B/G/R 三个通道。

参数说明:

  • img:图像数据,nparray 多维数组
  • mv:指定的分拆通道(可选)

注意事项:

  1. 对于 openCV 使用的 BGR 格式图像,返回的分拆通道的次序为 B、G、R 通道。
  2. BGR 彩色图像的数据形状为 (width, height, channels=3),返回的 B/G/R 通道的数据形状为 (width, height),不能按照 BGR 彩色图像直接显示。
  3. 如果直接用 imshow 显示返回的单通道对象,将被视为 (width, height) 形状的灰度图像显示。
  4. 如果要正确显示某一颜色分量,需要增加另外两个通道值(置 0)转换为 BGR 三通道格式,再用 imshow 才能显示为拆分通道的颜色。
  5. cv2.split() 操作复杂耗时,可以直接使用 NumPy 切片得到分离通道。

基本例程:

    # 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)

运行结果表明:

  1. 彩色图像 img1 的形状为 (512, 512, 3),拆分的 R 通道 rImg 的形状为 (512, 512)。
  2. 用 imshow 显示 rImg,将被视为 (512, 512) 形状的灰度图像显示,不能显示为红色通道。
  3. 对 rImg 增加 B、G 两个通道值(置 0)转换为 BGR格式,再用 imshow 才能显示红色通道的颜色。

在这里插入图片描述

扩展例程:
使用 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 通道的图像):

在这里插入图片描述


(本节完)


【第1章:图像的基本操作】
07. 图像的创建(np.zeros)
08. 图像的复制(np.copy)
10. 图像的拼接(np.hstack)
11. 图像通道的拆分(cv2.split)
12. 图像通道的合并(cv2.merge)

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125112487)
Copyright 2022 youcans, XUPT
Crated:2021-11-18
欢迎关注专栏: 『youcans 的 OpenCV 例程 300 篇』

### 关于 OpenCV 的示例代码及教程 #### 使用 OpenCV 进行图像读取和显示 OpenCV 是一种强大的计算机视觉库,广泛应用于图像处理和机器学习领域。通过其提供的函数可以从文件中加载图像并进行各种操作[^1]。下面是一个简单的 C++ 示例程序 `DisplayImage.cpp`,用于从命令行参数指定的路径加载图像,并将其显示在一个窗口中: ```cpp #include <stdio.h> #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char** argv) { if (argc != 2) { printf("Usage: DisplayImage.out <Image_Path>\n"); return -1; } Mat image; image = imread(argv[1], IMREAD_COLOR); if (!image.data) { printf("No image data\n"); return -1; } namedWindow("Display Image", WINDOW_AUTOSIZE); imshow("Display Image", image); waitKey(0); return 0; } ``` 此代码片段展示了如何使用 OpenCV 加载图像以及创建一个窗口来显示它[^2]。 --- #### Python 中的基础图像处理 除了 C++ 外,Python 也是 OpenCV 应用的主要编程语言之一。以下是一段基础的 Python 代码,演示了如何读取、显示图像,将其转换为灰度图,并检测其中的边缘[^3]: ```python import cv2 # 读取彩色图像 image = cv2.imread('image.jpg') if image is None: print("Error loading image!") else: # 显示原始图像 cv2.imshow('Original Image', image) cv2.waitKey(0) # 转换为灰度图像 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) cv2.imwrite('gray_image.jpg', gray_image) cv2.imshow('Gray Image', gray_image) cv2.waitKey(0) # 边缘检测 edges = cv2.Canny(gray_image, threshold1=100, threshold2=200) cv2.imshow('Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码实现了多个功能模块,包括图像加载、颜色空间转换、保存新图像以及基于 Canny 算法的边缘检测。 --- #### 更多资源推荐 对于希望深入研究 OpenCV 的开发者来说,可以参考官方文档和其他高质量的学习资料。以下是几个重要的方向: - **官方文档**: 提供详尽的功能描述和技术细节[^1]。 - **在线课程平台**: 如 Coursera 和 Udemy 上有许多专注于 OpenCV 的课程。 - **书籍**: 推荐《Learning OpenCV》系列图书作为理论与实践相结合的良好起点。 如果需要进一步扩展技能范围,则可探索高级主题如深度学习集成、实时视频流分析等。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youcans_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值