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

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

通道拆分

  • [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()
    
    

    效果:python-opencv 图像通道分离,合并,边界扩展(cv2.split() \\cv2.merge()\\cv2.copyMakeBorder())_第1张图片

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

你可能感兴趣的:(python-opencv,python,cv2.split(),cv2.merge(),opencv)