使用opencv将sRGB格式的图片转换为BT.2020格式【sRGB】【BT.2020】
将sRGB格式的图片转换为BT.2020格式涉及到两个步骤:首先将sRGB转换到线性RGB,然后将线性RGB转换到BT.2020。这是因为sRGB图像通常使用伽马校正,而BT.2020工作在线性色彩空间中。
-
从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颜色空间中的对应分量值。
-
从线性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格式涉及到两个步骤:首先将sRGB转换到线性RGB,然后将线性RGB转换到BT.2020。这是因为sRGB图像通常使用伽马校正,而BT.2020工作在线性色彩空间中。 从sRGB到线性RGB:sRGB图像首先需要进行伽马校正解码…...
聊天注意事项
聊天成功的核心就是双方都能舒服 有些人不会聊天是缺乏引导性 聊天聊两句话就没了 聊天要把话题引导向对方 从倾诉者变为倾听者 才能不断交流 沟通不是一个人的独角戏 每个人都渴望被理解 要注意倾听别人说的话 不要只顾自己说一大堆,别人都瞌睡了 不要查户口式问…...
12.5 作业
1, 以下是一个简单的比喻,将多态概念与生活中的实际情况相联系: 比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有…...
深入理解指针3
hello,各位小伙伴,本篇文章跟大家一起继续深入学习指针,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 如果本篇文章对你有帮助,还请各位点点赞!!! 话不多说&am…...
大数据环境下在线考试系统安全策略研究
摘 要 随着云计算、物联网、电子商务、企业信息化等的飞速发展,以及智能终端和各种检测、感应设备的普及和建设,全球逐渐进入信息化、网络化,由此产生了指数爆炸般的数据增长,一个大规模生产、分享和应用的数据的时代正在开启&am…...
Python中程序的异常处理
Python程序一般对输入有一定要求,担当实际输入不满足程序要求时,可能会产生程序的运行错误。Python语言使用的保留太容易try和except进行异常处理! try: 语句块1 except: 语句块2 语句块1是正常执行的程序内容,当这个语句块发生异…...
有趣的代码——有故事背景的程序设计3
这篇文章再和大家分享一些有“背景”的程序设计,希望能够让大家学到知识的同时,对编程学习更感兴趣,更能在这条路上坚定地走下去。 目录 1.幻方问题 2.用函数打印九九乘法表 3.鸡兔同笼问题 4.字数统计 5.简单选择排序 1.幻方问题 幻方又…...
聚观早报 |国行PS5轻薄版开售;岚图汽车11月交付7006辆
【聚观365】12月2日消息 国行PS5轻薄版开售 岚图汽车11月交付7006辆 比亚迪推出12月限时优惠 特斯拉正式交付首批Cybertruck 昆仑万维发布「天工 SkyAgents」平台 国行PS5轻薄版开售 索尼最新的PlayStation5主机(CFI-2000型号组-轻薄版)国行版本正…...
Kafka 保证消息消费全局顺序性
当有消息被生产出来的时候,如果没有指定分区或者指定 key ,那么消费会按照【轮询】的方式均匀地分配到所有可用分区中,但不一定按照分区顺序来分配 我们知道,在 Kafka 中消费者可以订阅一个或多个主题,并被分配一个或多…...
3分钟在CentOS 7上离线安装Docker
在CentOS 7上离线安装Docker的详细步骤如下: 环境检查和准备 检查内核版本:Docker要求系统为64位且内核版本至少为3.10。使用命令uname -r查看内核版本。 检查CentOS版本:通过命令cat /etc/redhat-release查看版本信息。 更新yum包࿰…...
GaussDB数据库SQL系列-触发器
目录 一、前言 二、触发器概念 三、GaussDB数据库中的触发器 1、语法格式 2、创建步骤 3、注意事项 4、附:表和视图上支持的触发器种类 四、GaussDB数据库中的示例 示例一、在GaussDB数据库中创建一个触发器,以便在插入新记录时自动将记录的创建…...
网工学习10-IP地址
一、IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络中唯一的标识的一台计算机。网络ID用来标识计算机所处的网段;主机ID用来标识计算机在网段中的位置。IP地址通常用4组3位十进制数表示,中间用…...
二百零八、Hive——HiveSQL异常:Select查询数据正常,但SQL语句加上group by查询数据为空
一、目的 在HiveSQL的DWD层中,需要对原始数据进行去重在内的清洗,结果一开始其他数据类型的清洗工作都正常,直到碰到转向比数据。 一般的SQL查询有数据,但是加上group by以后就没数据; 一般的SQL查询有数据…...
Docker—共享应用程序
现在您已经构建了一个映像,可以共享它。要共享Docker映像,您必须使用Docker注册表。默认注册表是Docker Hub,是您使用的所有图像的来源。 Docker ID(Docker标识) Docker ID允许您访问Docker Hub,这是世界上…...
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 用户和密码修改
第一步 下载(简单,注意联网)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中,创建备份和执行还原操作对于确保数据完整性、灾难恢复和数据库维护至关重要。以下是备份和恢复过程的概述: 方法 1. 使用 SQL Server Management Studio (SSMS) 备份和还原数据库 按照 SSMS 步骤备份 SQL 数据库 打开 SSMS 并连接到您…...
Java8 根据自定义属性去重
一、需求背景 有一个List集合,里面有n个Answer成员,成员种有m个属性,即: List<Answer> answers ...,现在我需要根据Answer的某一个属性对List去重(属性不固定),应该如何实现呢? 二、解决办法 需要满足上述需求,并不难,我们可以使用Java8提供的…...
Netty网络编程
入门案例 1、服务器端代码 public class HelloServer {public static void main(String[] args) {// 1、启动器,负责装配netty组件,启动服务器new ServerBootstrap()// 2、创建 NioEventLoopGroup,可以简单理解为 线程池 Selector.group(n…...
层三交换机解析(Layer 3 Switch)层3交换机
文章目录 层三交换机解析1. 概述1.1 什么是层三交换机1.2 层三交换机与路由器、二层交换机的比较 2. 层三交换机的工作原理2.1 基于MAC地址的转发2.2 基于IP地址的转发 3. 层三交换机的配置4. 常见问题与解答4.1 我应该使用路由器还是层三交换机?4.2 层三交换机可以…...
expect自动化交互
目录 1. expect作用: 2. expect语言用法: 3. 实例 1. expect作用: 是建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题。 2. expect语言用法: spawn开启免…...
探究两个互联网时代的差异,Web 2.0 与 Web 3.0 区别
Web 2.0 的特征 首先我们来了解一下 Web 2.0 的特征都有哪些。 用户生成内容:Web 2.0 时代以用户生成内容为特征,用户可以轻松地在网络上分享、创建和编辑信息。社交媒体平台、博客等网站的兴起使得用户成为信息的创造者,网络逐渐从被动浏览…...
c++基本常见错误总结
我们无论是在学习中还是在工作当中,总是会遇到各种各样的c编译错误问题,经常会有一种情况就是上一次好像遇到过这种问题,但是就是想不起来了(我就是这样)所以下面这一篇文章就是总结自己遇到的编译以及运行错误。 注意…...
鸿蒙原生应用/元服务开发-AGC分发如何生成密钥和和证书请求文件
HarmonyOS通过数字证书(.cer文件)和Profile文件(.p7b文件)等签名信息来保证应用的完整性,应用如需上架到华为应用市场必须通过签名校验。因此,开发者需要使用发布证书和Profile文件对应用进行签名后才能发布…...
Python自动化——driver.switch_to的用法
driver.switch_to的用法 from selenium import webdriver driver webdriver.Chrome(/path/to/chromedriver) # Chrome driver.get(https://www.example.com) # 打开网页 element driver.find_element_by_id(element_id) # 查找元素记得在不需要使用 driver 时,…...
【Java技术专题】「入门到精通系列教程」深入探索Java特性中泛型技术体系的原理和实战开发指南
深入探索Java特性中泛型技术体系的原理和实战开发指南 前提介绍泛型的介绍泛型带来的好处泛型引发的问题错觉:泛型也可以实现多态 泛型的特点类型擦除概念定义案例分析隐患问题开发要点类型擦除的过程案例代码 实例分析类型转换问题 通配符与上下界通配符List<Ob…...
基于Java SSM邮局订报管理系统
尽管电子读物越来越普及,但还是有很多读者对纸质刊物情有独钟,所以邮局的报刊征订业务一直非常受欢迎。邮局订报管理系统就是对客户在邮局订阅报刊进行管理,包括查询报刊、订阅报刊、订阅信息的查询、统计等的处理,系统的主要业务…...
【优选算法系列】【专题一双指针】第四节.15. 三数之和和18. 四数之和
文章目录 前言一、三数之和 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、四数之和 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …...
济南智能网站建设流程/电子商务平台有哪些
例如需求,我有一个WebView 加载一个url, 该url对应的网页本身自带下拉刷新 ,但是网页本身会有出现400 500 等异常请求错误码这时候网页加载失败,页面本身的下拉是无法使用的,要求重新加载页面的话就需要在webview外层套一个androi…...
做定制商品的网站/新闻类软文
1.(1)建立一个名为JEWRY的文件夹,并在其中建立一个新的子文件夹JAK;(2)将C:\\TABLE文件夹删除;(3)将C:\\UNION\\TEAM文件夹中的文件MARK.FOX删除;(4)将C:\\TAM\\UPIN文件夹中文件MAIN.PRG拷贝到…...
怎么做电脑端网站设计稿/电脑培训学校哪家好
1 继承的概念 在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。 在程序中,如果想声明一个类继承另一个类&…...
商业网站开发的实训小结怎么写/微信社群营销推广方案
选中项目,右键--->Properties--->在搜索框搜索:deployment as 然后点击显示出的搜索项。修改右侧视图的Web Context Root名称即可。 如图: 转载于:https://www.cnblogs.com/lyhbky/p/10695143.html...
体育馆做网站公司/seo优化技术
1、原地交换两个数字 x, y 10, 20 print(x, y) y, x x, y print(x, y) 10 20 20 10 2、链状比较操作符 n 10 print(1 < n < 20) print(1 > n < 9) True False 3、使用三元操作符来实现条件赋值 [表达式为真的返回值] if [表达式] else [表达式为假的返回值] y 2…...
wordpress格式/网络营销推广
yield,可以使线程放手一下CPU。然后再抓!放一下手,就可以让后面的线程先上了CPU。 例子: public class TestYield {public static void main(String[] args) {MyThread3 t1 new MyThread3("t1");MyThread3 t2 new MyThread3("…...