1. 知识点
- BGR/HSV 彩色通道分离为单独通道;
- 针对不同通道使用不同阀值提取mask;
- 学会使用【通道分离】函数 cv.split;
- 学会使用【通道合并】函数 cv.merge;
- 学会使用【把输入的矩阵(或矩阵数组)的某些通道拆分复制给对应的输出矩阵(或矩阵数组)的某些通道(通道复制)】函数 cv.mixChannels;
- 学会使用【通道阀值】函数 cv.inRange。
2. cv.split() 函数解释
2.1 函数使用
cv.split(src, mvbegin)
2.2 参数说明
参数 |
说明 |
src |
表示需要进行分离的多通道数组。 |
lut |
表示输出数组或者输出的vector容器。 |
OpenCV的BGR色彩空间(Blue、Green、Red,蓝、绿、红),其中0表示引用取出的是蓝色分量,1表示引用取出的是绿色分量,2表示引用取出的是红色分量。
3. cv.merge() 函数解释
3.1 函数使用
cv.merge(mv [, dst])
3.2 参数说明
参数 |
说明 |
mv |
表示需要 被合并的输入矩阵或vector容器的阵列, 这个mv参数中所有的矩阵必须有着一样的尺寸和深度。 |
dst |
表示输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。 |
4. cv.mixChannels() 函数解释
4.1 函数使用
cv.mixChannels(src, dst, fromTo)
4.2 参数说明
参数 |
说明 |
src |
表示输入数组或向量矩阵,所有矩阵的大小和深度必须相同。 |
dst |
表示输出数组或矩阵向量,大小和深度必须与src[0]相同。 |
fromTo |
表示指定被复制通道与要复制到的位置组成的索引对。 |
5. cv.inRange() 函数解释
5.1 函数使用
cv.inRange(src, lowerb, upperb [, dst])
5.2 参数说明
参数 |
说明 |
src |
表示输入图像。 |
lowerb |
表示最低值。 |
upperb |
表示最高值。 |
dst |
表示输出图像。 |
cv.inRange()函数的作用是可以提取你想要的颜色,并把该颜色的区域设置为白色,其余的设置为黑色。
6. 通道分离 BGR 单独通道图像的显示
6.1 实例代码
import cv2 as cv
def split_demo():
img = cv.imread('./images/butterfly.jpg')
cv.imshow('butterfly', img)
b,g,r = cv.split(img)
cv.imshow('butterfly_b', b)
cv.imshow('butterfly_g', g)
cv.imshow('butterfly_r', r)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
split_demo()
6.2 DEMO运行结果
6.3 注意
- 对于 openCV 使用的 BGR 格式图像,返回的分拆通道的次序为 B、G、R 通道。
- BGR 彩色图像的数据形状为 (width, height, channels=3),返回的 B/G/R 通道的数据形状为 (width, height),不能按照 BGR 彩色图像直接显示。
- 如果直接用 imshow 显示返回的单通道对象,将被视为 (width, height) 形状的灰度图像显示。
- 如果要正确显示某一颜色分量,需要增加另外两个通道值(置 0)转换为 BGR 三通道格式,再用 imshow 才能显示为拆分通道的颜色。
- cv2.split() 操作复杂耗时,可以直接使用 NumPy 切片得到分离通道。
6.4 根据注意4 分离后显示彩色
import cv2 as cv
import numpy as np
def split_demo():
img = cv.imread('./images/butterfly.jpg')
cv.imshow('butterfly', img)
b,g,r = cv.split(img)
like_img_b = np.zeros_like(img)
like_img_b[:,:,0] = b
like_img_g = np.zeros_like(img)
like_img_g[:,:,1] = g
like_img_r = np.zeros_like(img)
like_img_r[:,:,2] = r
cv.imshow('butterfly_b', like_img_b)
cv.imshow('butterfly_g', like_img_g)
cv.imshow('butterfly_r', like_img_r)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
split_demo()
6.5 DEMO 运行结果
7. 通道分离 HSV 单独通道图像显示
7.1 代码实例
import cv2 as cv
def split_demo():
img = cv.imread('./images/butterfly.jpg')
cv.imshow('butterfly', img)
dst = cv.cvtColor(img, cv.COLOR_BGR2HSV)
cv.imshow('butterfly_hsv', dst)
b,g,r = cv.split(dst)
cv.imshow('butterfly_b', b)
cv.imshow('butterfly_g', g)
cv.imshow('butterfly_r', r)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
split_demo()
7.2 DEMO运行结果
8. 通道合并
8.1 代码实例
import cv2 as cv
def merge_demo():
img = cv.imread('./images/butterfly.jpg')
# cv.imshow('butterfly', img)
b,g,r = cv.split(img)
# cv.imshow('butterfly_b', b)
# cv.imshow('butterfly_g', g)
# cv.imshow('butterfly_r', r)
dst = cv.merge([b,g,r])
cv.imshow('butterfly_merge_bgr', dst)
rgb = cv.merge([r,g,b])
cv.imshow('butterfly_merge_rgb', rgb)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
merge_demo()
8.2 DEMO 运行结果
9. 通道复制
9.1 实例代码
import cv2 as cv
import numpy as np
def mixchannels_demo():
img = cv.imread('./images/butterfly.jpg')
cv.imshow('butterfly', img)
# 复制一个图像矩阵
dst = np.zeros_like(img)
# 复制图像通道
cv.mixChannels([img], [dst], fromTo=[0,1,2,2,1,0])
cv.imshow('butterfly_mixChannels', dst)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
mixchannels_demo()
9.2 DEMO 运行结果
10. 通道阀值
10.1 实例代码
import cv2 as cv
import numpy as np
def inrange_demo():
img = cv.imread('./images/butterfly.jpg')
cv.imshow('butterfly', img)
# 转换为hsv图片
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
# 设置最大值和最小值
lower = np.array((0.,0.,0.))
upper = np.array((180.,255.,46.))
mask = cv.inRange(hsv, lower, upper)
cv.imshow('butterfly_mask', mask)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == "__main__":
inrange_demo()
10.2 DEMO 运行结果
10.3 OPENCV中的HSV颜色体系
使用OPENCV中 cv.cvtColor 函数,并设置参数为 cv.COLOR_BGR2HSV ,那么所得的H、S、V值范围分别是[0,180),[0,255),[0,255),因此可以查下面的表格来确定颜色的大致区间。
11. 总结
- 对于 openCV 使用的 BGR 格式图像,返回的分拆通道的次序为 B、G、R 通道。
- BGR 彩色图像的数据形状为 (width, height, channels=3),返回的 B/G/R 通道的数据形状为 (width, height),不能按照 BGR 彩色图像直接显示。
- 如果直接用 imshow 显示返回的单通道对象,将被视为 (width, height) 形状的灰度图像显示。
- 如果要正确显示某一颜色分量,需要增加另外两个通道值(置 0)转换为 BGR 三通道格式,再用 imshow 才能显示为拆分通道的颜色。
- cv2.split() 操作复杂耗时,可以直接使用 NumPy 切片得到分离通道。
- 进行合并的 B、G、R 单通道图像分量,数据形状必须为 (width, height),而不是形状为 (width, height, channels=3) 的蓝色/绿色/红色图像。
- 单通道图像分量的图像大小 (width, height) 必须相同才能进行合并。
- 颜色通道要按照 B、G、R 通道顺序合并,才能得到 BGR 格式的合并结果。
- cv2.merge() 操作复杂耗时,推荐使用 NumPy 数组合并函数 np.stack() 生成合成图像。
10.OPENCV中 H、S、V 值范围分别是[0,180),[0,255),[0,255)。