通道的分离与合并

通道的分离与合并

使用的函数:

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

 

 

 

你可能感兴趣的:(通道的分离与合并)