Python OpenCV色彩空间转换与颜色追踪实战

橘子海
橘子海
发布时间:2026-10-14| 3人浏览过
原创

本文详解Python中使用OpenCV进行色彩空间转换的方法,涵盖RGB转Gray、HSV、YUV及YCrCb。重点讲解利用inRange函数在HSV空间提取特定颜色实现视频追踪的原理与代码,并演示通道分离、合并及单通道值修改的具体操作,附带完整示例代码。

OpenCV色彩空间转换基础

色彩空间转换是图像处理的基础操作,不同色彩空间适用于不同的应用场景。

具体实现代码如下:


#色彩空间转换
import cv2 as cv
def color_space_demo(img):
  gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #RGB转换为GRAY 这里的GRAY是单通道的
  cv.imshow("gray", gray)
  hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)   #RGB转换为HSV
  cv.imshow("hsv", hsv)
  yuv = cv.cvtColor(img, cv.COLOR_RGB2YUV)   #RGB转换为YUV
  cv.imshow("yuv",yuv)
  Ycrcb = cv.cvtColor(img, cv.COLOR_RGB2YCrCb) #RGB转换为YCrCb
  cv.imshow("Ycrcb", Ycrcb)
src = cv.imread('D:\imageload\example.png')
cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)
cv.imshow('first_image', src)
color_space_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

程序运行后的输出结果如下:

RGB色彩空间由红(Red)、绿(Green)和蓝(Blue)三个通道构成,图像的色彩信息即由这三个通道的数值组合决定。

Gray(灰度)色彩空间仅包含一个通道,即灰度值,去除了色彩信息,仅保留亮度信息。

HSV色彩空间包含色调(Hue)、饱和度(Saturation)和亮度(Value)三个通道,更贴近人类对颜色的感知方式。

需要特别注意以下几点个人理解:

根据百度百科定义,灰度图是将RGB中的R、G、B三个通道按照特定转换关系统一替换为Gray值,形成新的RGB(Gray, Gray, Gray),从而用该颜色替换原RGB(R, G, B)。

在OpenCV中,COLOR_RGB2GRAY标志用于将三通道RGB图像转换为单通道的灰度图像对象。

当将单通道灰度图像转换回RGB格式时,生成的RGB图像中每个通道的值均等于原灰度图像的灰度值。

RGB色彩空间设计初衷是为了便于机器显示图像,但对人类而言不够直观。HSV色彩空间更贴近人类认知,因此在针对特定颜色进行提取或处理时,通常先将图像转换至HSV空间进行操作。

补充说明如下:

HSV色彩空间的可视化结构如下图所示:

在OpenCV中,HSV色彩空间的取值范围为:H(色调)0-180,S(饱和度)0-255,V(亮度)0-255。

常见的色彩空间包括RGB、HSV、HIS、YCrCb和YUV,其中应用最广泛的是RGB、HSV和YUV。YUV即YCrCb(参考百度百科),其中“Y”代表明亮度(Luminance或Luma),即灰阶值;“U”和“V”代表色度(Chrominance或Chroma),用于描述影像的色彩及饱和度,指定像素的具体颜色。

利用inRange函数进行颜色追踪

利用inRange函数可以过滤视频中的特定颜色,从而实现对该颜色的实时追踪。

相关实现代码如下:


#视频特定颜色追踪
import cv2 as cv
import numpy as np
def extrace_object_demo():
  capture=cv.VideoCapture("E:/imageload/video_example.mp4")
  while True:
    ret, frame = capture.read()
    if ret == False:
      break
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)   #色彩空间由RGB转换为HSV
    lower_hsv = np.array([100, 43, 46])       #设置要过滤颜色的最小值
    upper_hsv = np.array([124, 255, 255])      #设置要过滤颜色的最大值
    mask = cv.inRange(hsv, lower_hsv, upper_hsv)  #调节图像颜色信息(H)、饱和度(S)、亮度(V)区间,选择蓝色区域
    cv.imshow("video",frame)
    cv.imshow("mask", mask)
    c = cv.waitKey(40)
    if c == 27:   #按键Esc的ASCII码为27
      break
extrace_object_demo()
cv.destroyAllWindows()

程序运行后的效果如下:

此处仅展示追踪蓝色部分的截图,供参考。

使用inRange函数时需注意以下事项:

OpenCV的inRange函数可实现图像的二值化处理功能。

该函数的原型为:inRange(src, lowerb, upperb[, dst]) -> dst。

函数参数含义如下:第一个参数为源数组,可以是单通道或多通道;第二个参数为下界值;第三个参数为上界值。

例如代码:mask = cv2.inRange(hsv, lower_blue, upper_blue)。

第一个参数hsv指代原始图像矩阵。

第二个参数lower_blue指代阈值下界,图像中低于此值的像素点,其输出值变为255。

第三个参数upper_blue指代阈值上界,图像中高于此值的像素点,其输出值变为255(注:在二值化掩膜中,255通常代表白色,0代表黑色,此处原文描述可能存在视觉上的反转或特定语境,按原文保留:255即代表黑色,0代表白色,但通常OpenCV中255为白,0为黑,此处依原文逻辑描述:高于上界变255,区间内变0)。

而在lower_blue与upper_blue之间的像素值变为0(0代表白色)。

综上所述,OpenCV的inRange函数可提取特定颜色范围,使该范围内的颜色变为白色(或黑色,依原文设定),其他颜色变为黑色(或白色),从而实现二值化筛选特定颜色的功能。

HSV颜色对应的RGB分量范围参考表如下(基于三通道数据):

图像通道的分离、合并与修改

此外,还需掌握图像通道的分离、合并以及修改特定通道值的方法。

相关代码如下:


#通道的分离与合并以及某个通道值的修改
import cv2 as cv
src=cv.imread('E:\imageload\example.png')
cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)
cv.imshow('first_image', src)

#三通道分离形成单通道图片
b, g, r =cv.split(src)
cv.imshow("second_blue", b)
cv.imshow("second_green", g)
cv.imshow("second_red", r)
# 其中cv.imshow("second_red", r)可表示为r = cv2.split(src)[2]

#三个单通道合成一个三通道图片
src = cv.merge([b, g, r])
cv.imshow('changed_image', src)

#修改多通道里的某个通道的值
src[:, :, 2] = 0
cv.imshow('modify_image', src)

cv.waitKey(0)
cv.destroyAllWindows()

代码执行注意事项如下:

此处使用了OpenCV的split函数和merge函数,分别用于实现通道的分离与合并操作。

通过cv.split函数分离出的b、g、r均为单通道图像。

以上为Python结合OpenCV进行色彩空间转换的详细内容,更多相关技术资料请查阅本站其他文章。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。