Correcting HDMI colour on Nvidia GPU // Code Redux

你可能听人们说过,
「HDMI (High-Definition Multimedia Interface)DP 接口(Display Port)以及 DVI (Digital Visual Interface)的显示效果相同,它们都是数字信号」
而事实并非如此,HDMI 作为一种通用的信号,广泛的用于电视以及娱乐系统领域,不像 DVI 和 DP 接口那样,是专为计算机显示器来设计的。所以当 PC 端的显卡通过 HDMI 接口连接 PC 显示器的时候,就会出现一些令人不爽的小问题,原因就要从开始说起。
常见的 3 个基本色彩模型分别是:
- RGB
- CMYK
- YUV
YCbCr 有时也称为 YCC,而 YCC 不是一种绝对色彩空间,而是 YUV 压缩和偏移的版本。YCbCr 是计算机系统中应用最多的成员,其应用领域很广泛。JPEG,MPEG 均采用此格式,一般人所讲的 YUV 大多是指 YCbCr 。
YCbCr 有多种取样格式,比如:
- 4:4:4
- 4:2:2
- 4:1:1
- 4:2:0
Y:
明亮度 (Luminancr 或 Luma),也就是灰阶值。「亮度」是透过 RGB 输入信号来建立,方法是将 RGB 信号的特定部分叠加在一起。
U&V:
色度(Chrominance 或 Chroma),作用是描述影像色彩饱和度,用于指定像素的颜色,「色度」则定义了颜色的两个方面——色调和饱和度,分别用 Cr 和 Cb 表示。
Cb:
反映的是 RGB 输入信号蓝色部分与 RGB 信号亮度值之间的差异。
Cr:
反映了 RGB 输入信号红色部分与 RGB 信号亮度值之间的差异。
在以下的两个公式中 RGB 和 YCbCr 各分量的范围均为 0-255。
Y = 0.299R + 0.587G + 0.114B
U = -0.1687R - 0.3313G + 0.5B + 128
V = 0.5R - 0.4187G - 0.08313B + 128
R = Y +1.402(U-128)
G = Y - 0.34414(U-128)-0.71414(V-128)
B = Y + 1.772(U-128)
灰阶:明暗等级的表现。
HDMI 传输数字色差信号常采用 YPbPr 各 8 位数字 RGB 信号的话,是 RGB 三通道各 8 位,总计 24 位的形式来传输。8 位能表现 0-255 个层次,0 是最暗,255 最亮。
For example :
- (255.255.255) 最亮的白
- (0.0.0) 黑色
但电视(TV)和影像领域的视频信号是通过色差信号表示的,电视使用 IRE 规格,
纯黑 IRE 0%
纯白 IRE 100%
Y = 235 即灰阶表现范围为 16-235
投影仪和电视产品默认输入信号范围为 16-235,而 HDMI 输入信号范围的 0-255 直接输入的话,就会出现暗部过暗,而亮部又太亮的问题。
PC 显示器等默认输入范围是 0-255 ,直接输入范围 0-235 的信号的话,现象就会反过来。比如说,出现黑色变为深灰而不是纯黑色,白色变为浅灰。
对应的相关现象表格如下:
(O 代表正常)