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

【图像处理】图像色彩空间 Lab、YCbCr、HSV

参考博客:

数字图像处理—— Lab、YCbCr、HSV、RGB之间互转

一、图像色彩空间 Lab、YCbCr、HSV

1.1 Lab色彩空间

1. 定义与本质

Lab(全称CIELAB)是国际照明委员会(CIE)1976年定义的设备无关色彩空间,核心特点是“模拟人类视觉感知”——空间中颜色的距离与人类主观感受到的颜色差异一致,这与依赖设备的RGB、CMYK空间有本质区别。

  • Lab本身并非“图像文件格式”(如JPEG/PNG),而是图像处理中的中间色彩空间,常用于颜色校正、颜色匹配等对“人眼感知一致性”要求高的场景。

2. Lab分量

Lab由三个通道组成,各分量含义明确且独立:

  • L(Luminance):亮度通道,取值范围通常为0~100。0代表纯黑,100代表纯白,中间值对应不同明暗程度。
  • a(Green-Red Axis):颜色分量,取值范围一般为-128~127。负值偏向绿色,正值偏向红色,0为中性灰。
  • b(Blue-Yellow Axis):颜色分量,取值范围一般为-128~127。负值偏向蓝色,正值偏向黄色,0为中性灰。

3. 特点与应用场景

  • 优势:颜色差异与人类感知一致,适合精确调整颜色而不影响亮度(如肤色优化、产品色彩校准)。
  • 应用:图像色彩校正、跨设备颜色匹配、医学图像处理(如病理切片颜色标准化)。

Lab色彩空间示意图

1.2 YCbCr色彩空间

1. 定义与本质

YCbCr是面向数字图像与视频编码的色彩空间,核心设计思路是“分离亮度与色度信息”——利用人眼对亮度更敏感、对色度相对不敏感的特性,在压缩或传输时降低色度通道的分辨率,以减少数据量同时保持视觉质量。

2. YCbCr分量

YCbCr的三个通道分工明确,聚焦“高效存储与传输”:

  • Y(Luminance):亮度通道,对应图像的明暗信息,与Lab的L通道类似,但计算方式更简化(基于RGB线性组合)。
  • Cb(Blue-Difference Chrominance):蓝色色差通道,存储“蓝色与亮度的差异”,取值范围通常为16~240(数字视频标准)。
  • Cr(Red-Difference Chrominance):红色色差通道,存储“红色与亮度的差异”,取值范围同Cb。

注:色度通道(Cb/Cr)可通过“下采样”(如4:2:0)减少数据量,这是JPEG、MPEG等压缩格式的核心优化手段之一。

3. 特点与应用场景

  • 优势:亮度与色度分离,压缩效率高,兼容人眼视觉特性。
  • 应用:JPEG图像压缩、视频编码(H.264/H.265)、数字电视广播、相机传感器输出。

YCbCr色彩空间示意图

1.3 HSV色彩空间

1. 定义与本质

HSV(Hue-Saturation-Value)是基于“人类对颜色的直观认知”设计的色彩空间,将颜色拆解为“色相、饱和度、亮度”三个维度,比RGB更符合人对“颜色描述”的习惯(如“红色、鲜艳、明亮”)。

2. 核心分量

HSV的三个通道对应人类对颜色的直观感知维度:

  • H(Hue,色相):表示颜色的“基本属性”(如红、绿、蓝),取值范围0~360°(对应色环)。0°=红色,120°=绿色,240°=蓝色,其他角度为过渡色。
  • S(Saturation,饱和度):表示颜色的“纯度/鲜艳程度”,取值范围0%~100%。0%为纯灰色(无颜色),100%为完全饱和(颜色最鲜艳)。
  • V(Value,亮度):表示颜色的“明暗程度”,取值范围0%~100%。0%为纯黑,100%为颜色最亮状态(不改变色相和饱和度)。

3. 特点与应用场景

  • 优势:颜色调整直观(如“增加红色饱和度”“调暗蓝色”),无需处理RGB通道间的耦合关系。
  • 应用:图像颜色分割(如提取特定色相的物体)、UI设计调色、图像编辑软件(如Photoshop的色相/饱和度调整)。

HSV色彩空间示意图

1.4 三种色彩空间转换

下面的代码基于C++实现三种色彩空间的数据转换:

1. 色彩空间数据结构定义

首先定义Lab、YCbCr、HSV及BGR(用于中间转换)的结构体,存储各通道数值:

#pragma once
#include <iostream>
#include <algorithm>
#include <opencv2/opencv.hpp>// Lab色彩空间结构体(float存储,精度更高)
struct Lab
{float L;  // 亮度:0~100float a;  // 绿-红轴:-128~127float b;  // 蓝-黄轴:-128~127
};// YCbCr色彩空间结构体(float存储)
struct YCbCr
{float Y;   // 亮度:16~240(数字视频标准)float Cb;  // 蓝色色差:16~240float Cr;  // 红色色差:16~240
};// HSV色彩空间结构体(h为角度,s/v为百分比)
struct HSV
{int h;      // 色相:0~359°double s;   // 饱和度:0.0~1.0(对应0%~100%)double v;   // 亮度:0.0~1.0(对应0%~100%)
};// BGR色彩空间结构体(OpenCV默认读取格式)
struct BGR
{float b;  // 蓝通道:0~255float g;  // 绿通道:0~255float r;  // 红通道:0~255
};

2. 色彩空间转换函数

实现BGR到三种色彩空间的转换,核心是通过标准数学公式计算各通道数值,需注意gamma校正、色域转换等细节(如Lab转换需先将RGB转为XYZ空间)。

(1)BGR转YCbCr

基于ITU-R BT.601标准的转换公式,直接通过RGB线性组合计算Y、Cb、Cr:

void BGR_YCbCr(BGR &bgr, YCbCr& y)
{// 标准BT.601转换公式,偏移量16使Cb/Cr范围落在16~240y.Y = 0.257 * bgr.r + 0.564 * bgr.g + 0.098 * bgr.b + 16;y.Cb = -0.148 * bgr.r - 0.291 * bgr.g + 0.439 * bgr.b + 128;y.Cr = 0.439 * bgr.r - 0.368 * bgr.g - 0.071 * bgr.b + 128;
}
(2)BGR转Lab

需经过“RGB→gamma校正→XYZ空间→Lab空间”三步,过程较复杂,需处理色域参考点(如D50光源):

void BGR_Lab(BGR &bgr, Lab& lab)
{double X, Y, Z;double Fx = 0, Fy = 0, Fz = 0;// 1. BGR归一化到0~1double b = bgr.b / 255.00;double g = bgr.g / 255.00;double r = bgr.r / 255.00;// 2. Gamma校正(sRGB标准,gamma=2.2)if (r > 0.04045)r = pow((r + 0.055) / 1.055, 2.4);elser = r / 12.92;if (g > 0.04045)g = pow((g + 0.055) / 1.055, 2.4);elseg = g / 12.92;if (b > 0.04045)b = pow((b + 0.055) / 1.055, 2.4);elseb = b / 12.92;// 3. RGB转XYZ空间(sRGB色域到CIE XYZ)X = r * 0.436052025 + g * 0.385081593 + b * 0.143087414;Y = r * 0.222491598 + g * 0.716886060 + b * 0.060621486;Z = r * 0.013929122 + g * 0.097097002 + b * 0.714185470;// XYZ范围缩放至0~100X = X * 100.000;Y = Y * 100.000;Z = Z * 100.000;// 4. XYZ转Lab(参考白点:D50光源,2度视场)double ref_X = 96.4221;  // D50光源X参考值double ref_Y = 100.000;  // D50光源Y参考值(亮度基准)double ref_Z = 82.5211;  // D50光源Z参考值X = X / ref_X;Y = Y / ref_Y;Z = Z / ref_Z;// 应用Lab转换公式(处理非线性部分)if (X > 0.008856)Fx = pow(X, 1 / 3.000);elseFx = (7.787 * X) + (16 / 116.000);if (Z > 0.008856)Fz = pow(Z, 1 / 3.000);elseFz = (7.787 * Z) + (16 / 116.000);if (Y > 0.008856){Fy = pow(Y, 1 / 3.000);lab.L = (116.000 * Fy) - 16.0 + 0.5;  // +0.5用于四舍五入}else{Fy = (7.787 * Y) + (16 / 116.000);lab.L = 903.3 * Y;}// 计算a、b通道lab.a = 500.000 * (Fx - Fy) + 0.5;lab.b = 200.000 * (Fy - Fz) + 0.5;
}
(3)BGR转HSV

通过“计算最大/最小RGB值→求亮度(V)→求饱和度(S)→求色相(H)”四步实现,需处理色相的角度循环(0~360°):

// 辅助函数:判断两个浮点数是否相等(避免精度误差)
bool IsEquals(double val1, double val2)
{return fabs(val1 - val2) < 0.001;
}void BGR_HSV(BGR& bgr, HSV& hsv)
{// 1. BGR归一化到0~1double b = bgr.b / 255.0;double g = bgr.g / 255.0;double r = bgr.r / 255.0;double h = 0, s = 0, v = 0;double min_val, max_val;double delta;  // 最大与最小RGB值的差// 2. 计算最大/最小RGB值,确定亮度Vif (r > g){max_val = std::max(r, b);min_val = std::min(g, b);}else{max_val = std::max(g, b);min_val = std::min(r, b);}v = max_val;  // 亮度V = 最大RGB值delta = max_val - min_val;// 3. 计算饱和度S(若亮度为0,饱和度为0)if (IsEquals(max_val, 0))s = 0.0;elses = delta / max_val;// 4. 计算色相H(若RGB值相等,色相为0)if (max_val == min_val)h = 0.0;else{if (IsEquals(r, max_val) && g >= b)h = 60 * (g - b) / delta + 0;      // 红→黄else if (IsEquals(r, max_val) && g < b)h = 60 * (g - b) / delta + 360;    // 红→紫else if (IsEquals(g, max_val))h = 60 * (b - r) / delta + 120;    // 绿→青else if (IsEquals(b, max_val))h = 60 * (r - g) / delta + 240;    // 蓝→紫}// 5. 处理色相范围(0~359°),并赋值给HSV结构体hsv.h = (int)(h + 0.5);  // +0.5四舍五入hsv.h = (hsv.h > 359) ? (hsv.h - 360) : hsv.h;hsv.h = (hsv.h < 0) ? (hsv.h + 360) : hsv.h;hsv.s = s;hsv.v = v;
}

1.5 总结

三种色彩空间各有侧重,选择需结合具体场景:

色彩空间核心优势典型应用场景
Lab设备无关、感知一致色彩校正、跨设备颜色匹配
YCbCr亮度/色度分离、压缩高效图像/视频压缩、数字广播
HSV调整直观、符合人类认知颜色分割、UI调色、图像编辑

更多资料:https://github.com/0voice

http://www.dtcms.com/a/499633.html

相关文章:

  • 怎么自己在电脑上做网站win2008做的网站打不开
  • 嘉兴外贸网站建网站备案号含义
  • 一个虚拟主机可以做几个网站个人网站备案填写要求
  • 通过ssh连接GitHub远程仓库
  • venv - python新手推荐的轻量化环境隔离方式
  • 网站核验单中国外包加工网
  • Ubuntu解决Github无法访问的问题
  • 关于 Qt5.11/12/15的QtCreator中对conncet宏SIGNAL不提示 的解决方法
  • C语言入门(十一)续:函数的深入认识
  • wordpress站点路径网上购物商城官网入口
  • 告别“手绘”图表:Illustrator与XD联动的数据可视化(Data Viz)工作流
  • m-card卡片组件
  • 企业内部网站建设方案怎样营销
  • 推荐一款开源的轻量级知识管理工具
  • GNU/Linux - GCC编译的静态库
  • 西安建网站哪家好企业网站蓝色模板下载
  • 成都模板建站代理网站优化要做哪些工作
  • Java MyBatis(一)--- 注解和XML的使用
  • 东莞官方网站 优帮云网站怎么做推广和优化
  • win64_11gR2_client.zip 怎么安装?Oracle 11g 客户端详细安装步骤
  • 建设向58同城的网站给客户做网站需要提供
  • flink sql 所有函数详细用例
  • Flink 1.20 flink-config.yml 配置详解
  • 湖州网站集约化平台南京做网站哪家公司好
  • 【深度学习新浪潮】2025全球机器学习技术大会:Agent技术突破与产业落地全景解析
  • 长沙整站优化梅河口信息网
  • Linux入门:动静态库的理解与加载
  • 云上救火指南:AWS常见服务告警的快速恢复与最小影响方案
  • 九号线香网站建设淘客网站后台怎么做
  • FPGA 入门 3 个月学习计划表