颜色的表示和还原(一)

news2024/7/6 18:18:04

这篇文章主要提炼于ICCV 2019 Tutorial: Understanding Color and the In-Camera Image Processing Pipeline for Computer Vision。里面深入浅出地讲解了很多ISP中的基础知识,这里主要对颜色相关的部分做一点总结。

假设不成立了

相机经常被简单地看作是衡量光线的设备light-measuring device,而图像被看作是辐射量化后的结果。这一假设在HDR,图像匹配,shape from shading等领域都被认为成立。

但实际上相机尤其是数码相机对进入相机的光线做了很多处理,都是为了生成更符合人眼审美的图像visually pleasingphotographs。佳能,索尼的相机在同一参数下得到的照片色彩有不同的风格。而不用说后期的软件阶段的PS,在硬件阶段就发生了很多操作(on board photo-finishing):

所以HDR一般使用raw数据,因为raw数据是线性的,是和曝光量成正比的,或者通过建模从rgb图恢复线性rgb。

颜色是波长

牛顿爵士通过色散实验证明了日光是不同的颜色混合,而现在我们知道不同颜色的光波长不同。

对于人眼来说,人眼细胞分为锥状细胞cone和杆状细胞rod,前者负责感应颜色,后者对亮度更敏感,处理暗处的环境。

但是cone只有三种细胞,且这三种细胞的感应曲线不是冲激型的,这意味着同一个细胞对不同波长都有响应。三种感应曲线进一步叠加得到最终人眼的感应曲线。而物体的辐射波长也是有一定带宽的,这就造成不一样的波长输入,比如卷心菜和绿色墨水的辐射,在人眼看来可能是一样的色彩,称为metamers。

 Spectral power distribution (SPD)用来表示辐射的波长的分布情况。

颜色分解组合

前面的三种颜色刺激就是Tristimulus color theory。在此基础上,Grassman’s Law进一步表明了任意颜色是三原色的线性加权组合,这三种基本颜色就像是单位正交基一样,张成了颜色空间。

对绿色最敏感

通过“flicker photometry”实验,发现人眼对绿色很敏感,绿色只需要很低的强度就能被人识别到。实验把某一波长的光和refernce光以17Hz的频率交替打在背景板上,逐步加强实验波长光线的强度,直至人眼感觉不到闪烁。所需强度越小说明对该波长越敏感。可以看到,绿色所需的强度是最小的。

CIE1931 RGB

既然任意波长的光都可以分解为RGB三原色,那么遍历各个单色波长,可以得到三原色对应的三个权重参数。

国际照明委员会在1931年采用了700nm的红,546.1nm的绿,435.8nm的蓝作为三原色,邀请了300多名观察者重新做了颜色匹配实验,最终得到的实验数据.

需要注意的是有时候只靠融合三原色无法得到和test color相近的颜色,这时需要把颜色分量叠加在test color上,这就相当于RGB的系数是负数,所以最终的权重曲线有负数:

CIE1931 XYZ

CIE RGB由于有负数的存在,不方便人理解。但如果重新选取RGB基准色,重新做颜色匹配实验又未免有点麻烦。CIE做法是基于CIE RGB推出了XYZ,可以认为是将RGB的基向量变换得到了新的基向量XYZ。

 这样就可以得到光谱中每种单色光在XYZ坐标系下的坐标。此时xyz下已经没有了负数:

色品图和马蹄图

rgb的权重归一化之后就得到了色品坐标:

又因为三个色品坐标和为1,所以可以只考虑r和g的色品坐标,得到一个二维的图:

 和之前一样,r分量有相当大的一部分落在负数象限。还可以看到实际可取的取值范围是马蹄形曲线,如果选择3个点的连线将马蹄形包含起来,那么这三个点就可以作为新的基,可以避免权重负数的情况。可以看到,红色线段就是我们最终的选择。

首先观察到XY线段表示的是520~700处r与g的近似线性关系,此时在RGB曲线上可以看到b=0.

颜色匹配包含了亮度的匹配。亮度方程Y=r+4.5907g+0.0601b,因为对绿色敏感,所以g的取值更高。令亮度方程Y=r+4.5907g+0.0601b=0=r+4.5907g+0.0601*(1-r-g),可以得到XZ所在的直线。

最后,选取的为波长503nm出的点相切的直线。最终得到了XYZ。所以就得到了基RGB到XYZ的变换矩阵。

reference:

https://zhuanlan.zhihu.com/p/137639368

聊聊颜色的技术实现(二)—— CIE 1931 XYZ系统 - 简书

色域马蹄图是怎么来的?——CIE 1931 XYZ色彩空间详解 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qwen学习笔记4:Qwen 7B模型调用天气API实现天气的实时查询

前言 在学习Qwen模型的函数调用功能后,进一步尝试利用本地的Qwen模型访问OpenWeather API来获取实时的天气情况。 参考代码来源于视频教程: 简单粗暴,轻松配置Qwen模型查询实时数据功能_哔哩哔哩_bilibili 说明 该代码运行前&#xff0c…

线性系统(二)

线性系统(二) 1.直观理解线性方程组结构2. 不同解的结论3. 更一般的高斯-约旦消元法4.齐次线性方程组 链接: 线性系统(一) 1.直观理解线性方程组结构 长这样,方程就有解,即相交坐标。 长这样,…

Python | Leetcode Python题解之第92题反转链表II

题目: 题解: class Solution:def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:# 设置 dummyNode 是这一类问题的一般做法dummy_node ListNode(-1)dummy_node.next headpre dummy_nodefor _ in range(left - 1):pre…

Cadence 16.6 PCB Edito如何将鼠标中键反向拉拽改为正向拖拽

Cadence 16.6 PCB Editor如何将鼠标中键反向拉拽改为正向拖拽 Cadence 16.6 PCB Editor默认鼠标中键是反向的拉拽,让我很不适应,在网上找的可行的方法,在这里总结出来,希望能帮到其他工程师。 按照以下步骤进行操作: …

设计模式:外观模式(Facade)

设计模式:外观模式(Facade) 设计模式:外观模式(Facade)模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展参考 设计模式&#xff1…

Golang | Leetcode Golang题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; func numDecodings(s string) int {n : len(s)// a f[i-2], b f[i-1], c f[i]a, b, c : 0, 1, 0for i : 1; i < n; i {c 0if s[i-1] ! 0 {c b}if i > 1 && s[i-2] ! 0 && ((s[i-2]-0)*10(s[i-1]-0) < 26) {c…

SAP BSEG VS ACDOCA 差异

温习一下 ACDOCA VS BSEG matinal&#xff1a;S4 HANA 详解ACDOCA与BSEG的区别都在这了_sap acdoca-CSDN博客

16.投影矩阵,最小二乘

文章目录 1. 投影矩阵1.1 投影矩阵P1.2 投影向量 1. 投影矩阵 1.1 投影矩阵P 根据上节知识&#xff0c;我们知道当我们在解 A X b AXb AXb的时候&#xff0c;发现当向量b不在矩阵A的列空间的时候&#xff0c;我们希望的是通过投影&#xff0c;将向量b投影到矩阵A的列空间中&…

机器学习—聚类算法

聚类算法 小白的机器学习笔记 2024/5/15 9:52 文章目录 聚类算法步骤K-means算法优缺点 示例 聚类算法的核心思想&#xff1a; 样本点到每个中心点的距离&#xff0c;最近的就是这个类 步骤 要聚成3类&#xff0c;先初始化3个点 第一步大致确定类别 第二步更新中心点 第三…

Vue的学习 —— <网络请求库Axios>

目录 前言 正文 一、Axios基本概念 二、安装Axios 三、Axios使用方法 四、向服务器发送请求 前言 在之前的开发案例中&#xff0c;我们通常直接在组件中定义数据。但在实际的项目开发中&#xff0c;我们需要从服务器获取数据。当其他用户希望访问我们自己编写的网页时&a…

AI绘画Midjourney 和 Stable Diffusion的区别是什么?如何使用和安装?超详细AI绘画小白零基础入门教程建议收藏!(附资料)

大家好&#xff0c;我是画画的小强 关于AI绘画&#xff0c;大家多多少少都听过Midjourney 和 Stable Diffusion的大名&#xff0c;号称目前市面上最强的两款AI绘画软件。那么今天我们就来分析一下这两款软件的区别在哪里。 Midjourney是一个在线网站&#xff0c;使用它需要用…

码农慎入 | 入坑软路由,退烧IDC,Homelab折腾记

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 俗话说&#xff0c;入门软路由&#xff0c;退坑IDC 这一期&#xff0c;我们将深入探讨一个许多科技爱好者…

小白git

克隆 &#xff1a;git clone 链接地址 如果没有.git文件的话&#xff1a;git init 切换分支&#xff1a;cd 目录 拉代码&#xff1a;git pull 查看你自己改了那些文件&#xff1a;git status 添加道本地暂存区&#xff1a;git add * 提交到远端&#xff1a;git commit …

网络安全快速入门(十三)linux及vmware软件的网络配置

13.1 前言 在通过我们前面的了解&#xff0c;我们现在已经对Linux的基础知识有了大致的了解&#xff0c;今天我们来大概讲一下关于linux系统及vmware的网络配置问题&#xff0c;在这之前&#xff0c;我们需要对网络有一个大概的认识和了解&#xff0c;话不多说&#xff0c;我们…

windows驱动开发-PCI讨论(一)

前面描述中断的时候&#xff0c;我们曾经多次体积PCI&#xff0c;甚至提供了一些PCI的相关知识&#xff0c;但是整个PCI是一个很大的体系&#xff0c;专门记录这个体系超出了这个系列的范畴&#xff0c;有兴趣的可以到PCI官网了解详细的情况。 但是还是会花费一些时间讨论PCI技…

AI办公自动化:用kimi批量把word转换成txt文本

在Kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;F:\aword 读取里面docx格式的word文档&#xff0c; 提取word文档中的第一行文字作为txt文本文档的标题…

写后端项目时上传文件接口使用阿里云oss-规范写法

文章目录 开通对象存储服务密钥管理点击头像点击密钥管理创建新密钥AccessKey 写在yml配置文件中相关配置1.pom依赖2.全局配置类3.AliOssUtil 工具类3.AliOssProperties类&#xff0c;用于读取yml文件中写入的密钥4.controller层&#xff0c;用于写传输文件的接口 开通对象存储…

线程同步--互斥锁,读写锁

线程同步 基本概念 线程的能力在于能够方便地通过全局变量或共享内存来交换信息&#xff0c;但这也带来了并发控制的复杂性&#xff0c;主要表现在如何安全地管理多个线程对共享资源的访问。这里涉及到几个关键的概念和技术&#xff1a; 临界区&#xff08;Critical Section…

【C语言】指针(二)

目录 一、传值调用和传址调用 二、数组名的理解 三、通过指针访问数组 四、一维数组传参的本质 五、指针数组 六、指针数组模拟实现二维数组 一、传值调用和传址调用 指针可以用在哪里呢&#xff1f;我们看下面一段代码&#xff1a; #include <stdio.h>void Swap(i…

【Week Y9】yolo-v8网络结构的主要模块学习

文章目录 一、...\ultralytics-main\ultralytics\nn\modules\conv.py&#xff1a;&#xff08;1&#xff09;__all__说明&#xff1a;&#xff08;2&#xff09;autopad()说明&#xff1a;&#xff08;3&#xff09;conv()说明&#xff1a;&#xff08;4&#xff09;Focus()说明…