调色/颜色校正中的Gain, Multiply, Lift, Gamma与Offset

本文不定期更新,最新内容请访问:https://www.shuaiqi.me/2018/06/16/diaose-yansexiaozhengzhongdegain-multiply-lift-gammayuoffset-2/

2019.07.22 添加数学原理部分,更换示例图片为灰度渐变图。之前不讨论数学原理实际上是因为搞不清楚,早些时间偶然读到了北京大学出版社《NUKE影视后期合成技能》,给笔者很大启发。

2019.03.01 添加了一些注释和补充


Gain, Multiply, Lift, Gamma与Offset是调色/颜色校正中的几个重要概念。本文不讨论数学原理,也不讨论理论来源。在这里,我们将在三个维度上对概念进行分别解读,这三个维度分别是函数表达式,函数图像(可理解为PS中的曲线图),实际效果。

注:本文讨论的是32-bit浮点线性工作空间下白场(Whitepoint)在1,黑场(Blackpoint)在0(即函数的定义域、值域均为[0,1])时图像的变化情况。

原始图像与函数图像

Gain与Multiply

为什么要将这两个放在一起介绍呢?Lift与Multiply几乎没有区别(细微的差别,点此了解),设置相同的数值就会得到相同的效果。

函数表达式

y=gain·x

注:这里的x代指原始的像素值,y代表经过调色后的像素值,下同。

函数图像

当调大Gain(Multiply)时的图像与曲线图,如下

当调小Gain(Multiply)时的图像与曲线图,如下

可以发现,Gain(Multiply)恒过原点做斜率变化的运动。

实际效果

在上图中可以观察到,原本越亮的部分变化越大,越暗的部分变动越小。

Lift

函数表达式

y=lift·(x-1)+1

函数图像

当调大Lift时的图像与函数图像,如下

当调小Lift时的图像与曲线图,如下

Lift与Gain(Multiply)的运动方式有些相似,Lift的函数图像恒过点(1,1)做斜率变化运动。

实际效果

显而易见,它的效果与Gain(Multiply)恰恰相反,越暗的部分变动越大,越亮的部分变动越小。

Gamma

Gamma的概念并不太好理解,涉及稍微复杂些的幂函数运算,可以转换成对数函数,其产生也有比较复杂的历史原因。

函数表达式

y=x1/gamma

函数图像与实际效果

当调大Gamma时的图像与曲线图如下

当调小Gamma时的图像与曲线图如下

调节Gamma产生的曲线运动是典型的幂函数在定义域[0,1]上的运动图像。当调大或调小Gamma时,曲线变动的主要是中间的部分,并且仔细观察的话会发现,中间调偏暗部分的曲线变化相对于中间调偏亮部部分曲线变化更大,所以可以说,Gamma调节中间调,并且偏向暗部部分的影响更大一些。

Offset

函数表达式

y=x+offset

函数图像与实际效果

当调大Offset时的图像与曲线图如下

当调小Offset时的图像与曲线图如下

很容易理解,曲线整体上移或下移。

最后,引用一下网上的一种说法:

Lift(提升)可以看作暗部调节,也就是一般所谓的shadow

gamma(伽马)可以看作灰部的调节,也就是mid-tone

gain(增益)就是高光的调节,也就是highlight

offset(偏移)则是整体,也就是master

实际上,这种说法是有失偏颇的,到这里或许已经有答案了。Lift和Gain(Multiply)不仅仅影响暗部或高光,对与其相反的高光或暗部也有影响,只不过影响递减。Gamma影响中间调(灰部)没错,但是偏向暗部部分的影响更大一些。

笔者在本科期间没有接触过数学,中学的数学知识大多也已奉还给老师,在数学部分很可能有纰漏,欢迎指正,如有疑问可以在评论区留言交流。

### 解决 [HDL 9-1206] Syntax error near '+' 错误 此错误表明在 '+' 运算符附近存在语法问题。可从以下方面排查: - **运算符使用**:保证 '+' 运算符使用符合HDL语言语法规则。在Verilog中,'+' 用于加法运算,其左右两侧操作数类型需匹配。例如: ```verilog module tb; reg [7:0] a, b; wire [7:0] c; assign c = a + b; // 正确使用 '+' 运算符 endmodule ``` - **语句完整性**:确认 '+' 所在语句是否完整,是否遗漏了分号、括号等符号。例如,下面语句遗漏了分号: ```verilog // 错误示例 reg [7:0] a, b; wire [7:0] c = a + b // 缺少分号 // 正确示例 reg [7:0] a, b; wire [7:0] c = a + b; ``` - **数据类型**:保证 '+' 两侧操作数的数据类型一致。不同数据类型进行运算时,可能会引发语法错误。例如: ```verilog // 错误示例,操作数类型不匹配 reg [7:0] a; integer b; wire [7:0] c = a + b; // 可能引发错误 // 正确示例,操作数类型匹配 reg [7:0] a, b; wire [7:0] c = a + b; ``` - **文件编码**:确保文件编码格式正确,避免因编码问题造成语法错误,一般推荐使用UTF - 8编码。 - **版本兼容性**:确认所使用的HDL编译器版本支持当前代码的语法,不同版本的编译器对语法的支持可能存在差异。 ### 解决 [VRFC 10-2063] Module <multiply> not found while processing module instance <multiply_module> 错误 此错误意味着在处理 `multiply_module` 实例时,找不到 `multiply` 模块。可按以下方法解决: - **模块定义检查**:确认 `multiply` 模块是否已在代码中正确定义。模块定义应包含模块名、端口列表和模块体。例如: ```verilog module multiply ( input [7:0] a, input [7:0] b, output [15:0] result ); // 模块逻辑 assign result = a * b; endmodule ``` - **文件包含检查**:若 `multiply` 模块定义在另一个文件中,要确保该文件已被正确包含到项目中。在Verilog中,可使用 `include` 指令包含文件。例如: ```verilog `include "multiply.v" ``` - **路径检查**:若 `multiply` 模块定义在其他目录下,要确保路径正确。可使用相对路径或绝对路径。例如: ```verilog `include "../modules/multiply.v" ``` - **大小写检查**:Verilog是区分大小写的,要确保模块名的大小写一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值