python-opencv 图像通道分离,合并,边界扩展(cv2.split() \\cv2.merge()\\cv2.copyMakeBorder())

本文详细介绍如何使用OpenCV进行图像通道的拆分与合并,以及如何通过不同类型的边界扩充来处理图像边缘,包括复制、反射、环绕和常数填充等方法。

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

通道拆分和合并,扩充边界

通道拆分

  • [b, g, r] = cv2.split(image)

通道合并

  • img = cv2.merge([r, b , g])

  • 合并的顺序可以自由修改

通道拆分和合并是耗时的,多数情况可以直接使用numpy索引比较好

img2 = img[ :, :, 0] #0表示blue通道,1表示green,2表示red

扩充边界

  • 在图像处理的时候,有时我们需要在图像边缘填充一圈像素,类似于加一个相框,以便后续运算处理需要,比如做卷积运算时。

  • 使用cv2.copyMakeBorder()函数,函数需要的参数有以下这些:

    • src 源图像

    • top ,bottom,left,right 对应的扩展像素数目

    • borderType 需要填充的边界类型

      边界类型含义
      cv2.BORDER_CONSTANT添加有颜色的常数形型边界,需要额外下一个参数即颜色值
      cv2.BORDER_REFLECT边界元素的镜像,例如:fedcba|abcdefgh|hgfedcba
      cv2.BORDER_REFLECT_101 或者cv2.BORDER_DEFAULT和上面一样,稍有变动:gfedcb|abcdefgh|gfedcba 就是忽略边界的第一个元素
      cv2.BORDER_REPLICATE重复最后一个元素,例如:aaaaa|abdefg|ggggggg
      cv2.BORDER_WRAP取镜像,但是上下作用填充区域相反,例如:cdefgh|abcdefgh|abcdefg
  • 下面看一些示例就很容易明白了

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    
    img = cv2.imread('/home/lu/Downloads/debian.jpg')
    [b, g, r] = cv2.split(img)  # 后面用matplotlib画图,采用rgb排列
    img = cv2.merge([r, g, b])
    
    replicate = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_REPLICATE)
    reflect = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_REFLECT)
    reflect101 = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_REFLECT101)
    wrap = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_WRAP)
    # 使用constant类型时不要忘了添加颜色值
    constant = cv2.copyMakeBorder(
        img, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value=[255, 0, 0])
    
    plt.subplot(231), plt.imshow(img, 'gray'), plt.title('original')
    plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('replicate')
    plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('reflect')
    plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('reflect101')
    plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('wrap')
    plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('constant')
    plt.show()
    
    

    效果:在这里插入图片描述

  • 关于pyplot用法后续会继续详写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值