图像BGR通道的拆分与合并

通道的分离与合并

使用的函数:

cv.split(src)

作用:

将彩色图像,分成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]]

 

 

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]]

 

 [[ 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()

 

 

 

你可能感兴趣的:(python_opencv)