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

使用opencv将sRGB格式的图片转换为DCI-P3格式【sRGB】【DCI-P3】

要将图像从 sRGB 格式转换为 DCI-P3 格式,您需要使用适当的线性转换矩阵。在 OpenCV 中,这通常涉及使用色彩转换函数,但 OpenCV 默认情况下不直接支持 sRGB 到 DCI-P3 的转换。因此,您需要手动计算并应用转换矩阵。

转换矩阵取决于两个色彩空间的原色和白点坐标。首先,您需要获取这两个色彩空间的色度坐标:

  • sRGB 色彩空间的原色坐标。
  • DCI-P3 色彩空间的原色坐标。

然后,您需要计算从 sRGB 到 XYZ 色彩空间的转换矩阵,以及从 XYZ 到 DCI-P3 的转换矩阵。最后,通过将这两个矩阵相乘,可以得到直接从 sRGB 到 DCI-P3 的转换矩阵。

这些矩阵的计算涉及一些复杂的线性代数运算。下面是这个过程的简化版本:

  1. 计算 sRGB 到 XYZ 的转换矩阵:这需要 sRGB 的原色和白点坐标。

  2. 计算 XYZ 到 DCI-P3 的转换矩阵:这需要 DCI-P3 的原色和白点坐标。

  3. 合并这两个矩阵:通过矩阵乘法,您可以获得一个直接从 sRGB 到 DCI-P3 的转换矩阵。

在 OpenCV 中应用这个转换矩阵:

#include <opencv2/opencv.hpp>cv::Mat convert_sRGB_to_DCIP3(const cv::Mat& src) {// 定义转换矩阵cv::Matx33f transformMatrix = {/* 这里填写计算得到的矩阵 */};cv::Mat dst;src.convertTo(dst, CV_32F); // 确保使用浮点数cv::transform(dst, dst, transformMatrix);return dst;
}int main() {cv::Mat sRGB_image = cv::imread("path_to_sRGB_image.jpg");cv::Mat DCIP3_image = convert_sRGB_to_DCIP3(sRGB_image);// 保存或处理转换后的图像
}

请注意,这段代码中的转换矩阵需要您根据具体的色彩空间参数进行计算和填写。这通常涉及色彩科学的知识,并且可能需要调整以满足您的精确需求。

要计算从 sRGB 到 DCI-P3 的转换矩阵,我们需要遵循以下步骤:

  1. 定义色彩空间的原色坐标和白点:sRGB 和 DCI-P3 色彩空间的原色(红、绿、蓝)坐标和白点坐标是已知的。

  2. 计算转换矩阵:首先,计算从 sRGB 到 CIE 1931 XYZ 色彩空间的转换矩阵,然后计算从 XYZ 到 DCI-P3 的转换矩阵。最后,将这两个矩阵相乘得到从 sRGB 直接到 DCI-P3 的转换矩阵。

sRGB 到 XYZ

sRGB 色彩空间的原色坐标和 D65 白点(x=0.3127, y=0.3290)可以用来计算 sRGB 到 XYZ 的转换矩阵。sRGB 到 XYZ 的标准转换矩阵通常如下所示:

[ 0.4124564  0.3575761  0.1804375 ]
[ 0.2126729  0.7151522  0.0721750 ]
[ 0.0193339  0.1191920  0.9503041 ]

XYZ 到 DCI-P3

DCI-P3 色彩空间的原色坐标和 D65 白点可以用来计算 XYZ 到 DCI-P3 的转换矩阵。DCI-P3 的原色坐标大致为:

  • 红色:(0.680, 0.320)
  • 绿色:(0.265, 0.690)
  • 蓝色:(0.150, 0.060)

使用这些坐标,您可以计算 XYZ 到 DCI-P3 的转换矩阵。这个计算相对复杂,涉及线性代数中的矩阵运算。

合并矩阵

最后,通过将 sRGB 到 XYZ 的矩阵与 XYZ 到 DCI-P3 的矩阵相乘,可以得到直接从 sRGB 到 DCI-P3 的转换矩阵。

由于这些计算相当复杂且超出了简单文本回复的范围,我建议使用专门的色彩管理软件或库来进行这些转换,或者在专业的色彩科学文献中查找已经计算好的转换矩阵。在实际应用中,这些转换通常涉及色彩管理系统(CMS),如 ICC 配置文件,以确保精确和一致的颜色再现。

要直接给出从 CIE 1931 XYZ 色彩空间到 DCI-P3 色彩空间的转换矩阵,我们需要使用 DCI-P3 色彩空间的原色坐标。假设我们使用 D65 白点(这是最常见的情况),DCI-P3 的原色坐标大致为:

  • 红色:(0.680, 0.320)
  • 绿色:(0.265, 0.690)
  • 蓝色:(0.150, 0.060)

使用这些坐标,我们可以构建一个从 XYZ 到 DCI-P3 的转换矩阵。这个过程涉及计算一个将这些原色坐标映射到 XYZ 轴的矩阵,然后将其逆转换应用于 XYZ 数据。

转换矩阵可以通过以下步骤计算得出:

  1. 构建原色坐标矩阵:使用 DCI-P3 的原色坐标构建一个矩阵。

  2. 计算白点适应:使用 D65 白点坐标进行白点适应。

  3. 计算逆矩阵:计算上述矩阵的逆矩阵,以便可以将其应用于 XYZ 数据。

基于上述坐标,转换矩阵(从 XYZ 到 DCI-P3)大致为:

[ 2.493496911941425   -0.9313836179191239  -0.40271078445071684 ]
[-0.8294889695615747   1.7626640603183463   0.023624685841943577]
[ 0.03584583024378447 -0.07617238926804182  0.9568845240076872  ]

请注意,这个矩阵是基于标准的原色坐标和 D65 白点计算得出的,但实际应用中可能会有所不同,具体取决于您的具体需求和使用的色彩管理系统。在实际应用这个矩阵之前,建议进行彻底的测试和验证,以确保颜色的准确转换。

bool ConvertImageFormat(const std::string &originPath,const std::string &targetPath, ImageFormat format){// 瀹氫箟sRGB鍒癤YZ鐨勮浆鎹㈢煩闃?cv::Mat sRGBToXYZ = (cv::Mat_<double>(3,3) <<0.4124564, 0.3575761, 0.1804375,0.2126729, 0.7151522, 0.0721750,0.0193339, 0.1191920, 0.9503041);static const std::vector<cv::Mat> MATRIX_ARR = {// IMAGE_DCI_P3(cv::Mat_<double>(3,3) <<2.493496911941425, -0.9313836179191239, -0.40271078445071684,-0.8294889695615747, 1.7626640603183463,  0.023624685841943577,0.03584583024378447, -0.07617238926804182, 0.9568845240076872),// IMAGE_BT_2020(cv::Mat_<double>(3,3) <<1.7166512, -0.3556708, -0.2533663,-0.6666844, 1.6164812, 0.0157685,0.0176399, -0.0427706, 0.9421031),// IMAGE_ADOBE_RGB(cv::Mat_<double>(3,3) <<2.0413690, -0.5649464, -0.3446944,-0.9692660, 1.8760108, 0.0415560,0.0134474, -0.1183897, 1.0154096),};Mat img = cv::imread(originPath);if (img.empty() == true) {return false;}switch (format) {case IMAGE_SRGB:cv::imwrite(targetPath, img);break;case IMAGE_DCI_P3:case IMAGE_BT_2020:case IMAGE_ADOBE_RGB:{Mat imgXYZ;// 灏唖RGB鍥惧儚杞崲涓篨YZcv::transform(img, imgXYZ, sRGBToXYZ);Mat imgRet;cv::transform(imgXYZ, imgRet, MATRIX_ARR[format - 1]);cv::imwrite(targetPath, imgRet);}break;default:return false;break;}return true;}

相关文章:

使用opencv将sRGB格式的图片转换为DCI-P3格式【sRGB】【DCI-P3】

要将图像从 sRGB 格式转换为 DCI-P3 格式&#xff0c;您需要使用适当的线性转换矩阵。在 OpenCV 中&#xff0c;这通常涉及使用色彩转换函数&#xff0c;但 OpenCV 默认情况下不直接支持 sRGB 到 DCI-P3 的转换。因此&#xff0c;您需要手动计算并应用转换矩阵。 转换矩阵取决…...

【协议设计与实现】Linux环境下,如何从0开始设计并实现一个网络协议之一——需要考虑的因素

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;TCP/IP协议&…...

【前端】JS实现SQL格式化

sqlFormatter sql-formatter - npm (npmjs.com) const sqlFormatter require(/utils/sqlFormatter)let sql select count(1) as cnt from t_user where id < 7;// 格式化 // let sqlF sqlFormatter.format(sql);let sqlF sqlFormatter.format(sql, {language:mysql,})…...

java设计模式学习之【工厂模式】

文章目录 引言工厂方法模式简介定义与用途&#xff1a;实现方式&#xff1a; 使用场景优势与劣势工厂模式在spring中的应用电费计算示例&#xff08;简单工厂模式&#xff09;改善为方法工厂模式代码地址 引言 在软件开发的世界中&#xff0c;对象的创建可能是一个复杂且重复的…...

android 内存分析(待续)

/proc/meminfo memory状态解读 命令&#xff1a;adb shell cat /proc/meminfo内存分布log 查看方式 命令&#xff1a;adb shell cat /proc/meminfo 用途:可以整体的了解memory使用情况 我们说的可用memory一般以MemAvailable的数据为准。所以了解MemAvailable的组成可以帮助…...

2023-简单点-机器学习中的数值计算问题

上溢和下溢&#xff1a; 上溢&#xff1a;指数函数或对数函数的输入值过大&#xff0c;导致计算结果超出了计算机可以表示的最大值。例如&#xff0c;在softmax函数中&#xff0c;当输入的数值很大时&#xff0c;指数运算的结果可能非常大&#xff0c;导致上溢。 下溢&#x…...

Qt5的事件处理函数有哪些?

2023年11月29日&#xff0c;周三上午 通过查看QWidget的定义可知&#xff0c;事件处理函数有&#xff1a; bool event(QEvent *event) override;virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *event);virtual void mouseDou…...

Jmeter性能综合实战——签到及批量签到

提取性能测试的三个方面&#xff1a;核心、高频、基础功能 签 到 请 求 步 骤 1、准备工作&#xff1a; 签到线程组 n HTTP请求默认值 n HTTP cookie 管理器 n 首页访问请求 n 登录请求 n 查看结果树 n 调试取样器 l HTTP代理服务器 &#xff08;1&#xff09;创建线…...

04 # 第一个 TypeScript 程序

初始化项目以及安装依赖 新建 ts_in_action 文件夾 npm init -y安装好 typescript&#xff0c;就可以执行下面命令查看帮助信息 npm i typescript -g tsc -h创建配置文件&#xff0c;执行下面命令就会生成一个 tsconfig.json 文件 tsc --init使用 tsc 编译一个 js 文件 新…...

Android gradle 配置阿里镜像

要在Android Gradle中配置阿里镜像&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开项目中的 build.gradle 文件。 在 build.gradle 文件中添加阿里镜像的地址&#xff0c;如下所示&#xff1a; buildscript {repositories {maven { url https://maven.aliyun.com/re…...

Arduino驱动DHT20温湿度传感器(温湿度传感器)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 DHT20温湿度传感器是DHT11的全新升级版。 DHT20采用全新的ASIC专用芯片、改进的MEMS半导体电容式湿度传感器元件和标准片上温度元件。所有传感器均经过工厂校准,具有低功耗、高精度和稳定性、响应…...

如何使用ArcGIS Pro制作一张北极俯视地图

地图的表现形式有很多种&#xff0c;经常我们看到的地图是以大西洋为中心的地图&#xff0c;还有以太平洋为中心的地图&#xff0c;今天要给大家介绍的地图是从北极上方俯视看的地图&#xff0c;这里给大家讲解一下制作方法&#xff0c;希望能对你有所帮助。 修改坐标系 制作…...

每天五分钟计算机视觉:经典架构的力量与启示

在深度学习和计算机视觉领域,卷积神经网络(Convolutional Neural Networks,简称CNN)无疑是最为经典的架构之一。近年来,随着研究的不断深入和新架构的不断涌现,许多初学者可能会忽视这些经典架构的重要性。然而,理解并学习这些经典架构,对于我们深入理解卷积神经网络的…...

element plus 使用细节

菜鸟一直在纠结这个写不写&#xff0c;因为不难&#xff0c;但是菜鸟老是容易忘记&#xff0c;虽然想想或者搜搜就可以马上写出来&#xff0c;但是感觉每次那样就太麻烦了&#xff0c;不如一股做气写了算了&#xff0c;后面遇见别的就再来补充&#xff01; 文章目录 table 表格…...

分析:为什么有些pdf打开之后无法编辑?

pdf文件大家应该都经常接触&#xff0c;但是不知道大家会遇到这种情况&#xff1a;有些PDF文件打开之后无法编辑&#xff1f;是什么原因呢&#xff1f;今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下&#xff0c;PDF文件中的内容是否是图片&#xff0c;如果确认…...

Django请求生命周期流程

浏览器发起请求。 先经过网关接口&#xff0c;Django自带的是wsgiref&#xff0c;请求来的时候解析封装&#xff0c;响应走的时候打包处理&#xff0c;这个wsgiref模块本身能够支持的并发量很少&#xff0c;最多1000左右&#xff0c;上线之后会换成uwsgi&#xff0c;并且还会加…...

C++学习 --string

目录 1&#xff0c; 什么是string 2&#xff0c; 创建string 3&#xff0c; 操作string 3-1&#xff0c; 赋值 3-1-1&#xff0c; 赋值() 3-1-1&#xff0c; 赋值(assign) 3-2&#xff0c; 修改 3-2-1&#xff0c; 拼接 3-2-1-1&#xff0c; 拼接() 3-2-1-2&#xff…...

Spark SQL,DF,RDD cache常用方式

RDD中的cache 调用cache方法 val testRDD sc.parallelize(Seq(elementA, elementB, elementC)).map(x > (x._1, x._2)).setName("testRDD")testRDD.cache() dataframe中的cache 利用catalog以表的形式对数据进行缓存 import org.apache.spark.SparkConf impo…...

Python中如何用栈实现队列

目录 一、引言 二、使用两个栈实现队列 三、性能分析 四、应用场景 五、代码示例 六、优缺点总结 一、引言 队列&#xff08;Queue&#xff09;和栈&#xff08;Stack&#xff09;是计算机科学中常用的数据结构。队列是一种特殊的线性表&#xff0c;只允许在表的前端进行…...

python模块pyDes,DES对称加密算法库

一、简介 pyDes是一个Python模块&#xff0c;用于进行DES&#xff08;Data Encryption Standard&#xff09;加密和解密操作。DES是一种对称密钥加密算法&#xff0c;广泛用于数据保密和传输。 优点&#xff1a; 1.简单易用&#xff1a;pyDes模块提供了简单的接口&#xff0c;…...

Jetson Orin Nano 升级jetpack5.1.2刷机过程记录

一.刷机起因 orin nano 接了个IMX477的摄像头,用 命令行DISPLAY:0.0 nvgstcapture-1.0 显示的画面有撕裂,让卖家查问题,卖家测试没有撕裂,对比环境,orin nano出厂默认的是jetpack5.1.1,卖家用的jetpack5.1.2版本,为了解决差异,要升级jetpack版本,前后搞了2天半,记录一下. 另外…...

Kerberos身份认证原理与企业级排错实战指南

1. 这不是“另一个登录框”&#xff0c;而是一套精密运转的身份验证齿轮系统很多人第一次听说 Kerberos&#xff0c;是在公司内网登录邮箱或访问内部系统时&#xff0c;看到那个带小盾牌图标的弹窗——“正在使用 Kerberos 协议进行身份验证”。于是下意识觉得&#xff1a;“哦…...

机器学习结合基因无关通路映射:从临床数据挖掘新药靶点

1. 项目概述&#xff1a;当机器学习遇见代谢通路&#xff0c;如何从数据中“挖”出新药靶点&#xff1f;在生物医学研究的前沿&#xff0c;我们正面临一个核心矛盾&#xff1a;一方面&#xff0c;我们拥有海量的临床数据&#xff0c;比如血糖、血压、BMI等指标&#xff1b;另一…...

IPD的势、道、法、术、器

目录 简介 一、势&#xff1a;为什么 IPD 是必然选择&#xff1f; 二、道&#xff1a;IPD 的底层哲学 三、法与术&#xff1a;从战略到执行的具体路径 四、器&#xff1a;让流程真正落地的工具与组织 不是每家公司都需要全套 IPD&#xff0c;但每家公司都需要 IPD 思维 简…...

智能手机相机光谱特性测量与多光谱成像技术

1. 智能手机相机光谱特性测量基础智能手机相机的光谱灵敏度函数(Spectral Sensitivity Function, SSF)和透射率函数是计算摄影领域的核心参数&#xff0c;它们决定了设备对光信号的响应特性。准确获取这些参数对色彩还原、光谱重建和白平衡校准等任务至关重要。1.1 光谱灵敏度函…...

番茄小说下载器终极指南:三步构建你的离线阅读自由王国

番茄小说下载器终极指南&#xff1a;三步构建你的离线阅读自由王国 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾在地铁里读到精彩章节时突然断网&#xff1f;是否在…...

ARM架构CONSTRAINED UNPREDICTABLE行为解析与应对

1. ARM架构中的CONSTRAINED UNPREDICTABLE行为解析在处理器架构设计中&#xff0c;UNPREDICTABLE行为通常指架构规范未明确定义的执行结果&#xff0c;可能导致不可预期的系统状态。ARM架构通过引入CONSTRAINED UNPREDICTABLE机制&#xff0c;将这类行为限制在特定范围内&#…...

千亿镁合金产业集群正在成形:成都、抚州、池州的新版图

一个新赛道的地理坐标 如果要在中国地图上标注一条正在成形的新兴产业集群走廊&#xff0c;高强镁合金这条线&#xff0c;值得被认真画出来。 成都龙泉驿——江西抚州临川——安徽池州高新区&#xff0c;三个坐标&#xff0c;三条生产线&#xff0c;一家公司&#xff0c;两年内…...

从CTF题看RSA安全:为什么你的密钥不能‘共享素数’?

从CTF实战看RSA密钥安全&#xff1a;那些年我们踩过的坑 在网络安全竞赛和实际渗透测试中&#xff0c;RSA算法的错误实现方式往往成为突破的关键点。本文将通过典型CTF赛题案例&#xff0c;揭示五种常见RSA实现漏洞背后的数学原理和安全启示&#xff0c;帮助开发者在实际项目中…...

电子商务设计师软考备战:特别篇 - 综合模拟与备考策略

1. 考试形式与内容结构1.1 考试基本信息考试科目与时间基础知识考试&#xff1a;上午9:00-11:30&#xff08;150分钟&#xff09;应用技术考试&#xff1a;下午2:00-4:30&#xff08;150分钟&#xff09;题型与分值分布上午考试&#xff08;基础知识&#xff09;&#xff1a; -…...