在OpenCV和NumPy中分割和合并图像色彩空间通道

469 阅读4分钟

简介

在本教程中,我们将向你展示如何通过使用OpenCV cv2.split()函数和Numpy将图像分割成多个通道。我们还将向你展示如何用cv2.merge()函数合并单通道图像以生成多通道图像。

颜色空间和通道

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

RGB Color Space Channel

(资料来源)

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

在分割的另一面,你也可以合并单通道图像来产生最终的多通道图像。

RGB Color Space

(资料来源)

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

OpenCV函数 - cv2.split()

在OpenCV中,你可以通过使用cv2.split()函数轻松地将图像分割成各个通道。

语法

OpenCV的分割函数的语法如下

split(img)

  • img - 它是图像,其通道必须被分割。
  • 它返回该图像的各个通道。

在OpenCV中分割BGR图像

应该注意的是,OpenCV是以BGR而不是RGB模式来读取彩色图像的。这意味着通道的顺序是蓝、绿、红。然而,通过使用OpenCV的cvtColor()函数可以将其转换为RGB色彩空间。但为了简单起见,我们将只使用BGR色彩空间来向你展示cv2.split()函数在OpenCV中是如何工作的。

加载所需的库

让我们开始加载我们的例子所需要的python库。

In[0]:

import cv2
import numpy as np

读取样本图像

接下来,我们读取并显示将在我们的例子中使用的样本图像。如前所述,OpenCV以BGR模式读取图像。

In[1]:

#read image

Out[1]:

用cv2.split分割图像

现在我们将图像传给cv2.split()函数,它将分别返回由蓝、绿、红变量捕获的三个通道。

在[2]中。

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

显示蓝色通道

让我们用下面的代码看看图像的蓝色通道。

在[3]中。

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

Out[3]:

cv2.split - blue channel

显示绿色通道

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

In [4]:

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

Out[4]:

cv2.split - green channel

显示红色通道

接下来,让我们看看下面的红色通道。

In [5]:

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

Out[5]:

cv2.split - red channel

在OpenCV中分割HSV图像

创建HSV图像

让我们在cvtColor()函数的帮助下将先前的图像转换成HSV颜色空间。然后我们将在这个例子中用cv2 split函数来分割这个图像。

In[6]:

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()

输出[6]。

HSV Colorspace

用cv2.split分割图像

HSV色彩空间有三个通道--色调、饱和度和值。在下面的代码中,HSV图像被分割成三个通道。

在[7]中。

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

显示色相通道

让我们看看色相通道是什么样子的。

在[8]中。

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

Out[8]:

cv2 split - Hue channel

显示饱和度通道

接下来,让我们看看图像的饱和度通道。

In[9]:

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

Out[9]:

cv2.split - Saturation channel

显示值通道

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

In[10]:

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

Out[10]:

cv2 split - Value channel

在NumPy中分割图像

尽管OpenCV的split()函数可以非常容易地将图像分割成不同的通道,但它的速度性能可能并不总是非常有效。在这种情况下,你可以在NumPy操作的帮助下以更好的速度分割图像。

例如,包含B、G、R三个通道的图像可以用NumPy进行分割,如下所示

在[11]中。

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

它将产生与我们在下面第一个例子中看到的BGR图像的OpenCV分割函数相同的输出。因此不再重复相同的内容。

OpenCV函数 - cv2.merge()

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

语法

OpenCV分割函数的语法如下 -

merge(img_channel1,img_channel2, ... img_channeln)

  • img_channel - 单通道图像。
  • 它返回的是多通道图像。

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

让我们合并我们在教程的第一个例子中所分割的单个单通道图像。它将产生原始的BGR图像。

In[12]:

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

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

Out[12]:

cv2 merge - BGR

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

接下来,让我们合并在本教程第二个例子中分割的单个单通道图像。它可以产生回原始的HSV图像。

In[13]:

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()

输出[13]。

cv2 merge - HSV

The postSplit and Merge Image Color Space Channels in OpenCV and NumPyappeared first onMLK - Machine Learning Knowledge.