更新v2.5
增加了对Dither_resize16部分使用gamma-aware resize的支持,新增参数curve与gcor,与Dither_y_gamma_to_linear和Dither_y_linear_to_gamma中的相应参数意义相同。curve默认为"linear"也就是不考虑gamma,设为"709"、"2020"、"srgb"、"240"则为对应的gamma-aware处理,gcor通常情况下不需要设置。
更新v2.5.1
修复v2.5里有一对Dither_y_gamma_to_linear和Dither_y_linear_to_gamma中多写了参数Y导致报错的bug。
关于gamma-aware的相关内容及测试,可以参考
这篇文章。
简单的总结就是,Y的0-255/16-235(8bit scale)与对应的亮度并不是线性的关系,而是有一个基于gamma值的近似指数关系(指数通常为2.2-2.4,具体公式参见上面的文章以及Rec709等文档)。
例如在srgb的gamma下,0(亮度0/255)和255(亮度255/255)如果在线性下取平均,得到的是128(亮度55/255),前后的亮度是有明显失真的,gamma-aware的平均后得到的是188(亮度128/255),这样得到的前后亮度是一致的。
这种失真的大小在进行计算的两个Y值的差距越大时也越明显,对应于resize中也就是在局部高对比度区域影响会更明显(edge部分),上面的文章中的例子基本都是基于这个原理来设计的。