在本教程中,将向您展示如何使用 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 split 函数的语法如下:
split(img)
需要注意的是,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() 函数,该函数返回分别由蓝色、绿色和红色变量捕获的三个通道。
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()
输出:
借助 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()
输出:
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()
最后,让我们看看图像的价值通道。:
window_name='Value Channel'
cv2.imshow(window_name,v_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
尽管 OpenCV 的 split() 函数可以很容易地将图像分割成不同的通道,但它的速度性能并不理想。在这种情况下,可以借助 NumPy 操作以更快的速度分割图像。
例如,包含三个通道 B、G 和 R 的图像可以用 NumPy 分割如下:
B = img[:, :, 0]
G = img[:, :, 1]
R = img[:, :, 2]
输出与下面第一个示例中 BGR 图像 OpenCV 拆分功能相同的结果。
在 OpenCV 中,您可以使用 cv2.merge() 函数合并单个单通道图像以生成最终的多通道图像。
OpenCV split 函数的语法如下:
merge(img_channel1,img_channel2,… img_channeln)
img_channel – 单通道图像。
合并在本教程的第一个示例中分割的单个单通道图像。输出原始 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()
输出:
接下来,合并在本教程的第二个示例中分割的单个单通道图像。输出原始 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 条评论) “” |