好像各路法师都开始拍视频了,买相机也强调摄影和摄像的多用途性,尼康貌似到现在(2022/04)除了Z9,其他机型都还不支持N-log内录,外录要搭配录机。等等看Z6-3是否支持,持币观望中。
网上搜了一圈,貌似各家的视频log规格还不太一样,V-log、N-log、S-log、C-log等等,其他品牌没用过,只用过尼康相机,所以简单谈一谈log视频和普通视频有啥区别,一家之言,仅供参考。
这篇文章我感觉相当的不错:
核心观点就是线性映射,导致的动态范围分配不均衡问题:
线性映射
横轴代表被摄物体在sensor上的亮度值,用动态范围档位表示,假如最终的成像是8bit的,采用线性映射,7档到8档之间的内容被映射到2^7到2^8-1之间,这就产生了一个问题,一个动态范围档位,居然占据了8bit数值的一半(128~255),而其他7档占据另一半(0~127),这样的不平衡分配导致的结果就是暗部占据的值域范围太少,后期调整极容易产生断层,噪声。
解决办法就是添加一个非线性映射,人为重新分配值域范围对应的动态范围档位。
log曲线
好了,有了以上背景,理解规格书就没什么障碍了。
N-log视频是10bit色深,颜色空间是BT.2020,基本上和现在电视HDR视频规格差不多,除了OTEF/gamma不一样。
先看官方给出的公式:
反射率和目标值(0~1023)的关系
简算一下反射率为0的时候的目标值为650+0.0075^(1/3) = 127,也就是说N-log视频的像素值是127起跳的,目标值1023上限对应的反射率是e^((1023-619)/150) = 14.78反射率,定义反射率0.18为EV0,14.78对应EV值为log2(14.78/0.18) = 6.3595。所以官方文档的示意图是这样的:
127起步,最右侧6档多一些到顶
上面这个图的X轴不是线性的,如果要改成线性输入,这个映射图是什么样的呢。简单画一下:
蓝色是n-log映射曲线和尼康的文档示意图吻合
代码:
import numpy as np
import matplotlib.pyplot as plt
ref_x = np.arange(0.18/256, 14.78, 0.001)
linear_y = ref_x * 1023/14.78
gamma2_y = (ref_x/14.78)**(1/2.2) * 1023
log_y = np.zeros_like(ref_x)
for i, val in enumerate(ref_x):
if val < 0.328:
log_y[i] = 650*(val + 0.0075)**(1/3)
else:
log_y[i] = 150*np.math.log(val, np.math.e) + 619
fig = plt.figure(0)
ax = fig.add_subplot(111)
ax.plot(ref_x, linear_y, 'r-', label='linear')
ax.plot(ref_x, gamma2_y, 'g-', label='gamma2.2')
ax.plot(ref_x, log_y, 'b-', label='n-log')
ax.legend()
ax.grid(visible=True, which='major')
ax.set_xticks(np.arange(0, 16, 1))
ax.set_yticks(np.arange(0, 1025, 128))
log_ref_x = np.zeros_like(ref_x)
for i, val in enumerate(ref_x):
log_ref_x[i] = np.math.log2(val/0.18)
fig1 = plt.figure(1)
ax1 = fig1.add_subplot(111)
ax1.plot(log_ref_x, linear_y, 'r-', label='linear')
ax1.plot(log_ref_x, gamma2_y, 'g-', label='gamma2.2')
ax1.plot(log_ref_x, log_y, 'b-', label='n-log')
ax1.legend()
ax1.grid(visible=True, which='major')
ax1.set_xticks(np.arange(-8, 9, 1))
ax1.set_yticks(np.arange(0, 1025, 128))
plt.show()
<< · Back Index ·>>