颜色的表示和还原(一)

这篇文章主要提炼于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色彩空间详解 - 知乎

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2022 年高教社杯全国大学生数学建模竞赛-C 题 古代玻璃制品的成分分析与鉴别详解+聚类模型Python代码源码

前言 简单介绍一下我自己:博主专注建模四年,参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。参与过十余次数学建模大赛,三次美赛获得过二次M奖一次H奖,国赛二等奖。**提…

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

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

21【Aseprite 作图】画白菜

1 对着参考图画轮廓 2 缩小尺寸 变成这样 3 本来是红色的描边,可以通过油漆桶工具(取消 “连续”),就把红色的轮廓线,变成黑色的 同时用吸管工具,吸取绿色和白色,用油漆桶填充颜色 4 加上阴影…

TypeScript高级类型 在鸿蒙中的使用 Partial、Required、Readonly、Pick、Record

我的工程代码在这里&#xff0c;持续更新中 欢迎交流&#xff0c;谢谢 https://github.com/MartinLi89/WanHarmony Partial <Type> 新定义 一个类型&#xff0c;将所有属性变为可选的类. class TextTS {a: string "1"b: string "2"c: string &…

05-应用级开发者 AI 时代破局点

后端应用级开发者该如何拥抱 AI GC&#xff1f;就是在这样的一个大的浪潮下&#xff0c;我们的传统的应用级开发者。我们该如何选择职业或者是如何去快速转型&#xff0c;跟上这样的一个行业的一个浪潮? 0 AI金字塔模型 越往上它的整个难度就是职业机会也好&#xff0c;或者说…

Mysql-几何类型-POINT

在MySQL中&#xff0c;地理空间数据类型和功能被称为GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;。MySQL支持几种不同的空间数据类型&#xff0c;包括点&#xff08;POINT&#xff09;、线&#xff08;LINESTRING&#xff09;、多边形&…

Python 提取PDF表格数据并保存到TXT文本或Excel文件

目录 安装Python库 Python提取PDF表格数据并保存到文本文档 Python提取PDF表格数据并保存到Excel文档 PDF文件常用于存储和共享各种类型的文档&#xff0c;这些文档可能包括大量的数据表格。通过提取这些PDF表格数据&#xff0c;我们可以将其导入到Excel、数据库或统计软件等…

使用Docker进行Jmeter分布式搭建

大家好&#xff0c;随着技术的不断发展&#xff0c;对性能测试的要求也日益提高。在这样的背景下&#xff0c;如何利用 Docker 来巧妙地搭建 Jmeter 分布式成为了关键所在。现在&#xff0c;就让我们开启这场探索之旅&#xff0c;揭开其神秘的面纱。前段时间给大家分享了关于 L…

如何组织 Vue 项目

介绍 在启动 Vue 项目时&#xff0c;思考项目结构至关重要。主要考虑因素是预期项目的规模。在本篇博文中&#xff0c;我将探讨适用于不同规模 Vue 项目的各种结构。这个考虑与康威定律相吻合&#xff1a; “设计系统的组织受限于产生这些组织沟通结构的设计。” - 梅尔康威 基…

平均工资数据分析之回归

链接: R语言实战——中国职工平均工资的变化分析——相关与回归分析 1、模型诊断和评估的方法 1. 残差分析 1、残差图 (Residual Plot)&#xff1a;用于检查残差是否存在非随机模式。理想情况下&#xff0c;残差应随机分布在零附近。 2、Q-Q 图 (Quantile-Quantile Plot)&am…

redis-stack部署概要

第一步&#xff0c;下载redis-stack 下载链接&#xff1a;Downloads - Redis 第二步&#xff0c;redis安装包解压缩 gzip -d redis-stack-server-7.2.0-v10.rhel8.x86_64.tar.gz tar -xvf redis-stack-server-7.2.0-v10.rhel8.x86_64.tar 第三步&#xff0c;编辑etc下的redis…

高性能日志库go-logger2.0.4—支持slog日志文件切割

go-logger v2.0.4 发布 该版本主要支持go原生日志库 log/slog 的日志文件切割&#xff0c;压缩等功能。 log/slog 库是 Go 语言用于结构化日志记录的一个强大工具&#xff0c;它旨在提升日志的管理和分析能力&#xff0c;同时保证代码的简洁性和执行效率。随着 Go 语言生态的…

简单聊聊分布式和集群

前言 分布式和集群&#xff0c;我们都听的比较多&#xff0c;分布式系统和集群的概念对于刚进入职场的小伙伴可能不是很清楚&#xff0c;这篇文章我们就一起看看两者到底是什么&#xff0c;有什么区别。 什么是分布式系统&#xff1f; 先看下书面解释&#xff1a; 分布式系统…

学习笔记-C++

目录 1、何为常量 2、关键字 3、实型 4、水平制表符 5、string字符串 6、C中的三目运算符 7、随机数种子 8、结构体 9、各的区 10、引用 11、函数默认参数 12、函数占位参数 13、函数重载 14、私有属性 15、让另一个类作为本类的成员 16、声明和实现的文件…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.7讲 GPIO中断实验-编写按键中断驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

初识Django

day15 初识Django Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。 Python的Web框架&#xff1a; Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。…

GM812条码模块的产品说明

1 模块尺寸 引脚定义 (单位&#xff1a;mm) 接口定义&#xff1a;规格 1.25*6Pin 接口说明&#xff1a; a) UART 缺省波特率为 9600bps&#xff0c;数据格式&#xff1a;8 位数据位&#xff0c;1 位停止位&#xff0c;无校验位。 b) 如果上位机是 MCU&#xff08;3.3V&#x…

Java面试八股之Java中有哪些原子类,原理是什么

Java中有哪些原子类&#xff0c;原理是什么 AtomicInteger 和 AtomicLong&#xff1a; 用于对整数&#xff08;int&#xff09;和长整数&#xff08;long&#xff09;进行原子操作。 原理&#xff1a;它们内部封装了一个整型或长整型变量&#xff0c;并通过使用Unsafe类提供…

括号生成[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 数字n代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())(…

项目管理-案例重点知识(干系人管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 四、干系人管理 案例重点知识 干系人管理 案例 重点内容&#xff1a; &#xff08;1&#xff09;权力利益方格、权力影响方格&#xff…