41 lines
997 B
Python
41 lines
997 B
Python
|
|
"""EOTF(PQ / ST.2084)相关纯算法。"""
|
|||
|
|
|
|||
|
|
import numpy as np
|
|||
|
|
|
|||
|
|
|
|||
|
|
def calculate_pq_curve(gray_levels):
|
|||
|
|
"""计算 PQ (ST.2084) EOTF 理想曲线。
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
gray_levels: 灰阶百分比数组 (0-100)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
numpy.ndarray: 归一化亮度数组 (0-1)
|
|||
|
|
"""
|
|||
|
|
# PQ 曲线参数(ITU-R BT.2100 标准)
|
|||
|
|
m1 = 0.1593017578125 # = 2610 / 16384
|
|||
|
|
m2 = 78.84375 # = 78.84375
|
|||
|
|
c1 = 0.8359375 # = 3424 / 4096
|
|||
|
|
c2 = 18.8515625 # = 2413 / 128
|
|||
|
|
c3 = 18.6875 # = 2392 / 128
|
|||
|
|
|
|||
|
|
L_bar = []
|
|||
|
|
for gray in gray_levels:
|
|||
|
|
V = gray / 100.0
|
|||
|
|
|
|||
|
|
if V <= 0:
|
|||
|
|
L_bar.append(0)
|
|||
|
|
else:
|
|||
|
|
V_pow = np.power(V, 1 / m2)
|
|||
|
|
numerator = max(V_pow - c1, 0)
|
|||
|
|
denominator = c2 - c3 * V_pow
|
|||
|
|
|
|||
|
|
if denominator > 0:
|
|||
|
|
L = np.power(numerator / denominator, 1 / m1)
|
|||
|
|
else:
|
|||
|
|
L = 0
|
|||
|
|
|
|||
|
|
L_bar.append(L)
|
|||
|
|
|
|||
|
|
return np.array(L_bar)
|