起因:
大家都知道的,在OpenCV中,图像都是按 BGR 的 颜色通道顺序 来进行处理的。在自学OpenCV的过程中,我对 拆分和合并颜色通道 起了兴趣。自己写了一些代码来验证自己的思路。
实验思路:
- 分别将三个通道的矩阵数值取出;
- 保留单色通道,其他通道全部置0,以显示 单色 图片的效果;
- 保留双色通道,剩余一个通道置0,以显示 混合双色 图片的效果;
- 保留全部三个颜色通道,重新编排颜色通道顺序,以显示不同 颜色通道顺序 对应图片的效果。
Demo:
原始图像
(girl.jpg):
单色图片
保留 blue 通道,其他通道全部置0(b_pic.jpg):
保留 green 通道,其他通道全部置0(g_pic.jpg):
保留 red 通道,其他通道全部置0(r_pic.jpg):
双色混合图片
green、red通道混合,其他通道全部置0(gr_pic.jpg):
blue、red通道混合,其他通道全部置0(br_pic.jpg):
blue、green通道混合,其他通道全部置0(bg_pic.jpg):
三通道全混合
存为 RGB 通道顺序的 图片(rgb_pic.jpg):
存为 BGR 通道顺序的 图片(bgr_pic.jpg):
附上自己写的实验代码:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
pic = cv2.imread('../pic/girl.jpg')
b, g, r = cv2.split(pic)
### 单色图片
# 保留 blue 通道,其他通道全部置0
b_pic = np.zeros((424, 600, 3), np.uint8)
b_pic[:, :, 0] = b
cv2.imshow('b_pic', b_pic)
cv2.imwrite('../pic/b_pic.jpg', b_pic)
cv2.waitKey(2000)
cv2.destroyAllWindows()
# 保留 green 通道,其他通道全部置0
g_pic = np.zeros((424, 600, 3), np.uint8)
g_pic[:, :, 1] = g
cv2.imshow('g_pic', g_pic)
cv2.imwrite('../pic/g_pic.jpg', g_pic)
cv2.waitKey(2000)
cv2.destroyAllWindows()
# 保留 red 通道,其他通道全部置0
r_pic = np.zeros((424, 600, 3), np.uint8)
r_pic[:, :, 2] = r
cv2.imshow('r_pic', r_pic)
cv2.imwrite('../pic/r_pic.jpg', r_pic)
cv2.waitKey(2000)
cv2.destroyAllWindows()
### 双色混合图片
# green、red通道混合,其他通道全部置0
gr_pic = cv2.imread('../pic/girl.jpg')
gr_pic[:, :, 0] = 0
cv2.imshow('gr_pic', gr_pic)
cv2.imwrite('../pic/gr_pic.jpg', gr_pic)
cv2.waitKey(2000)
cv2.destroyAllWindows()
# blue、red通道混合,其他通道全部置0
br_pic = cv2.imread('../pic/girl.jpg')
br_pic[:, :, 1] = 0
cv2.imshow('br_pic', br_pic)
cv2.imwrite('../pic/br_pic.jpg', br_pic)
cv2.waitKey(2000)
cv2.destroyAllWindows()
# blue、green通道混合,其他通道全部置0
bg_pic = cv2.imread('../pic/girl.jpg')
bg_pic[:, :, 2] = 0
cv2.imshow('bg_pic', bg_pic)
cv2.imwrite('../pic/bg_pic.jpg', bg_pic)
cv2.waitKey(2000)
cv2.destroyAllWindows()
### 三通道全混合
# 存为 RGB 通道顺序的 图片
rgb_pic = np.zeros((424, 600, 3), np.uint8)
rgb_pic[:, :, 0] = r
rgb_pic[:, :, 1] = g
rgb_pic[:, :, 2] = b
cv2.imshow('rgb_pic', rgb_pic)
cv2.imwrite('../pic/rgb_pic.jpg', rgb_pic)
cv2.waitKey(2000)
cv2.destroyAllWindows()
# 存为 BGR 通道顺序的 图片
bgr_pic = np.zeros((424, 600, 3), np.uint8)
bgr_pic[:, :, 0] = b
bgr_pic[:, :, 1] = g
bgr_pic[:, :, 2] = r
cv2.imshow('bgr_pic', bgr_pic)
cv2.imwrite('../pic/bgr_pic.jpg', bgr_pic)
cv2.waitKey(2000)
cv2.destroyAllWindows()