Python高级教程:在 OpenCV 和 NumPy 中拆分和合并图像颜色空间通道

介绍

在本教程中,将向您展示如何使用 OpenCV 的 cv2.split() 函数以及 Numpy 将图像拆分为多个通道。还将向您展示如何使用 cv2.merge() 函数合并单通道图像以生成多通道图像。


再见 Vmware,你好 Hyper-V


色彩空间和通道

图像的颜色可以以多种方式组织,这种方案称为色彩空间。例如,表示图像的一种流行方式是在 RGB 颜色空间中,其中图像由红色、绿色和蓝色组成。更具体地说,图像的每个像素都由三个值(R、G、B)组成,其中 R、G 和 B 的范围在 0 到 255 之间。这些属性也称为通道。

对于各种图像处理任务,您可能需要将彩色图像拆分为其单独的通道,如下图所示。您可能会感到困惑,为什么红色、绿色和蓝色通道分别以灰度显示。这是因为分割图像只有一个通道,其像素值在 0 到 255 之间变化。这实际上对应于灰度色彩空间,因此三个图像显示为灰色。

在拆分的另一面,您还可以合并单通道图像以生成最终的多通道图像。

RGB 只是众多色彩空间中的一种,其他一些是 HSV、BGR、CMYK 等。根据图像处理任务的类型,不同的色彩空间有其自身的意义。

OpenCV 函数 – cv2.split()

在 OpenCV 中,您可以使用 cv2.split() 函数轻松地将图像拆分为各个通道。

语法

OpenCV split 函数的语法如下:

split(img)
  • img – 必须分割通道的图像。
  • 它返回图像的各个通道。

在 OpenCV 中分割 BGR 图像

需要注意的是,OpenCV 将彩色图像读取为 BGR 而不是 RGB 模式。这意味着通道的顺序是蓝色、绿色和红色。但是,可以使用 OpenCV 的cvtColor() 函数将其转换为 RGB 颜色空间。但为了简单起见,将仅使用 BGR 颜色空间来向您展示 cv2.split() 函数在 OpenCV 中的工作原理。

加载所需的库

加载示例所需的 python 库。

在[0]:

import cv2
import numpy as np

读取示例图像

接下来,显示将在整个示例中使用的示例图像。如前所述,OpenCV 在 BGR 模式下读取图像。

#read image
img=cv2.imread("dog.jpg")

window_name='Dog Image'
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.imshow(window_name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

使用 cv2.split 分割图像

将图像传递给 cv2.split() 函数,该函数返回分别由蓝色、绿色和红色变量捕获的三个通道。

blue,green,red = cv2.split(img)

显示蓝色通道

window_name='Blue Channel'
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.imshow(window_name,blue)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

显示绿色通道

接下来,看看下面的绿色通道。

window_name='Green Channel'
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.imshow(window_name,green)
cv2.waitKey(0)
cv2.destroyAllWindows()

显示红色通道

接下来,红色通道。

window_name='Red Channel'
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.imshow(window_name,red)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

在 OpenCV 中分割 HSV 图像

创建 HSV 图像

借助 cvtColor() 函数将早期图像转换为 HSV 颜色空间。然后,在此示例中使用 cv2 拆分函数拆分此图像。

hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

window_name='HSV Image'
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.imshow(window_name,hsv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

使用 cv2.split 分割图像

HSV 颜色空间具有三个通道——色调、饱和度和Value。在下面的代码中,HSV 图像被分成三个通道。

h_img,s_img,v_img = cv2.split(hsv_img)

显示色调通道

window_name='Hue Channel'
cv2.imshow(window_name,h_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

显示饱和通道

window_name='Saturation Channel'
cv2.imshow(window_name,s_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

显示Value通道

最后,让我们看看图像的价值通道。:

window_name='Value Channel'
cv2.imshow(window_name,v_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

在 NumPy 中分割图像

尽管 OpenCV 的 split() 函数可以很容易地将图像分割成不同的通道,但它的速度性能并不理想。在这种情况下,可以借助 NumPy 操作以更快的速度分割图像。

例如,包含三个通道 B、G 和 R 的图像可以用 NumPy 分割如下:

B = img[:, :, 0]
G = img[:, :, 1]
R = img[:, :, 2]

输出与下面第一个示例中 BGR 图像 OpenCV 拆分功能相同的结果。

OpenCV 函数 – cv2.merge()

在 OpenCV 中,您可以使用 cv2.merge() 函数合并单个单通道图像以生成最终的多通道图像。

句法

OpenCV split 函数的语法如下:

merge(img_channel1,img_channel2,… img_channeln)

img_channel – 单通道图像。

  • 返回多通道图像。

将 OpenCV 中的图像通道合并到 BGR

合并在本教程的第一个示例中分割的单个单通道图像。输出原始 BGR 图像。

merge_bgr_img = cv2.merge([blue,green,red]);

window_name='BGR Image'
cv2.imshow(window_name,merge_bgr_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

将 OpenCV 中的图像通道合并到 HSV

接下来,合并在本教程的第二个示例中分割的单个单通道图像。输出原始 HSV 图像。

merge_hsv_img = cv2.merge([h_img,s_img,v_img]);

window_name='HSV Image'
cv2.imshow(window_name,merge_hsv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章