百人计划(图形部分)伽马校正

这篇博客介绍了Gamma校正的概念及其在颜色空间中的作用,解释了为何需要Gamma校正以优化存储和带宽,并探讨了人眼对颜色敏感性的差异。线性工作流确保了从图像处理到显示的一致性,避免了亮度叠加过曝、颜色混合错误和光照渲染问题。内容涵盖了Unity中的颜色空间设置及不同工具(如Substance Painter、Photoshop到Unity的转换流程)。
摘要由CSDN通过智能技术生成

MAY的百人计划https://space.bilibili.com/7398208?

韩世麟Gamma校正与线性工作流入门讲解_哔哩哔哩_bilibili

Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗? - 知乎“为什么我渲染出来的场景,总是感觉和真实世界不像呢?” 游戏从业者或多或少都听过Linear、Gamma、sRGB和伽马校正这些术语,互联网上也有很多科普的资料,但是它们似乎又都没有讲很"清楚"。 游戏界(特…https://zhuanlan.zhihu.com/p/66558476

颜色空间

先回顾下色彩空间的定义

  •  色域:三个基色的坐标,由此形成三角形;
  • Gamma:如何对三角形内进行切分;
  • 白点:色域三角形中心;

 传递函数

我们已经知道了颜色空间下三原色的值,但是需要将图像显示在电子设备上,需要将数据转化成视频信号

传递函数就是能将颜色数据转化成视频信号的函数。

image.png

  •  OEFT 把光转换为电子信号(例如:拍摄视频的时候,将场景中的光保存成信号)
  • EOFT 把电子信号转换成光信号(例如:播放视频的时候,将视频中的信号转换成光强度)

传递函数就是Gamma校正所使用的函数

Gamma校正

 举例

 为什么要Gamma校正

  • 非线性转换目的主要是为了优化存储空间与带宽,传递函数能更好地帮我们利用编码空间
  • 人眼在计算机上对于暗部细节观察多,而亮部细节观察少
  • 计算机问题,早期性能不行,gamma≈2.2情况下,可以节约资源存储亮部,更多资源存储暗部;

韦伯定律

 上方人眼看上去过渡更均匀,称为美术中灰

下方的亮度才是均匀线性变化的,称为物理中灰

Gamma编码的曲线就是物理线性增长的亮度到人眼视觉感受上的均匀灰阶的映射

在这里插入图片描述

 8bit图片只能存储256个灰阶,如果采用均匀分布的物理灰阶,采样分布如下

在这里插入图片描述

采用均匀分布的美术灰阶时,采样分布如下

在这里插入图片描述

可以看出物理分布时,暗部采样信息过少

在这里插入图片描述

 反映到图片本身,对于8bit图片来说,如果线性记录物理光强,图片的暗部会产生明显的色阶断层

在这里插入图片描述

 因此,Gamma编码的作用就是通过函数将美术中灰映射到中间,使得物体的亮部和暗部能获得相同的色阶数目,更符合人眼的直观感受

小结

  • 人眼对暗部变化比亮部更加敏感
  • 我们目前所使用的真彩格式RGBA32,每个颜色通道只有8位用于记录信息,为了合理使用带宽和存储空间,需要进行非线性转换。
  • 目前我们所普遍使用的sRGB颜色空间标准,他的传递函数gamma值为2.2(2.4)

中灰值

在这里插入图片描述

在这里插入图片描述

 由上图可知中灰值并非一个固定的具体数值,而是取决于视觉感受

线性工作流

线性工作流就是在各个环节正确地使用gamma编码解码,保证最终得到的颜色和输入的物理数据是一致的

如果是使用gamma空间的贴图,在传给着色器之前需要从gamma空间转到线性空间,让我们在着色器中进行渲染计算时使用的是线性空间的颜色,避免出现显示上的错误

 不使用线性工作流可能出现的问题

在亮度叠加时产生过曝效果,伽马空间下的值在经过伽马编码后,其值比实际的要大,如0.098进行叠加时其值在编码后变成0.0980.45进行叠加,最后超过1产生过曝效果;
在颜色混合时,若是未对非线性颜色进行转换,会在纯色边界出现黑边;
进行光照渲染计算时,若我们把视觉上,非线性空间下的中灰色0.5当做是实际光强为0.5进行计算产生如图效果,实际在显示时,中灰色为0.5,但在渲染空间下光强为0.18;

 

 Unity中的颜色空间

 支持线性空间的平台

 

 Substance Painter到unity过程

 

 PS到Unity

 

 作业(更详细等看入门精要再来补充)

什么是Gamma校正

美术灰阶和物理灰阶的转换

为什么要Gamma校正

人眼对灰色变化更加敏感,更好利用数字存储空间,节约带宽

  • 渲染器为物理模拟器,需要原始的图片数据是线性浮点数据(物理数据),
  • 当保存为图片时,就用gamma小于1的函数处理,这样一来,物理上0.218的色值,就可以映射到美术上的中灰。
  • 如果这张图片要被打开查看时,如果直接用物理数据,是偏亮的,这个时候又要进行一次校正,也就是显示器要用到一条gamma大于1的下压曲线来校正,把亮度压低,达到符合人眼的美术灰阶。

左侧为线性,右边是伽马

 

当涉及到伽马校正时,Halcon提供了一些函数来实现图像处理。以下是一个示例代码,可以帮助你进行伽马校正: ```halcon read_image(Image, 'image.jpg') // 读取图像 gamma_value := 0.5 // 设置伽马值 // 进行伽马校正 gamma_image(Image, CorrectedImg, gamma_value, 'non-linear') // 显示原始图像和校正后的图像 dev_open_window(0, 0, 512, 512, 'black', WindowHandle) dev_display(Image) dev_set_color('red') dev_set_paint('margin') dev_display_text(WindowHandle, 'Original Image', 'window', 12, 12, 'black', [], []) dev_set_color('white') dev_display(CorrectedImg) dev_set_color('red') dev_set_paint('margin') dev_display_text(WindowHandle, 'Corrected Image', 'window', 12, 256, 'black', [], []) // 关闭窗口 dev_close_window() ``` 在这个示例代码中,我们首先使用`read_image`函数读取图像文件。然后,我们设置了一个`gamma_value`变量,用于定义伽马值。接下来,我们使用`gamma_image`函数进行伽马校正,将校正后的图像保存在`CorrectedImg`中。 最后,我们使用Halcon提供的图形显示函数来显示原始图像和校正后的图像。你可以使用`dev_open_window`函数打开一个窗口,并使用`dev_display`函数显示图像。使用`dev_set_color`和`dev_set_paint`函数可以设置文本和图形的颜色和样式。最后,使用`dev_close_window`函数关闭窗口。 请注意,以上代码仅为示例,你需要根据你自己的需求进行适当的修改。希望这可以帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值