现象

上图是百度上找的一张图,是电子发烧友网站的网友的,如果发现侵权了请告知。觉得这张图能很好的看出不同gamma曲线带给人的直观感受的变化。从上往下看左侧黑色块黑得越来越严重,对比度也在逐渐加深。但是需要注意的时这幅图时一个反伽马曲线的特性,和ISP中的gamma表现时反的,这个具体后面回介绍。这个给这张图主要是对gamma有一个直观的理解。

Gamma产生的原因

CRT属性导致

在液晶屏幕诞生前,CRT显示器时唯一的一种显示器,有的同学可能没见过,所以贴张图出来,就是老式电视和电脑那种后面带有一大坨的的显示屏。

这种显示器的工作方式如图所示

屏幕后面一大坨就是一个阴极射线管,工作原理大致就是后面的电子前发射电子,经加速电场和偏移电场的作用达到屏幕上指定的位置,然后屏幕的特殊材质会发光产生画面。然后屏幕显示的亮度就和电子的数量有关,而这个又和电子枪的电压有关,所以屏幕亮度就和电子枪的电压又一个函数关系
Isreen=f(V)I_{sreen} = f(V) Isreen​=f(V)
但是需要注意的是这个函数关系不是线性的,也就是说当电子枪的电压升高为原来的两倍,但是屏幕亮度并不能变为原本的两倍,后面经过实验总结发现CRT的这种非线性关系满足对数关系

正式因为显示时会把亮度压低,所以为了还原成原本的线性特征,需要在显示之前进行一下矫正,使其恢复为线性,如是就有的gamma矫正,这也是最早对gamma的理解。到现在液晶显示可不满足这种特性,但是为了兼容以前的视频格式,也会认为在显示的时候添加这个一个反伽马矫正。

人眼的亮度特性

对于gamma还有一种说法就是,人眼的亮度响应曲线不是线性的而是如下图的关系

所以为了更好符合人眼的特性,就需要对暗区进行加强以提高画面的动态范围和暗区细节,更好的响应人眼对暗部更敏感的特性。而屏幕显示的时候又刚好有一个反伽马的特性,这一种说法认为这是一种巧合。

小结

目前这两种说法也没有人定义对错,就是两种不同的理解方式,所以也不要进入误区,关键点在于理解gamma的应用会给图像带来怎么样的变化。但是我个人更倾向于后面人眼的说法,至于为什么,我会在后面提到。关于gamma这一块儿网上有很多写得好的帖子我就不在多余赘述了,下面提供两个我觉得写的不错的博文的链接,有兴趣的可以看看

  • 【图形学】我理解的伽马校正(Gamma Correction)_candycat-CSDN博客_gamma校正

  • 色彩校正中的 gamma 值是什么? - 知乎 (zhihu.com)

gamma校正

LUT法

如图的论文中提到了一种LUT法的实现方式。理解起来很简单,就是提前把每个像素值经gamma矫正后对应的值求出来,然后把这些数据直接存储到一个数中,到矫正的时候根据输入的值就能直接通过数组下标就能找到对应的矫正后的值,这种方式最大的有点就时快,几乎不消耗硬件资源,因为几乎不用做任何计算的处理,但是这种方式的弊端在于需要大量的内存来存储这么这个表。但是现在随着技术的发展内存对于硬件也不是什么限制了,一个手机动辄就8G的内存了,可以通过加DDR来提高内存,所以现在很多方案在用这种查表得方式做gamma矫正。例如海思,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRBXn49a-1628479118494)(images\HiLUT.png)]

上图就是海思SDK中的实现方式,就是在一个头文件中定义这么一个数组,完全对应每一个输入值,然后海思用的是10bits,所以这个数组很大。

clc;clear; close all;
data = csvread('data/Gamma_Data_DEC_20210804103309.csv');
plot(data);
xlim([0, 1024]);
ylim([0, 4098]);
hold on;
plot([0, 1024], [0, 4098], 'r');

线性插值法

线性插值法也很好理解,就是在gamma曲线上提取一些采样点,然后把采样点的输入输出作为xy存储起来,然后矫正的时候如果在采样点上就接直接输入矫正值,如果不在,那么肯定在某两个采样点之间,那么就可以就可以通过这两个采样点的线性方程求解出该点的校正值。但是这种方式会有一定的误差,因为线性方程并布恩那个完全拟合gamma曲线。这种方式在一些廉价的方案里面会用到

如上图是一款链家ISP的插值方式,通过17个采样点来拟合曲线。

clc;clear;close all;
data = textread('data\gamma.txt', '%s');
xStr = char(data(1));
yStr = char(data(2));
xC = strsplit(xStr, ',');
yC = strsplit(yStr, ',');
x = hex0x2Dec(xC);
y = hex0x2Dec(yC);
plot(x, y);
hold on;
plot([0 255], [0 1023], 'r')
xlim([0, 256]);
ylim([0, 1024]);

这调曲线就是拟合出来的效果。

小结

  • 通过插值方式的这个gamma曲线就是我说我比较认同gammma的原因是受人眼特性的 影响而来。因为如果是为了矫正CRT的反伽马特性,那么gamma矫正曲线应该是比较规范的一条曲线,这样才能保证正法结合后恢复成线性。这条gamma是我在实际项目中在用的一条gamma,因为客户应用的特殊性,然后对颜色要求不高,这种gamma能将画面效果调到最好,所以我们调gamma主要还是为了人眼看着舒服合适,说到底还是为了人眼看东西的特性。

  • 上面两个曲线我们也可以看出来输出的大小比输入大。一版都是这样,输出会提高位数来保留更多信息量,减少非线性变换带来的信息损失。因为线性的时候肯定是每个输入对应一个输出,但是经过gamma变换后,就会出现对多个输入对应的一个输出的现象,这种输入的这些信息量就会损失,而如果提高输出的位数,用更多的数来表示,就能保证对每个输入都有一个输出与之对应从而保证信息不损失。

模拟gamma法

还有一种方式就是通过模拟的方式来做gamma矫正,但是这种方式不输入ISP PIPELINE中的算法,所以只是简单提一下。

这种方法的大概思路就是AD转换的时候经过一定的处理使其呈现非线性的特性。如上图定义Vramp和Vsig,当电压达到Vramp时产生一个斜坡信号,同时始终信号开始工作并计数,然后当电压到达Vsig时latch信号发生一个跳变使得始终信号停止基数,然后这个电压值就会和这种始终信号有一个非线性特性,人后根据这个特性进行gamma矫正。然后这种方式不涉及ISP算法,所以不作重点讲解,有兴趣的同学可以联系我提供论文研究。

附属说明

有的ISP除了有Ygamma还有RGBgamma,其实这个RGBgamma也很好理解,RGBgamma就是针对RGB三个通道分别有一条gamma曲线进行调整,这样就可以分别控制RGB三色通道从而对颜色产生控制。

相关链接

  • zhihu: ISP图像处理 - 知乎 (zhihu.com)
  • CSDN:ISP图像处理_wtzhu_13的博客-CSDN博客
  • Bilibili:食鱼者的个人空间_哔哩哔哩_Bilibili
  • Gitee:ISPAlgorithmStudy: ISP算法学习汇总,主要是论文总结 (gitee.com)

ISP——Gamma Correction相关推荐

  1. Camera ISP - Gamma 矫正

    这是第一篇 Camera ISP 的文章,主要从自己收集到的资料来试着描述下关于 Gamma 的理解,需要注意的是目前为止我了解到的有关于 Gamma 的说法还是众说纷纭,各处都不甚一致,在尽可能收集 ...

  2. OpenGL Gamma Correction伽马校正的实例

    OpenGL Gamma Correction伽马校正 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> # ...

  3. Gamma Correction

    一. 伽马校正简介: 伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正.如果图像原样显示在显示器等上,画面就会显得很暗.伽马校正通过预先增大 RGB 的值来排除影响,达到对图像校正的目 ...

  4. Gamma Correction sRGB texture

    文章目录 显示器gamma值的由来 gamma encode 图形渲染中的gamma问题 gamma correction sRGB texture 效果对比 正确的Linear/SRGB转换公式 参 ...

  5. OpenGL学习脚印:伽马校正(Gamma Correction)

    写在前面 由于CRT,LED等显示设备显示颜色时并非按照线性方式工作,因此我们在程序中输出的颜色,最终输出到显示器上时会产生亮度减弱的现象,这种现象在计算光照和实时渲染时对图形质量有一定影响,需要我们 ...

  6. Gamma Correction(伽马校正)

    定义 Gamma correction, gamma nonlinearity, gamma encoding, or often simply gamma, is the name of a non ...

  7. Gamma Correction/Gamma校正/灰度校正/亮度校正(已更正) - 部分 DCC 中的线性工作流配置

    文章目录 也可以简单参考 SIGGRAPH 2010 的 PBS 的 Gamma-Correct Unity 中的 gamma.linear 工作流 Unity BRP 管线中的 shaderlab ...

  8. 伽马矫正(Gamma correction)

    在学习HOG描述子时,对图像进行预处理中使用了伽马矫正这个方法,这里对伽马矫正进行简要的介绍. 伽马矫正也称幂律变换,一般用于平滑的扩展暗调的细节.进行伽马矫正的原因是因为人类的眼睛在感知光线时,眼睛 ...

  9. 我理解的伽马校正(Gamma Correction)

    [图形学]我理解的伽马校正(Gamma Correction) 2015年05月30日 18:22:52 妈妈说女孩子要自立自强 阅读数:69844 版权声明:本文为博主原创文章,未经博主允许不得转载 ...

最新文章

  1. 报文 wireshark_wireshark小知识:如何仅显示抓包的前100个包,并单独保存文件
  2. 【网络安全】如何使用PacketSifter从pcap中筛选出有用的信息
  3. how to deal with Demodex
  4. Android Studio 3.4增可视化资源管理工具 可管理和预览项目资源
  5. linkedin爬虫_您应该在LinkedIn上关注的8个人
  6. css删除li 圆点_CSS中li圆点样式
  7. linux文件符数据,linux – 如何监视文件描述符以获得新数据的可用性?
  8. IIS 发布的FTP提供下载时的转码问题
  9. eclipse-登录注册web项目-练
  10. 微信h5游戏如何在微信中做好域名防封 防屏蔽的 工作
  11. 开发在线投票系统过程遇到的问题
  12. 域格4G模块专网设置说明
  13. R可视化会出现的问题1
  14. mapbox中文地图_使用 Mapbox 地图
  15. 第一个php小程序(学习)
  16. GitHub超6.8万星,最全Python入门算法来了
  17. Android开发中横竖屏切换的问题以及系统提供的常用Activity
  18. 智能剪辑系统爆款生成器--移动端(小程序)手机版
  19. 员工排班优化 员工排班 java 排班
  20. 个人整理的UI设计部分知识点(AI和PS)

热门文章

  1. 阿里云企业发展史中的重大事件一览
  2. 如何判断DLL是否注册过?
  3. C语言:int型数据向char型数据的强制类型转换原理
  4. JS高级——浏览器运行前端项目的原理及流程
  5. 公众号文章排版样式——隐藏样式
  6. 机器学习,数据挖掘在研究生阶段大概要学些什么?
  7. 安卓与“Proguard”——安卓的代码混淆
  8. 数据库 | ATACdb:一个全面的人类染色质可开放性数据库
  9. HTML小游戏12 —— 汽车赛道飙车游戏(附完整源码)
  10. navicat导出和导入数据库里面的数据