【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【4】:通道详解

编程入门 行业动态 更新时间:2024-10-25 06:28:08

【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【4】:通道<a href=https://www.elefans.com/category/jswz/34/1770044.html style=详解"/>

【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【4】:通道详解

视频课程:《Python OpenCV 4高级编程与实战》

相信很多读者朋友对“通道”这个词已经不陌生了,一副BGR图像是由3个通道组成的,这3个通道是B通道、G通道和R通道。本节将介绍如何对通道进行拆分与合并,并达到处理图像的目的。

1.拆分BGR图像中的通道

OpenCV提供的split函数可以拆分图像中的通道。split函数的原型如下:

    split(image)-> b,g,r

参数说明:

  • image:待拆分通道的BGR图像,也就是imread函数返回的值。

  • b:B通道图像。

  • g:G通道图像。

  • r:R通道图像。

注意:拆分BGR图像中通道的顺序是B、G、R,因此,split函数的3个返回值的顺序不能打乱顺序,必须是b、g、r。

下面的例子拆分flower.jpg图像中的通道,然后再显示拆分后的通道图像,代码如下:

import cv2
rgb_image = cv2.imread("images/flower.jpg")
cv2.imshow("flower", rgb_image)
# 拆分图像的通道
b, g, r = cv2.split(rgb_image)
# 显示B通道图像
cv2.imshow("B", b)
# 显示G通道图像
cv2.imshow("G", g)
# 显示R通道图像
cv2.imshow("R", r)
cv2.waitKey()
cv2.destroyAllWindows()

运行这段代码,会得到如下面所示的4个窗口。其中,图1是原图像,图2是B通道图像,图3是G通道图像,图4是R通道图像。

看到这3个通道的图像,可能很多读者会感到奇怪。B通道是蓝色通道,G通道是绿色通道,R通道是红色通道,但图2、图3和图4看到的都是灰度图像,这是为什么呢?

原因是使用cv2.imshow函数时,会用一个通道的值填充另外两个通道。例如,用cv2.imshow("B", b)显示B通道图像时,会用B通道的值填充G通道和R通道,即(B,B,B),所以用cv2.imshow函数显示的图像,总是灰度图像。

2. 拆分HSV图像中的通道

使用split函数不仅可以拆分BGR图像的通道,也可以拆分HSV图像的通道,拆分HSV图像通道,split函数会返回h、s、v,原型如下:

split(image)-> h,s,v

参数说明:

  • image:待拆分的HSV图像。

  • h:H通道图像。

  • s:S通道图像。

  • v:V通道图像。

下面的代码将flower.jpg从BGR色彩空间转换到HSV色彩空间,然后拆分得到HSV图像中的通道,最后显示拆分后的通道图像。代码如下:

import cv2rgb_image = cv2.imread("images/flower.jpg")
# 显示flower.jpg
cv2.imshow("flower", rgb_image)
# 将flower.jpg从BGR色彩空间转换到HSV色彩空间
hsv_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)
# 拆分HSV图像中的通道
h, s, v = cv2.split(hsv_image)
cv2.imshow("H", h)                # 显示HSV图像中H通道的图像
cv2.imshow("S", s)                # 显示HSV图像中S通道的图像
cv2.imshow("V", v)                # 显示HSV图像中V通道的图像
cv2.waitKey()
cv2.destroyAllWindows()

运行这段代码,会得到如下面所示的4个窗口。其中,图5是原图像,图6是H通道图像,图7是S通道图像,图8是V通道图像。

合并通道是拆分通道的逆过程。在前面的部分将BGR通道和HSV通道各拆分成3个通道,如果将这3个通道合并,会恢复原来的图像。合并通道的功能是通过merge函数实现的。

3. 合并B通道图像、G通道图像和R通道图像

merge函数用于按B、G、R顺序合并通道,如果按这个顺序传入通道图像,就可以得到原图像。merge函数的原型如下:

cv.merge([b, g,r])->dst

参数说明:

  • b:B通道图像。

  • g:G通道图像。

  • r:R通道图像。

  • dst:按B、G、R顺序合并通道后得到的图像。

下面的代码先拆分flower.jpg图像中的通道,然后分别按B、G、R和R、G、B的顺序合并通道,最后分别显示按不同顺序合并通道后的彩色图像。代码如下:

import cv2
rgb_image = cv2.imread("images/flower.jpg")
b, g, r = cv2.split(rgb_image)
# 按B、G、R顺序合并通道
bgr = cv2.merge([b, g, r])
cv2.imshow("BGR", bgr)
# 按R、G、B顺序合并通道
rgb = cv2.merge([r, g, b])
cv2.imshow("RGB", rgb)
cv2.waitKey()
cv2.destroyAllWindows()

运行这段代码,会得到如下面所示的2个窗口。其中,图9得到了原图像,而图10尽管是彩色图像,但与原图像有一些差异。

4. 合并H通道图像、S通道图像和V通道图像

当向merge函数传入H通道图像、S通道图像和V通道图像时,该函数就会将这3个通道合并成一个彩色图像。合并这3个通道的merge函数原型如下:

cv.merge([h, s,v])->dst

参数说明:

  • h:H通道图像。

  • s:S通道图像。

  • v:V通道图像。

  • dst:按H、S、V顺序合并通道后得到的图像。

下面的例子将flower.jpg从BGR色彩空间转换到HSV色彩空间,然后拆分得到HSV图像中的通道,接着合并拆分后的通道图像。最后分别显示原图像、HSV图像和合并后的HSV图像。代码如下:

import cv2rgb_image = cv2.imread("images/flower.jpg")
# 显示原图像
cv2.imshow("flower", rgb_image)
# 将图像从BGR色彩空间转换到HSV色彩空间
hsv_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)
# 显示HSV色彩空间中的图像
cv2.imshow("HSV1",hsv_image)
# 将HSV图像拆分成3个通道图像
h, s, v = cv2.split(hsv_image)
# 合并3个通道图像未HSV图像
hsv = cv2.merge([h, s, v])
# 显示合并后的HSV图像
cv2.imshow("HSV2", hsv)
cv2.waitKey()
cv2.destroyAllWindows()

运行这段代码,会得到如下面所示的3个窗口。其中,图11是原图像,图12和图13的效果一样,都是HSV色彩空间的图像。也就是说,一旦将图像从BGR色彩空间转换到HSV色彩空间,尽管也是彩色图像,不过与原图像有一定的差异,而且是无法还原的。

5. alpha通道

BGR色彩空间包含3个通道,即B通道、G通道和R通道。OpenCV在这3个通道的基础上,又增加了一个A通道,即alpha通道,用于设置图像的透明度。所以,一个新的BGRA色彩空间诞生了,这个色彩空间由4个通道组成,即B通道、G通道、R通道和A通道。alpha通道在[0, 255]内取值;其中,0表示透明,255表示不透明。

下面的例子将flower.png图像从RGB色彩空间转换到BGRA色彩空间;然后将图像拆分成B通道、G通道、R通道和A通道;接着将图像的透明度调整为150,合并拆分后的4个通道,按同样的方法,再将图像的透明度调整为0,合并拆分后的4个通道;接下来显示合并后的结果,最后保存合并后的结果。

import cv2rgb_image = cv2.imread("images/flower.png")
# 将RGB色彩空间的图像转换为RGBA色彩空间的图像
rgba_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2RGBA)
# 显示RGBA色彩空间的原图像
cv2.imshow('RGBA', rgb_image)
# 将RGBA色彩空间的图像拆分成R通道、G通道、B通道和A通道
r, g, b, a = cv2.split(rgba_image)
# 将透明度修改为150
a[:, :] = 150
# 合并4个通道
rgba_150 = cv2.merge([r, g, b, a])
# 将透明度修改为0
a[:, :] = 0
# 合并4个通道
rgba_0 = cv2.merge([r, g, b, a])
# 显示透明度为150的图像
cv2.imshow('A = 150', rgba_150)
# 显示透明度为0的图像
cv2.imshow('A = 0', rgba_0)
# 保存原图像
cv2.imwrite('images/flower_image.png',rgba_image)
# 保存透明度为150的原图像
cv2.imwrite('images/flower_150.png', rgba_150)
# 保存透明度为0的图像
cv2.imwrite('images/flower_0.png', rgba_0)
cv2.waitKey()
cv2.destroyAllWindows()

运行程序,会看到如图14、图15和图16所示的效果。

从图14、图15和图16看,这3个图的效果都一样,并未展现出任何透明的效果。这是由于imshow函数的显示机制不支持透明效果。为了看到透明的效果,读者可以直接Windows的资源管理器中打开这些图像文件,也可以使用像PS这样的图像处理软件打开这些图像文件。图17、图18和图19是使用PS查看这3张图的效果。

我们可以看到,透明度为0的图像什么都没有,一片空白。图中的网格是PS显示的透明图效果。

更多推荐

【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【4】:通道详解

本文发布于:2024-02-08 21:37:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1675328.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:详解   实战   通道   高级编程   视觉

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!