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

使用opencv将sRGB格式的图片转换为BT.2020格式【sRGB】【BT.2020】

将sRGB格式的图片转换为BT.2020格式涉及到两个步骤:首先将sRGB转换到线性RGB,然后将线性RGB转换到BT.2020。这是因为sRGB图像通常使用伽马校正,而BT.2020工作在线性色彩空间中。

  1. 从sRGB到线性RGB:sRGB图像首先需要进行伽马校正解码转换为线性RGB。这个过程通常不是通过一个简单的线性矩阵实现的,而是通过以下公式:

    [
    C_{linear} = \begin{cases}
    \frac{C_{sRGB}}{12.92}, & \text{if } C_{sRGB} \leq 0.04045 \
    \left(\frac{C_{sRGB} + 0.055}{1.055}\right)^{2.4}, & \text{otherwise}
    \end{cases}
    ]

    其中 (C_{linear}) 是线性RGB中的颜色分量值(红、绿、蓝),(C_{sRGB}) 是sRGB颜色空间中的对应分量值。

  2. 从线性RGB到BT.2020:接下来,您可以应用一个3x3的线性转换矩阵将线性RGB转换为BT.2020色彩空间。这个矩阵通常如下所示:

    [
    \begin{bmatrix}
    R_{BT.2020} \
    G_{BT.2020} \
    B_{BT.2020}
    \end{bmatrix}

    \begin{bmatrix}
    0.6274 & 0.3293 & 0.0433 \
    0.0691 & 0.9195 & 0.0114 \
    0.0164 & 0.0880 & 0.8956
    \end{bmatrix}
    \cdot
    \begin{bmatrix}
    R_{linear} \
    G_{linear} \
    B_{linear}
    \end{bmatrix}
    ]

在实际应用中,你首先需要编写代码将sRGB图像转换为线性RGB,然后再应用上述矩阵进行色彩空间的转换。以下是使用OpenCV在C++中实现这一过程的示例代码:
在这里插入图片描述

#include <opencv2/opencv.hpp>
#include <cmath>cv::Mat sRGBToLinearRGB(const cv::Mat& srgbImage) {cv::Mat linearRGB(srgbImage.size(), srgbImage.type());// cv::Vec3b,static_cast<uchar> 这2个要根据图片格式选择合适的值srgbImage.forEach<cv::Vec3b>([&](cv::Vec3b &pixel, const int * position) -> void {for (int i = 0; i < 3; ++i) {float c = pixel[i] / 255.0f;c = c <= 0.04045f ? c / 12.92f : std::pow((c + 0.055f) / 1.055f, 2.4f);linearRGB.at<cv::Vec3b>(position)[i] = static_cast<uchar>(std::round(c * 255.0f));}});return linearRGB;
}int main() {// 假设你已经有了一个sRGB格式的cv::Mat对象 srgbImagecv::Mat srgbImage; // 加载你的sRGB图像// 将sRGB转换为线性RGBcv::Mat linearRGB = sRGBToLinearRGB(srgbImage);// 定义从线性RGB到BT.2020的转换矩阵cv::Matx33f transformMatrix(0.6274, 0.3293, 0.0433,0.0691, 0.9195, 0.0114,0.0164, 0.0880, 0.8956);// 应用转换矩阵cv::Mat bt2020Image;cv::transform(linearRGB, bt2020Image, transformMatrix);// bt2020Image现在包含转换后的图像return 0;
}
 cv::Mat sRGBToLinearRGB(const cv::Mat& srgbImage) {cv::Mat linearRGB(srgbImage.size(), srgbImage.type());srgbImage.forEach<cv::Vec3f>([&](cv::Vec3f &pixel, const int * position) -> void {for (int i = 0; i < 3; ++i) {float c = pixel[i] / 255.0f;auto c2 = (c <= 0.04045f) ? (c / 12.92f) : std::pow((c + 0.055f) / 1.055f, 2.4f);auto val = static_cast<float>(std::round(c2 * 255.0f));qDebug() << QString("pixel[i] = %1, c1 = %2, c2 = %3, val = %4").arg(pixel[i]).arg(c).arg(c2).arg(val);linearRGB.at<cv::Vec3f>(position)[i] = val;}});return linearRGB;}cv::Mat Image_sRGB_BT2020(const cv::Mat &src){cv::Mat dst = src;// 确保使用浮点数src.convertTo(dst, CV_32F);// 将sRGB转换为线性RGBcv::Mat linearRGB = sRGBToLinearRGB(dst);// 定义从线性RGB到BT.2020的转换矩阵cv::Matx33f transformMatrix(0.6274, 0.3293, 0.0433,0.0691, 0.9195, 0.0114,0.0164, 0.0880, 0.8956);// 应用转换矩阵cv::Mat bt2020Image;cv::transform(linearRGB, bt2020Image, transformMatrix);return bt2020Image;}

相关文章:

使用opencv将sRGB格式的图片转换为BT.2020格式【sRGB】【BT.2020】

将sRGB格式的图片转换为BT.2020格式涉及到两个步骤&#xff1a;首先将sRGB转换到线性RGB&#xff0c;然后将线性RGB转换到BT.2020。这是因为sRGB图像通常使用伽马校正&#xff0c;而BT.2020工作在线性色彩空间中。 从sRGB到线性RGB&#xff1a;sRGB图像首先需要进行伽马校正解码…...

聊天注意事项

聊天成功的核心就是双方都能舒服 有些人不会聊天是缺乏引导性 聊天聊两句话就没了 聊天要把话题引导向对方 从倾诉者变为倾听者 才能不断交流 沟通不是一个人的独角戏 每个人都渴望被理解 要注意倾听别人说的话 不要只顾自己说一大堆&#xff0c;别人都瞌睡了 不要查户口式问…...

12.5 作业

1&#xff0c; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有…...

深入理解指针3

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起继续深入学习指针&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#xff01;&#xff01; 话不多说&am…...

大数据环境下在线考试系统安全策略研究

摘 要 随着云计算、物联网、电子商务、企业信息化等的飞速发展&#xff0c;以及智能终端和各种检测、感应设备的普及和建设&#xff0c;全球逐渐进入信息化、网络化&#xff0c;由此产生了指数爆炸般的数据增长&#xff0c;一个大规模生产、分享和应用的数据的时代正在开启&am…...

Python中程序的异常处理

Python程序一般对输入有一定要求&#xff0c;担当实际输入不满足程序要求时&#xff0c;可能会产生程序的运行错误。Python语言使用的保留太容易try和except进行异常处理&#xff01; try: 语句块1 except: 语句块2 语句块1是正常执行的程序内容&#xff0c;当这个语句块发生异…...

有趣的代码——有故事背景的程序设计3

这篇文章再和大家分享一些有“背景”的程序设计&#xff0c;希望能够让大家学到知识的同时&#xff0c;对编程学习更感兴趣&#xff0c;更能在这条路上坚定地走下去。 目录 1.幻方问题 2.用函数打印九九乘法表 3.鸡兔同笼问题 4.字数统计 5.简单选择排序 1.幻方问题 幻方又…...

聚观早报 |国行PS5轻薄版开售;岚图汽车11月交付7006辆

【聚观365】12月2日消息 国行PS5轻薄版开售 岚图汽车11月交付7006辆 比亚迪推出12月限时优惠 特斯拉正式交付首批Cybertruck 昆仑万维发布「天工 SkyAgents」平台 国行PS5轻薄版开售 索尼最新的PlayStation5主机&#xff08;CFI-2000型号组-轻薄版&#xff09;国行版本正…...

Kafka 保证消息消费全局顺序性

当有消息被生产出来的时候&#xff0c;如果没有指定分区或者指定 key &#xff0c;那么消费会按照【轮询】的方式均匀地分配到所有可用分区中&#xff0c;但不一定按照分区顺序来分配 我们知道&#xff0c;在 Kafka 中消费者可以订阅一个或多个主题&#xff0c;并被分配一个或多…...

3分钟在CentOS 7上离线安装Docker

在CentOS 7上离线安装Docker的详细步骤如下&#xff1a; 环境检查和准备 检查内核版本&#xff1a;Docker要求系统为64位且内核版本至少为3.10。使用命令uname -r查看内核版本。 检查CentOS版本&#xff1a;通过命令cat /etc/redhat-release查看版本信息。 更新yum包&#xff0…...

GaussDB数据库SQL系列-触发器

目录 一、前言 二、触发器概念 三、GaussDB数据库中的触发器 1、语法格式 2、创建步骤 3、注意事项 4、附&#xff1a;表和视图上支持的触发器种类 四、GaussDB数据库中的示例 示例一、在GaussDB数据库中创建一个触发器&#xff0c;以便在插入新记录时自动将记录的创建…...

网工学习10-IP地址

一、IP地址概念 IP地址是一个32位的二进制数&#xff0c;它由网络ID和主机ID两部份组成&#xff0c;用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段&#xff1b;主机ID用来标识计算机在网段中的位置。IP地址通常用4组3位十进制数表示&#xff0c;中间用…...

二百零八、Hive——HiveSQL异常:Select查询数据正常,但SQL语句加上group by查询数据为空

一、目的 在HiveSQL的DWD层中&#xff0c;需要对原始数据进行去重在内的清洗&#xff0c;结果一开始其他数据类型的清洗工作都正常&#xff0c;直到碰到转向比数据。 一般的SQL查询有数据&#xff0c;但是加上group by以后就没数据&#xff1b; 一般的SQL查询有数据&#xf…...

Docker—共享应用程序

现在您已经构建了一个映像&#xff0c;可以共享它。要共享Docker映像&#xff0c;您必须使用Docker注册表。默认注册表是Docker Hub&#xff0c;是您使用的所有图像的来源。 Docker ID&#xff08;Docker标识&#xff09; Docker ID允许您访问Docker Hub&#xff0c;这是世界上…...

Linux横向移动

Linux横向移动 主机存活探测 shell for i in 192.168.111.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i is alived; fi; done 或者 for k in $( seq 1 255);do ping -c 1 192.168.1.$k|grep "ttl"|awk -F "[ :]" {print $4}; d…...

Ubuntu 20.0 + mysql 8.0 用户和密码修改

第一步 下载&#xff08;简单,注意联网&#xff09;Ubuntu 终端输入以下两行命令 (1) 数据库的服务端及客户端数据库的开发软件包 sudo apt-get install mysql-server mysql-client (2) 数据库的开发软件包 sudo apt-get install libmysqlclient-dev 第二步 查看是否安装成功 …...

看懂lscpu的输出

文章目录 1. lscpu1.1 Architecture1.2 逻辑核心数1.3 缓存1.4 CPU型号1.5 NUMA架构1.5.1 CPU多核架构1.5.2 多CPU Socket架构 2. cat /proc/cpuinfo2.1 关键字段 1. lscpu 通过lscpu查看当前系统的CPU信息。 [hadoopserver3 ~]$ lscpuArchitecture: x86_64 …...

RoPE旋转位置编码浅析

RoPE旋转位置编码浅析 本文介绍了旋转位置编码RoPE在大模型中的广泛应用,包括Llama、Mistral 7B、Baichuan、ChatGLM、Qwen、…等。由于计算资源限制,大模型通常在较小的上下文长度中进行训练,导致在推理超出预训练长度时性能显著下降。为了解决这个问题,涌现了许多基于Ro…...

在 SQL Server 中备份和恢复数据库的最佳方法

在SQL Server中&#xff0c;创建备份和执行还原操作对于确保数据完整性、灾难恢复和数据库维护至关重要。以下是备份和恢复过程的概述&#xff1a; 方法 1. 使用 SQL Server Management Studio (SSMS) 备份和还原数据库 按照 SSMS 步骤备份 SQL 数据库 打开 SSMS 并连接到您…...

Java8 根据自定义属性去重

一、需求背景 有一个List集合,里面有n个Answer成员,成员种有m个属性,即: List<Answer> answers ...,现在我需要根据Answer的某一个属性对List去重(属性不固定),应该如何实现呢? 二、解决办法 需要满足上述需求&#xff0c;并不难&#xff0c;我们可以使用Java8提供的…...

在Node.js后端服务中集成Taotoken调用多模型API实战

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Node.js后端服务中集成Taotoken调用多模型API实战 构建需要AI能力的Web服务时&#xff0c;后端开发者常面临模型选型、API接入复…...

《凰标》:写给所有被资本轻视的创作者@凤凰标志

——写给所有不被看见的创作者没有流量即是无用&#xff0c; 没有热度即是不值&#xff0c; 没有商业变现能力即是小众累赘。在资本主导的文娱评价体系里&#xff0c;这条偏见像一道隐形天花板&#xff0c;横亘在每一个草根创作者的头顶。一、被算法淹没的匠心 他们怀揣赤诚热爱…...

前端八股文面经大全:上海威派格前端实习(2026-05-07)·面经深度解析

前言 大家好&#xff0c;我是木斯佳。 相信很多人都感受到了&#xff0c;在AI浪潮的席卷之下&#xff0c;前端领域的门槛在变高&#xff0c;纯粹的“增删改查”岗位正在肉眼可见地减少。曾经热闹非凡的面经分享&#xff0c;如今也沉寂了许多。但我们都知道&#xff0c;市场的…...

开源密钥管理器VSV:一个加密文件搞定多环境密钥管理

1. 项目概述&#xff1a;一个面向开发者的加密密钥管理器最近在折腾一个内部项目&#xff0c;需要管理不同环境&#xff08;开发、测试、生产&#xff09;的数据库密码、API密钥这些敏感信息。一开始图省事&#xff0c;直接写在了.env文件里&#xff0c;结果在代码评审时被同事…...

AI编程助手效率革命:结构化配置与提示词工程实战

1. 项目概述&#xff1a;一个为AI编程时代量身定制的开发者工具箱如果你和我一样&#xff0c;日常开发已经离不开像 Cursor 和 Claude 这样的 AI 编程助手&#xff0c;那你肯定也遇到过类似的困扰&#xff1a;每次开启一个新项目&#xff0c;或者在不同项目间切换时&#xff0c…...

JPlag代码抄袭检测:17种编程语言的智能原创守护者

JPlag代码抄袭检测&#xff1a;17种编程语言的智能原创守护者 【免费下载链接】JPlag State-of-the-Art Source Code Plagiarism & Collusion Detection. Check for plagiarism in a set of programs. 项目地址: https://gitcode.com/gh_mirrors/jp/JPlag 在数字化教…...

RAD-NeRF:面向实时人像合成的神经辐射场高效架构

1. 项目概述&#xff1a;当NeRF遇上实时人像&#xff0c;RAD-NeRF到底在解决什么问题&#xff1f;我第一次看到“Efficient NeRFs for Real-Time Portrait Synthesis (RAD-NeRF)”这个标题时&#xff0c;手边正调试一个跑在RTX 4090上的标准NeRF模型——单帧渲染耗时23秒&#…...

VLC源码深度定制:3大核心模块解析与编译实践

VLC源码深度定制&#xff1a;3大核心模块解析与编译实践 【免费下载链接】vlc VLC media player - All pull requests are ignored, please use MRs on https://code.videolan.org/videolan/vlc 项目地址: https://gitcode.com/gh_mirrors/vl/vlc 你是否曾想过&#xff…...

构建自我进化的AI家园:基于多智能体与GitOps的工程实践

1. 项目概述&#xff1a;构建一个能自我进化的AI家园如果你和我一样&#xff0c;对那种“一问一答”式的AI聊天机器人感到厌倦&#xff0c;总想着能不能让AI更“主动”一点&#xff0c;甚至能帮你打理整个技术栈&#xff0c;那么这个项目绝对值得你花时间研究。ai-homebase不是…...

Baetyl开源社区贡献指南:如何参与边缘计算框架的代码与文档开发

Baetyl开源社区贡献指南&#xff1a;如何参与边缘计算框架的代码与文档开发 【免费下载链接】baetyl Extend cloud computing, data and service seamlessly to edge devices. 项目地址: https://gitcode.com/gh_mirrors/ba/baetyl 欢迎来到Baetyl开源边缘计算框架的贡献…...