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

文章目录:『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 切片得到分离通道。

基本例程:


    img1 = cv2.imread("../images/imgB1.jpg", flags=1)
    cv2.imshow("BGR", img1)

    bImg, gImg, rImg = cv2.split(img1)
    cv2.imshow("rImg", rImg)

    imgZeros = np.zeros_like(img1)
    imgZeros[:,:,2] = rImg
    cv2.imshow("channel R", imgZeros)

    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 才能显示红色通道的颜色。

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

扩展例程:
使用 NumPy 切片得到分离通道更为简便,而且运行速度比 cv2.split 更快。


    img1 = cv2.imread("../images/imgB1.jpg", flags=1)

    bImg = img1.copy()
    bImg[:, :, 1] = 0
    bImg[:, :, 2] = 0

    gImg = img1.copy()
    gImg[:, :, 0] = 0
    gImg[:, :, 2] = 0

    rImg = img1.copy()
    rImg[:, :, 0] = 0
    rImg[:, :, 1] = 0

    grImg = img1.copy()
    grImg[:, :, 0] = 0

    plt.subplot(221), plt.title("1. B channel"), plt.axis('off')
    bImg = cv2.cvtColor(bImg, cv2.COLOR_BGR2RGB)
    plt.imshow(bImg)
    plt.subplot(222), plt.title("2. G channel"), plt.axis('off')
    gImg = cv2.cvtColor(gImg, cv2.COLOR_BGR2RGB)
    plt.imshow(gImg)
    plt.subplot(223), plt.title("3. R channel"), plt.axis('off')
    rImg = cv2.cvtColor(rImg, cv2.COLOR_BGR2RGB)
    plt.imshow(rImg)
    plt.subplot(224), plt.title("4. GR channel"), plt.axis('off')
    grImg = cv2.cvtColor(grImg, cv2.COLOR_BGR2RGB)
    plt.imshow(grImg)
    plt.show()

本例程的运行结果如下,GR channel 是消除 B通道(保留 G/R 通道的图像):

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

(本节完)

【第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 篇』

Original: https://blog.csdn.net/youcans/article/details/121174708
Author: YouCans
Title: 【OpenCV 例程300篇】11. 图像通道的拆分(cv2.split)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/636880/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球