#分离
b,g,r=cv2.split(img)
#保存
cv2.imwrite(filepath+'out/r.png',r)
cv2.imwrite(filepath+'out/g.png',g)
cv2.imwrite(filepath+'out/b.png',b)
cop_img[:,:,0]=0
cop_img[:,:,1]=0
cv2.imwrite(filepath+'out/color_r.png',cop_img)
第三维度=0——B
1——G
2——R
img1=cv2.merge((b,g,r))
编程要求
根据提示,在右侧编辑器补充 Begin-End 代码,实现图像通道分离与合并操作。具体要求如下:
import cv2
# 实现图像颜色通道分离和保存
def task2():
filepath = "/data/workspace/myshixun/task2/"
img = cv2.imread( filepath + 'pic.jpg')
# 请分离图像的B,G,R通道,并保存到给定filepath下的out文件夹,
# 三个通道分别保存为r.png、g.png、b.png
#分离
b,g,r=cv2.split(img)
#保存
cv2.imwrite(filepath+'out/r.png',r)
cv2.imwrite(filepath+'out/g.png',g)
cv2.imwrite(filepath+'out/b.png',b)
# 请合并分离的通道,并在out文件夹下保存红色通道的彩色图像color_r.png
#合并
img1=cv2.merge((b,g,r))
cop_img=img1.copy()
#分离出红色通道的彩色图像
cop_img[:,:,0]=0
cop_img[:,:,1]=0
cv2.imwrite(filepath+'out/color_r.png',cop_img)
——————————————————————————————————————————————————————
通道是图像处理的基本概念,它决定图像如何存储与显示。 RGB 颜色模式下图像具有 R, G, B 三个颜色通道。
对于一幅的数字图像,我们看到的是一幅真正的图片,但是对于计算机,这副图像只是一个数字矩阵。
计算机存储的数字图像的本质是一个多维矩阵。一副尺寸为M × N的图像可以用一个 M × N × c的矩阵来表示,矩阵元素(M, N)的值表示这个位置上的像素的亮度,c表示的就是通道数。
描述一个像素点,如果用灰度描述它,就是单通道,即c=1。光学三原色(红、绿、蓝, RGB )能够组成任何的颜色,如果c=3,说明图片在RGB颜色模式,每一个三原色都是一个通道。
注意:
图像通道仅仅在显示的时候才有意义,即cv2.imshow()
一幅完整的图像,红色绿色蓝色三个通道缺一不可。即使图像中看起来没有蓝色,只能说蓝色光的亮度均为0,但不能说没有蓝色通道存在。因此,“存在、亮度为零”和“不存在”是两个不同的概念
在 OpenCV 中,可以通过以下的方式将三原色的三个通道分开:
B,G,R = cv2.split(img)
#加载opencv
import cv2
src=cv2.imread('split.jpg')
cv2.imshow('before',src)
#调用通道分离
b,g,r=cv2.split(src)——得到b g r 三个图像
#三通道分别显示
cv2.imshow('blue',b)
cv2.imshow('green',g)
cv2.imshow('red',r)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果使用B,G,R = cv2.split(img),那么得到的是 B,G,R 单独通道的灰度图。因此,只有同时使其它两个通道的“亮度”为 0 ,才会单独显示得到的 B、G、R 图像。
我们以歼20飞机图片为例,分离显示G(绿)通道图片。读入图片矩阵img的第三个维度有0, 1, 2三个值,分别对应B, G, R三个通道。把B、R两个通道置0则可以分离显示出G通道的彩色图像:
img[:, :, 0] = 0 #第三维度=0——B
img[:, :, 2] = 0 #第三维度=2——R
cv2.imshow('J20_only_b', img)
这样,我们就可以得到如图 1 所示的绿色通道图像的彩色图像。
图1 歼20 原始图像(左)和 绿色通道彩色图像
合并通道可以通过下面代码来实现:
img1 = cv2.merge((B,G,R))