Bootstrap

OpenCV基础:通道的分割与合并

目录

相关阅读

1. 简述

2. 相关接口

2.1 通道分割API

2.2. 通道合并API

3. 分割与合并示例

4. 注意事项

5. 通道操作的应用场景

5.1 颜色空间转换

5.2 图像增强和处理


相关阅读

OpenCV基础:色彩空间转换-CSDN博客

OpenCV基础:图像运算-CSDN博客

OpenCV基础:图像的溶合-CSDN博客


1. 简述

在图像处理中,通道是图像数据的重要组成部分。例如,彩色图像通常由三个通道(RGB 或 BGR)组成,每个通道表示一种颜色分量。在某些场景中,我们可能需要对单个通道进行操作,这就需要用到 OpenCV 的通道分割与通道合并功能。


2. 相关接口

2.1 通道分割API

cv2.split(m)

用于将多通道图像拆分为单通道图像,每个通道会存储在一个独立的矩阵中。

参数:输入的多通道图像。

返回值::一个包含各通道的列表,每个通道为一个单通道图像。

2.2. 通道合并API

cv2.merge(mv)

用于将多个单通道图像合并为一个多通道图像。

参数:包含单通道图像的列表,要求列表中的图像尺寸必须相同。
返回值:合并后的多通道图像。


3. 分割与合并示例

import cv2
import numpy as np

# 创建一张全黑的背景图
img = np.zeros((480,640,3), np.uint8)

# 分离通道
b,g,r = cv2.split(img)

b[10:100, 10:100] = 255
g[10:100, 10:100] = 255

# 合并通道
img2 = cv2.merge((b, g, r))

cv2.imshow('b', b)
cv2.imshow('img2', img2)
cv2.waitKey(0)

运行结果:

    

b 为分离出的通道, 改变部分区域的值为255, 显示出来有一块白色的区域;

img2为b, g, r 三个通道合并的结果,b 和 g 通道中部分区域改为了白色, r 通道数据未改变, 合并后重叠区域显示为青色 - BGR(255,255,0)。


4. 注意事项

  • 尺寸一致性:合并通道时,所有通道的尺寸必须一致。如果尺寸不同,可以先使用 cv2.resize 对图像进行调整。
  • 数据类型一致性:分割和合并时,所有通道的数据类型必须一致。例如,uint8 格式的图像不能直接与 float32 格式的图像合并。
  • 颜色空间:默认情况下,OpenCV 使用 BGR 颜色空间,而不是 RGB。在处理彩色图像时,务必注意颜色空间的正确性。

5. 通道操作的应用场景

5.1 颜色空间转换

通道分割和合并可用于颜色空间的转换。例如,将 BGR 图像转换为 HSV(色调、饱和度、亮度)或 YUV 等其他颜色空间时,可能需要先将图像分割成通道,进行一些操作,然后再合并回去。

 代码示例:

import cv2
import numpy as np

# 读取图像
image = cv2.imread('D:\\resource\\huaji.jpg')

# 通道分割
b, g, r = cv2.split(image)

# 转换为 YUV 颜色空间
yuv_image = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)
y, u, v = cv2.split(yuv_image)

# 对 Y 通道进行操作,例如增强亮度
y = np.clip(y * 1.2, 0, 255).astype(np.uint8)

# 合并 YUV 通道
modified_yuv_image = cv2.merge((y, u, v))

# 转换回 BGR 颜色空间
modified_image = cv2.cvtColor(modified_yuv_image, cv2.COLOR_YUV2BGR)

# 显示修改后的图像
cv2.imshow('Modified Image', modified_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们将图像转换为 YUV 颜色空间,对 Y 通道进行亮度增强操作,然后再转换回 BGR 颜色空间。

运行效果:

 

5.2 图像增强和处理

import cv2
import numpy as np

# 读取图像
image = cv2.imread('D:\\resource\\huaji.jpg')

# 通道分割
b, g, r = cv2.split(image)

# 增强红色通道
r = np.clip(r * 1.5, 0, 255).astype(np.uint8)

# 合并通道
enhanced_image = cv2.merge((b, g, r))

# 显示增强后的图像
cv2.imshow('Enhanced Image', enhanced_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里我们将红色通道的值乘以 1.5,实现了对红色的增强。

运行效果:

;