通道的分离与合并
使用的函数:
cv.split(src)
作用:
将彩色图像,分成b、g、r 3个单通道图像。
方便我们对BGR 三个通道分别进行操作。
参数:是需要分离通道的图像数组。
警告:cv2.split() 是一个比较耗时的操作。只有真正需要时才用它,能用numpy的方式,修改多通道里的某个通道的值,就用numpy
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]]
merge([b,g, r])
作用:
通道的合并
分离后的G通道 灰度图,和numpy索引G通道,转灰度 、imread函数转灰度、颜色空间转化函数 ,有什么区别
区别:
虽然 都是灰度图,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]]
[[ 910]
[1112]
[1314]
[1516]]
[[1718]
[1920]
[2122]
[2324]]]
[[[ 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()