简介
在本教程中,我们将向你展示如何通过使用OpenCV cv2.split()函数和Numpy将图像分割成多个通道。我们还将向你展示如何用cv2.merge()函数合并单通道图像以生成多通道图像。
颜色空间和通道
图像的颜色可以用多种方式组织,这种方案被称为颜色空间。例如,一种流行的表示图像的方式是RGB颜色空间,图像由红、绿、蓝组成。更具体地说,图像的每个像素由三个值(R,G,B)组成,其中R、G和B的范围都在0到255之间。这些属性也被称为通道。
对于各种图像处理任务,你可能需要将彩色图像分割成各个通道,如下图所示。你可能会觉得困惑,为什么红、绿、蓝三个通道会单独出现在灰度中。这是因为分割后的图像只有一个通道,其像素值在0到255之间变化。这实际上对应于灰度色彩空间,因此这三幅图像显示为灰色。
在分割的另一面,你也可以合并单通道图像来产生最终的多通道图像。
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]:
显示绿色通道
接下来,让我们看看下面的绿色通道。
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]:
显示红色通道
接下来,让我们看看下面的红色通道。
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]:
在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]。
用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]:
显示饱和度通道
接下来,让我们看看图像的饱和度通道。
In[9]:
window_name='Saturation Channel'
cv2.imshow(window_name,s_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Out[9]:
显示值通道
最后,让我们看看图像的值通道。
In[10]:
window_name='Value Channel'
cv2.imshow(window_name,v_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Out[10]:
在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]:
将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]。
The postSplit and Merge Image Color Space Channels in OpenCV and NumPyappeared first onMLK - Machine Learning Knowledge.