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()
效果:
-
关于pyplot用法后续会继续详写