(原创)
本篇来看一下opencv的两个函数 通道cv2.split 和 通道cv2.merge
操作像素
直接操作像素来分离通道得到单通道的灰度图
首先了解一下python中获取的图片信息 : 一张图片由[h*w]个像素构成,每个像素点有组成其颜色的参数,事实上就是BGR三通道的分量值 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
import cv2 import numpy as np from matplotlib import pyplot as plt
img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
b = img[:,:,0] g = img[:,:,1] r = img[:,:,2]
cv2.imshow("blue",b) cv2.imshow("green",g) cv2.imshow("red",r) cv2.waitKey(0)
|
函数实现
通道拆分 cv2.split
- cv2.split(image) 将图片拆分成 B G R 三个通道(顺序就是为BGR)
返回一个单通道的数组 (色彩图片是由三个数组构成,就是BGR三个通道的数组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
import cv2 import numpy as np from matplotlib import pyplot as plt
img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
b,g,r = cv2.split(img)
cv2.imshow("Original",img) cv2.imshow("Red", r) cv2.imshow("Green", g) cv2.imshow("Blue", b) cv2.waitKey(0)
|
输出效果 为黑白灰度的单通道图片
cv2.split 函数分离得到各个通道的灰度值(单通道图像)

通道合并cv2.merge
- cv2.merge 将表颜色的数组合成构成图片, 参数为 [B,G,R]
若想得到色彩分离的图片(例如:红通道就变成只有红色合成的图片) ,实际上是在多通道下其他通道的分量值变为0。可以通过通道合并再将通道分量值取0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
import cv2 import numpy as np from matplotlib import pyplot as plt
img = cv2.imread("D:\图片\Saved Pictures\qianxun.jpg",cv2.IMREAD_COLOR)
b,g,r = cv2.split(img)
cv2.imshow("Original",img) cv2.imshow("Red", r) cv2.imshow("Green", g) cv2.imshow("Blue", b) cv2.waitKey(0)
zeros = np.zeros(img.shape[:2], dtype = "uint8")
cv2.imshow("blue", cv2.merge([b, zeros, zeros])) cv2.imshow("green", cv2.merge([zeros, g, zeros])) cv2.imshow("red", cv2.merge([zeros, zeros, r])) cv2.waitKey(0)
|
cv2 中不支持直接创建图片, 要依靠 np里面的初始化函数来生成一个图片数据组 , 其初始化的数值为 0 。
效果如下

不同灰度图下的图片
