作用:
将彩色图像,分成b、g、r 3个单通道图像 。
方便我们对 BGR 三个通道分别进行操作。
参数:是需要分离通道的图像数组。
注意:
1 cv2.split() 是一个比较耗时的操作。只有真正需要时才用它,能用numpy的方式,修改多通道里的某个通道的值,就用numpy
2 3个单通道的图像shape,有什么变化??
相对于原图像的shape, 行列数不变,从3维变成了2维。
例如:
src = cv2.imread('c:/test/test.png')
b,g,r=cv2.split(src)
print(src)
cv2.imshow("b",b)
print("B通道图:\n",b.shape)
print(b)
cv2.imshow("g",g)
print("G通道图:\n",g.shape)
print(g)
cv2.imshow("r",r)
print("R通道图:\n",r.shape)
print(r)
k = cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[13 14 15]
[16 17 18]
[19 20 21]
[22 23 24]]
[[25 26 27]
[28 29 30]
[31 32 33]
[34 35 36]]]
B通道图:
(3, 4)
[[ 1 4 7 10]
[13 16 19 22]
[25 28 31 34]]
G通道图:
(3, 4)
[[ 2 5 8 11]
[14 17 20 23]
[26 29 32 35]]
R通道图:
(3, 4)
[[ 3 6 9 12]
[15 18 21 24]
[27 30 33 36]]
作用:
通道的合并
虽然 都是灰度图,shape也都是一样的。
但是 矩阵的元素值有所不同。
1 分离的G通道 ,等于 numpy索引的G通道 , 不等于 “颜色空间转化函数的灰度” 和 “imread函数转灰度”
2 “imread函数转灰度” 和 “颜色空间转化函数的灰度” 也不一样。
import numpy as np
import cv2
src = cv2.imread('imgs/xinyi.png')
b,g,r=cv2.split(src)
"""
彩色图片分离成3个通道
"""
cv2.imshow("b",b)
print("B通道图:\n",b.shape)
print(b)
cv2.imshow("g",g)
print("G通道图:\n",g.shape)
print(g)
cv2.imshow("r",r)
print("R通道图:\n",r.shape)
print(r)
"""
numpy索引G通道,转灰度
"""
src2 = src[:,:,1]
cv2.imshow("numpy",src2)
print("numpy索引G通道,转灰度:\n",src2)
"""
imread函数转灰度
"""
src3 = cv2.imread("imgs/xinyi.png",0)
cv2.imshow("imgread",src3)
print("imread函数转灰度:\n",src3)
"""
颜色空间转化函数
"""
src4 = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) # RGB转换为GRAY #这里的生成的gray图是单通道的
cv2.imshow("cvtColor", src4)
print("颜色空间转化函数:\n",src4)
print("G通道 是否等于 numpy索引的G通道:",np.all(g==src2) )
print("G通道 是否等于 imread函数转灰度",np.all(g==src3) )
print("G通道 是否等于 颜色空间转化函数",np.all(g==src4))
print("imread函数转灰度 是否等于 颜色空间转化函数 ",np.all(src3==src4))
k = cv2.waitKey(0)
# img22 = img[:,:,1]
# print("numny索引,实现 彩色图转为灰度图\n",img22)
# print("numpy索引 ,对比imread转为彩色图\n",img2==img22)
#
输出:
其他的太长了,省略
G通道 是否等于 numpy索引的G通道: True
G通道 是否等于 imread函数转灰度 False
G通道 是否等于 颜色空间转化函数 False
imread函数转灰度 是否等于 颜色空间转化函数 False
回顾一下矩阵以前的某个总结:---矩阵中的a[ : , :] 和 a[ : , 常数 ]拓展到三维,理解方式一样
思路:
a[ : , : ,: ] 获取到的 ,则是当前维度,这里是三维。
A[:, : ,常数] 获取到的,则会降一维,那么会变成2维。
代码:
例如1:---- A[:, : ,常数] 获取到的,还是一维的。 和二维矩阵一样
import numpy as np
a = np.arange(1,25).reshape(3,4,2)
b = a[ : , :, 0]
print(a)
print(b)
输出:
[[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]
[13 14]
[15 16]]
[[17 18]
[19 20]
[21 22]
[23 24]]]
[[ 1 3 5 7]
[ 9 11 13 15]
[17 19 21 23]]
例如2:a[ : , : ,: ] 获取到的 ,则是三维。和二维类似。
import numpy as np
a = np.arange(1,25).reshape(3,4,2)
b = a[:,:,1:]
print(a)
print(b)
输出:
[[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]]
[[ 9 10]
[11 12]
[13 14]
[15 16]]
[[17 18]
[19 20]
[21 22]
[23 24]]]
[[[ 2]
[ 4]
[ 6]
[ 8]]
[[10]
[12]
[14]
[16]]
[[18]
[20]
[22]
[24]]]
实例:
例如1:
import cv2 as cv
src=cv.imread('img/xinyi.png')
cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)
cv.imshow('first_image', src)
#三通道分离形成单通道图片
b, g, r =cv.split(src)
cv.imshow("second_blue", b)
cv.imshow("second_green", g)
cv.imshow("second_red", r)
# 其中cv.imshow("second_red", r)可表示为r = cv2.split(src)[2]
#三个单通道合成一个三通道图片
src = cv.merge([b, g, r])
cv.imshow('changed_image', src)
#用numpy的方式,修改多通道里的某个通道的值
src[:, :, 2] = 0
cv.imshow('modify_image', src)
cv.waitKey(0)
cv.destroyAllWindows()