当前位置: 首页 > news >正文

OpenCV计算机视觉实战(7)——色彩空间详解

OpenCV计算机视觉实战(7)——色彩空间详解

    • 0. 前言
    • 1. RGB/BGR 色彩空间
    • 2. HSV / Lab 色彩空间
    • 3. 颜色直方图分析与可视化
    • 小结
    • 系列链接

0. 前言

本文深入探讨了三种常见色彩空间:RGB/BGRHSVCIELAB,并介绍了 OpenCV 中色彩空间转换的方法与原理 。在 HSVLab 空间部分,演示了如何利用 HSV 进行色彩分割,以及使用 Lab 空间进行颜色校正与色差分析。最后,展示了如何使用 cv2.calcHist 计算颜色直方图,并结合 MatplotlibBGR 通道直方图进行可视化分析,以支持图像增强和基于颜色的检索任务 。

1. RGB/BGR 色彩空间

OpenCV 默认采用 BGR 排序,而非 RGB,这一设计最早源自 Windows BMP 格式的习惯,字节流自然排成 BGR 顺序。在内存中,图像以行主序 (row-major) 方式存储,每个像素的三个通道连续排列。
由于 BGRRGB 仅是通道顺序的差异,任何基于 NumPy 的切片和向量化操作都能以零拷贝方式高效实现格式转换,这也解释了为何 cv2.cvtColor 基于对内存指针的重解释而非像素重排 。
OpenCV 与其他使用 RGB 顺序的库(如 Matplotlib )协同使用时,需要显式执行 cv2.COLOR_BGR2RGB 转换,避免色彩失真与输入格式不匹配的问题。
对于含透明通道 (Alpha) 的图像,OpenCV 同样提供 cv2.COLOR_BGRA2RGBA 等变换,可一并处理多通道图像,并可借助 cv2.split/cv2.merge 做更灵活的透明度叠加。

import cv2
import matplotlib.pyplot as plt# 1) 使用 OpenCV 读取图像(默认为 BGR 格式)
img_bgr = cv2.imread('1.jpeg')  # cv2.imread 默认读取 BGR 图像# 2) 使用 OpenCV 显示(正常显示 BGR)
# cv2.imshow('OpenCV BGR Display', img_bgr)
# cv2.waitKey(0)
# cv2.destroyAllWindows()             # cv2.imshow 用于显示 BGR 图像# 3) 直接用 Matplotlib 显示(通道顺序不转换,会看到色彩错位)
plt.subplot(1,2,1)
plt.title('Matplotlib without Conversion')
plt.imshow(img_bgr)                # plt.imshow 默认以 RGB 通道渲染, 直接显示 BGR 数组会出现蓝红通道颠倒
plt.axis('off')
# 4) 转换 BGR -> RGB
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)  # 高效通道重排,无数据拷贝# 5) 再次用 Matplotlib 显示(正确颜色)
plt.subplot(1,2,2)
plt.title('Matplotlib after cvtColor')
plt.imshow(img_rgb)
plt.axis('off')
plt.show()

关键函数解析:

  • cv2.imread(path):读取图像到 NumPy 数组,默认按 BGR 通道顺序加载
  • plt.imshow(image):用 Matplotlib 渲染图像时,默认将数组视为 RGB 格式;若输入 BGR 数组,将出现蓝红通道颠倒的现象
  • cv2.cvtColor(src, code):执行高效的色彩空间转换,通过 NumPy 视图操作避免额外拷贝

2. HSV / Lab 色彩空间

HSV (Hue, Saturation, Value) 将色相、饱和度与明度解耦,最早受人类视觉模型启发,色相环 (0°–360°) 对应常见彩虹色谱,可直观地对单一色调进行阈值分割,尤其适合实时目标跟踪与交互式调色面板。通过 HSV 分割可稳定提取同一物体在光照变化下的轮廓,例如自动化装配线中对特定色标的检测。
CIELAB (Lab) 旨在实现感知均匀性,将明度 L* 与对立色轴 a* (绿—红)、b* (蓝—黄)分离,极大地简化了色差计算,在印刷质量控制与医学影像配色校正中具有极大优势。
在色彩校正流水线中,通常先将图像从 BGR 转换到 Lab,然后对 L* 进行均衡化或 Gamma 校正,再重投影到 BGR,以兼顾视觉亮度和色彩准确度。
OpenCV 提供了 cv2.COLOR_BGR2HSVcv2.COLOR_BGR2Lab 等转换方式,还支持将 HSVLabYCrCb 等多空间联合使用,满足不同任务的色彩分离需求。
接下来,使用交互式滑动条,使得 HSV 阈值可在运行时实时调整,适应多变光照环境。同时演示在 Lab 空间中对 L* 通道应用自适应直方图均衡化,可以在局部区域内提升对比度并抑制噪点 。最后,将原图、HSV 分割结果与 Lab 增强结果并排展示,便于直观对比三者在不同场景下的效果差异:

import cv2
import numpy as npdef nothing(x):pass# 读取原始图像
img = cv2.imread('1.jpeg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # BGR -> HSV# 创建滑动条窗口
cv2.namedWindow('HSV 调参')
for name, init in zip(['H_min','H_max','S_min','S_max','V_min','V_max'],[0, 179, 0, 255, 0, 255]
):max_val = 179 if 'H' in name else 255cv2.createTrackbar(name, 'HSV 调参', init, max_val, nothing)  # 创建滑动条# Lab CLAHE 对象
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))  # CLAHE 对比度限制while True:# 获取滑动条数值h_min = cv2.getTrackbarPos('H_min', 'HSV 调参')h_max = cv2.getTrackbarPos('H_max', 'HSV 调参')s_min = cv2.getTrackbarPos('S_min', 'HSV 调参')s_max = cv2.getTrackbarPos('S_max', 'HSV 调参')v_min = cv2.getTrackbarPos('V_min', 'HSV 调参')v_max = cv2.getTrackbarPos('V_max', 'HSV 调参')lower = np.array([h_min, s_min, v_min])upper = np.array([h_max, s_max, v_max])# HSV 分割mask = cv2.inRange(hsv, lower, upper)       # 生成二值掩膜res_hsv = cv2.bitwise_and(img, img, mask=mask)  # 掩膜与原图叠加# Lab 空间 CLAHE 增强lab = cv2.cvtColor(img, cv2.COLOR_BGR2Lab)  # BGR -> Labl, a, b = cv2.split(lab)                    # 通道分离l_eq = clahe.apply(l)                       # 对 L* 通道应用lab_eq = cv2.merge([l_eq, a, b])            # 通道合并res_lab = cv2.cvtColor(lab_eq, cv2.COLOR_Lab2BGR)  # Lab -> BGR# 并排展示原图 / HSV 分割 / Lab 增强combined = np.hstack((img, res_hsv, res_lab))cv2.imshow('原图 | HSV 分割 | Lab CLAHE 增强', combined)  # 同一窗口对比# 按 Esc 键退出并保存结果if cv2.waitKey(1) & 0xFF == 27:# 保存各阶段结果cv2.imwrite('result_original.jpg', img)             # 保存原始图像cv2.imwrite('result_hsv_segmentation.png', res_hsv) # 保存 HSV 分割结果 cv2.imwrite('result_lab_clahe.jpg', res_lab)        # 保存 Lab CLAHE 增强结果cv2.imwrite('result_comparison.png', combined)      # 保存并排对比图breakcv2.destroyAllWindows()

结果
关键代码解析:

  • cv2.createTrackbar(name, win, val, max, callback):在指定窗口中创建命名为 name 的滑动条,用于获取范围 [0,max] 内的整型数值,实时回调函数 callback 获取最新位置
  • cv2.inRange(src, lowerb, upperb):对每个像素的三通道值与阈值数组 lowerb / upperb 进行比较,符合条件的像素输出 255,否则输出 0,生成二值掩膜常用于快速颜色分割
  • cv2.bitwise_and(src1, src2, mask):对应像素做按位与操作,仅保留掩膜为 255 的区域,实现掩膜与原图的叠加
  • cv2.cvtColor(src, code):支持多种色彩空间转换,此处使用 cv2.COLOR_BGR2HSVBGR 转为 HSV,以及 cv2.COLOR_BGR2Lab / cv2.COLOR_Lab2BGRBGRLab 之间变换
  • cv2.createCLAHE(clipLimit, tileGridSize)clahe.apply(channel):创建 CLAHE 对象并对单通道图像局部自适应均衡化,可避免全局均衡化导致的噪声过度放大。将均衡化后的 L* 通道与原 ab 通道合并,可在提升局部对比度的同时保留色彩信息
  • np.hstack(tup):将多张形状相同的图像按水平方向拼接,用于同时展示多个处理结果,便于视觉对比

3. 颜色直方图分析与可视化

颜色直方图记录像素强度分布,是评估图像全局或局部对比度、亮度偏移及色彩偏差的基础工具,广泛应用于自动白平衡、阈值分割及风格迁移前的统计分析。在 Opencv 中 可以使用 cv2.calcHist 可对单通道或多通道图像分别计算直方图,并支持掩膜参数,只需将感兴趣区域的 mask 传入,即可实现局部区域的色彩分布可视化。
直方图均衡化 (cv2.equalizeHist) 与自适应均衡化 (CLAHE) 在灰度和 Lab L* 通道上效果显著,能动态拉伸分布至全量程,消除低对比度图像的暗部或高光溢出。也可以将直方图特征作为图像检索或机器学习模型的输入特征,实现基于颜色分布的图像检索、分类与风格识别。

import cv2
from matplotlib import pyplot as pltimg = cv2.imread('1.jpeg')# 计算三个通道的直方图
colors = ('b', 'g', 'r')
for i, col in enumerate(colors):hist = cv2.calcHist([img], [i], None, [256], [0, 256])plt.plot(hist, label=f'{col.upper()} channel')plt.title('Color Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.legend()
plt.show()

颜色直方图

关键代码解析:

  • cv2.calcHist(images, channels, mask, histSize, ranges):计算直方图,channels 指定通道索引,mask 控制分析区域

小结

本文系统的介绍了三种色彩空间的核心概念与 OpenCV 中的实现细节,并通过完整示例演示了实战中如何应用转换、分割与可视化技术。

系列链接

OpenCV计算机视觉实战(1)——计算机视觉简介
OpenCV计算机视觉实战(2)——环境搭建与OpenCV简介
OpenCV计算机视觉实战(3)——计算机图像处理基础
OpenCV计算机视觉实战(4)——计算机视觉核心技术全解析
OpenCV计算机视觉实战(5)——图像基础操作全解析
OpenCV计算机视觉实战(6)——经典计算机视觉算法

http://www.xdnf.cn/news/589033.html

相关文章:

  • 网络图片的缓存和压缩
  • 海康相机---采集图像
  • 如何解决鸿蒙应用闪退问题
  • Flutter 3.32 新特性
  • 鸿蒙Flutter实战:21-混合开发详解-1-概述
  • flutter getx路由管理、状态管理、路由守卫中间件、永久储存get_storage
  • 汇川EasyPLC MODBUS-RTU通信配置和编程实现
  • S7-1500PLC通过工艺对象实现V90总线伺服定位控制(105报文)
  • 英伟达有意入股 PsiQuantum,释放战略转向量子计算的重要信号
  • JVM常量池(class文件常量池,运行时常量池,字符串常量池)
  • Mysql数据库之索引与事务
  • 【内部教程】ISOLAR-AB配置以太网栈|超详细实战版
  • Kotlin与Flutter:跨平台开发的互补之道与实战指南
  • Armadillo C++ 线性代数库介绍与使用
  • Kotlin 极简小抄 P10(类与对象、主构造函数、带有默认参数值的主构造函数、次要构造函数)
  • 【机器学习】集成学习算法及实现过程
  • Ubuntu20.04的安装(VMware)
  • 详解受约束的强化学习(四、数学符号说明)
  • PL/Python数据库: PostgreSQL Python扩展
  • Argo CD 详解:从 GitOps 到持续交付的完整实践
  • 关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别
  • 相机标定与图像处理涉及的核心坐标系
  • 2. PyQGIS Windows下开发环境搭建
  • Java——集合类
  • 【Android】屏幕适配小合集
  • 基于python,html,echart,php,mysql,在线实时监控入侵检测系统
  • 六一儿童节礼物清单|雷克赛恩 CyberPro1 打造亲子光影盛宴
  • OptiStruct结构分析与工程应用:结构激励
  • 线程安全问题
  • 100个Linux运维知识