项目场景:

提示:在颜色科学中,LCh和Lab是比较常用的

LCh是由MATLAB计算出的数据,但是我所需要在Qt的q3dsurface绘制出这个切面,看了Qt官方Examples,墨西哥草帽算法的3D模型就是由XYZ组成的。所以我需要LCh->Lab->XYZ,这三步的转换。


LCh、Lab、XYZ概念

  • LCh
    CIELCh颜色空间用于描述颜色的亮度、色度和色相。
    CIELCh颜色空间相比CIELAB颜色空间更加直观,它以极坐标形式表示颜色属性,更适合描述颜色的外观特征和感知属性。
    Lightness(L)指的是颜色的明暗程度或亮度级别。它表示颜色相对于中性灰色的明暗程度,取值范围通常为0到100。较低的亮度值接近黑色,较高的亮度值接近白色。
    Chroma(C)表示颜色的饱和度或色彩的强度。它衡量的是颜色相对于中性灰色的纯度或饱和度。较低的色度值表示颜色较暗或接近灰色,而较高的色度值表示颜色鲜艳、饱和度较高。
    Hue表示色相(h),取值范围为0到360度,表示颜色在色轮上的位置。

  • Lab
    CIELAB颜色空间是通过对人眼对不同光谱刺激的感知进行数学建模而得到的。
    L表示亮度(Lightness),取值范围为0到100,表示从黑到白的亮度级别。
    a表示颜色在红绿轴上的位置,取值范围为-128到+127,其中负值表示绿色,正值表示红色。
    b表示颜色在黄蓝轴上的位置,取值范围为-128到+127,其中负值表示蓝色,正值表示黄色。

  • XYZ
    X表示颜色在红-绿轴上的位置。
    Y表示颜色在亮度轴上的位置。
    Z表示颜色在黄-蓝轴上的位置。


LCh转Lab

  1. 获取LCh颜色空间中的L、Chroma和Hue分量的值。
  2. 计算Lab颜色空间中的a和b分量,可以使用以下公式:a = Chroma * cos(Hue),b = Chroma * sin(Hue)。
  3. 最终的Lab颜色空间中的分量为L、a和b。

CIELab颜色空间中的三个分量对应于3D坐标空间中的以下轴
L(亮度):对应于Y轴,表示颜色的明暗程度。
a(红绿):对应于X轴,表示颜色在红色和绿色之间的位置。
b(黄蓝):对应于Z轴,表示颜色在黄色和蓝色之间的位置。

#include <cmath>void LChToLab(double L, double Chroma, double Hue, double& Lab_L, double& Lab_a, double& Lab_b)
{Lab_a = Chroma * std::cos(Hue);Lab_b = Chroma * std::sin(Hue);Lab_L = L;
}

L表示LCh颜色空间中的亮度分量,Chroma表示色度分量,Hue表示色相分量。通过调用该函数并传入LCh颜色的分量值,即可获得对应的Lab颜色空间中的L、a和b分量的值


Lab转XYZ

  1. 获取Lab颜色空间中的L、a和b分量的值。
  2. 将Lab中的L、a和b分量进行逆变换,得到对应的线性RGB颜色空间中的R、G和B分量。这可以通过使用Lab到XYZ转换矩阵来实现。
  3. 将线性RGB颜色空间中的R、G和B分量进行非线性校正,以获得标准化的RGB值。
  4. 将标准化的RGB值转换为XYZ颜色空间中的X、Y和Z分量,也可以通过使用RGB到XYZ转换矩阵来实现。
  5. 再转成sRGB。
void LabToXYZ(double Lab_L, double Lab_a, double Lab_b, double& XYZ_X, double& XYZ_Y, double& XYZ_Z)
{// Lab到XYZ转换矩阵double Xr = 0.95047;double Yr = 1.00000;double Zr = 1.08883;double fy = (Lab_L + 16.0) / 116.0;double fx = fy + (Lab_a / 500.0);double fz = fy - (Lab_b / 200.0);double xr = (std::pow(fx, 3.0) > 0.008856) ? std::pow(fx, 3.0) : ((fx - 16.0 / 116.0) / 7.787);double yr = (Lab_L > (903.3 * 0.008856)) ? std::pow((Lab_L + 16.0) / 116.0, 3.0) : (Lab_L / 903.3);double zr = (std::pow(fz, 3.0) > 0.008856) ? std::pow(fz, 3.0) : ((fz - 16.0 / 116.0) / 7.787);XYZ_X = xr * Xr;XYZ_Y = yr * Yr;XYZ_Z = zr * Zr;
}

在函数中,Lab_L、Lab_a和Lab_b分别表示Lab颜色空间中的L、a和b分量的值。通过调用该函数并传入Lab颜色的分量值,即可获得对应的XYZ颜色空间中的X、Y和Z分量的值。请注意,示例中的转换矩阵参数(Xr、Yr和Zr)是用于D65标准光源的参数,你可以根据需要调整它们以适应不同的光源。

Demo

#include <iostream>
#include <vector>
#include <cmath>struct Lab {int L;int a;int b;
};struct XYZ {int X;int Y;int Z;
};XYZ convertLabtoXYZ(const Lab& lab)
{double L = lab.L / 100.0;double a = (lab.a - 128) / 127.0;double b = (lab.b - 128) / 127.0;double X = 0.95047 * pow(((L + 0.16) / 1.16), 3.0);double Y = 1.00000 * pow(((L + 0.16) / 1.16), 3.0);double Z = 1.08883 * pow(((L + 0.16) / 1.16), 3.0);X = X + (0.43607 * a) - (0.39894 * b);Y = Y - (0.00003 * a) + (0.03951 * b);Z = Z + (0.00816 * a) + (0.01388 * b);XYZ xyz;xyz.X = static_cast<int>(X * 100);xyz.Y = static_cast<int>(Y * 100);xyz.Z = static_cast<int>(Z * 100);return xyz;
}int main()
{// 示例使用int N = 3;std::vector<Lab> labValues(N);std::vector<XYZ> xyzValues(N);// 假设输入的LAB值labValues[0] = {50, 0, 0};labValues[1] = {75, 30, -40};labValues[2] = {90, -10, 20};// 将每个LAB值转换为XYZ值for (int i = 0; i < N; ++i) {xyzValues[i] = convertLabtoXYZ(labValues[i]);}// 打印转换后的XYZ值for (int i = 0; i < N; ++i) {XYZ xyz = xyzValues[i];std::cout << "Lab: L=" << labValues[i].L << ", a=" << labValues[i].a << ", b=" << labValues[i].b<< " -> XYZ: X=" << xyz.X << ", Y=" << xyz.Y << ", Z=" << xyz.Z << std::endl;}return 0;
}

这边举了3组数据进行计算。

完结撒花,球球一件三联噢,这真的对我很重要

CIE颜色空间LCh、Lab、XYZ-sRGB介绍与转换关系(包含源码)相关推荐

  1. 一款好看的HTML介绍页、引导页源码

    一款好看的个人极简介绍页.引导页源码,图标引用的是阿里巴巴矢量图标库,可引入自己的图标项目更换. 地图引入了高德的map lab 数据可视化,可用来做足迹,记录去过的地方. 页面信息修改都在index ...

  2. aircrack-ng 介绍、功能测试及部分源码分析

    aircrack-ng 介绍.功能测试及部分源码分析 [实验目的] 1.理清aircrack-ng的总体设计框架,包括各模块的功能与联系: 2.核心模块的实现原理(aircrack-ng.airepl ...

  3. 漂亮大气VIP会员介绍页面 html单页源码无需数据库

    介绍: 扒的某站漂亮大气VIP会员介绍页面 html单页源码无需数据库 源码下载地址:扒的某站漂亮大气VIP会员介绍页面 html单页源码无需数据库.zip - 蓝奏云https://qumaw.la ...

  4. 日志组件Log2Net的介绍和使用(附源码开源地址)

    Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...

  5. Java 通用代码生成器光 2.3.0 文明 Beta10 版发布介绍视频,支持从源码构建

    Java 通用代码生成器光 2.3.0 文明 Beta10 版发布介绍视频,支持从源码构建 Java 通用代码生成器光 2.3.0 文明 Beta10 版发布最新介绍视频,详细介绍 java 通用代码 ...

  6. RoI Pooling 系列方法介绍(文末附源码)

    作者简介 CW,广东深圳人,毕业于中山大学(SYSU)数据科学与计算机学院,毕业后就业于腾讯计算机系统有限公司技术工程与事业群(TEG)从事Devops工作,期间在AI LAB实习过,实操过道路交通元 ...

  7. kcp 介绍与源代码分析_KCP-GO源码解析

    原标题:KCP-GO源码解析 原文作者:张伯雨 golang技术社区 概念 ARQ:自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一. ...

  8. 卷积神经网络CNN介绍:结构框架,源码理解【转】

    1. 卷积神经网络结构 卷积神经网络是一个多层的神经网络,每层都是一个变换(映射),常用卷积convention变换和pooling池化变换,每种变换都是对输入数据的一种处理,是输入特征的另一种特征表 ...

  9. 个人介绍静态网页【附源码】初学者的期中作业

    文章目录 前言 一.环境及目录 二.页面概览 ①主页页面 ②读书页面 ③关于页面 三.页面主要代码 ①主页页面 ②读书页面 ③关于页面 总结 前言 一个简单的网页作业 至少包含3个页面 网页内容有音频 ...

最新文章

  1. R假设检验之Jarque-Bera检验(Jarque-Bera Test)
  2. php正则运用,php中常用的正则表达式的介绍及应用实例代码
  3. 【ESSD技术解读】 云原生时代,阿里云块存储 ESSD 快照服务如何被企业级数据保护所集成?
  4. ee2prom擦除 c语言,浮点数在E2PROM中的存取方法.doc
  5. Linux 字符设备驱动开发基础(三)—— read()、write() 相关函数解析
  6. C语言购物篮解题思路,大型超购物篮问题分析数学建模.doc
  7. 如何接受上级指令_与上级沟通的技巧
  8. String的创建和常量池的关系,intern()相关问题
  9. xsd文件规则和语法
  10. 华为内部经典项目管理体系
  11. linux添加变色龙引导,变色龙Chameleon Install 2281引导工具 windows电脑安装黑苹果
  12. JN5169 ZigBee 3.0 协议栈之 ZigBee 网络参数
  13. UVC Extension Unit 相关资料整理
  14. 设计模式(二)--策略模式
  15. 爬壁机器人外文文献_仿生爬壁机器人的研究现状
  16. oppoAndroid面试题,retrofit解析
  17. 开发落网电台windows phone 8应用的计划(1)
  18. WebRTC实现多人视频聊天之信令服务器设计
  19. 36.笔记go语言——函数
  20. 用js制作游戏:扫雷,源代码

热门文章

  1. 传华为将抢先苹果首发卫星通信 ;1200亿亿次每秒,阿里上线世界第一智算中心;wxPython团队辟谣已死传闻|极客头条
  2. Zabbix监控服务安装部署
  3. 关于二战群里早早提出的一道我尝试了7种途径未有结果的反常积分(利用等比来展开,代换)
  4. oracle数据文件全部丢失,oracle 数据文件,控制文件和参数文件全部丢失恢复
  5. gazebo教程---使用gazebo插件
  6. 有哪些网站值得用python爬虫获取很有价值的数据
  7. [论文笔记]Graph Cube: 基于数据仓库和OLAP多维网络
  8. 路由器的功能和特点是什么
  9. Linux_Linux查看某个进程下面的线程
  10. 【Oracle】使用DataGrip连接Oracle数据库