通道拆分
[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用法后续会继续详写