抖音视频闪烁原理
在抖音视频的抖动过程中,我们还可以发现其视频的颜色曝光度都发生了一些变化,并不是单纯的只有抖动效果。所以,本篇将来实现视频的闪烁效果。
而图像闪烁的原理,其实说白了就是其曝光度的变化。在更改视频曝光度的之前,我们需要认识一个OpenCV中新的函数:cv2.LTU()。
LUT就是Look Up Table(颜色查找表)的缩写,简单点儿理解就是:通过LUT,我们可以将一组RGB值输出为另一组RGB值,从而改变画面的曝光与色彩。LUT文件就是一个包含了可以改变输入颜色信息的矩阵数据。LUT本身并不进行运算,只需在其中列举一系列输入与输出数据即可,这些数据呈一一对应的关系,系统按照此对应关系为每一个输入值查找到与其对应的输出值,这样即可完成转换。
了解其具体是干什么的之后,我们再来看看其函数的定义:
def LUT(src, lut, dst=None):
src:需要曝光的图像array,类型必须是np.uin8类型
lut:查找表,如果输入src是多通道的,例如是BGR三通到的图像,而查表是单通道的,则此时B、G、R三个通道使用的是同一个查找表
dst:曝光后返回的图像
可以看出来,cv2.LTU()函数可以将一组RGB值输出为另一组RGB值,而这映射的规则,由程序员自己制定。
这里,我们还需要了解Gamma变化。
简单的来说,Gamma变换就是用来图像增强,其提升了暗部细节,就是通过非线性变换,让图像从曝光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。
经过Gamma变换后的输入和输出图像灰度值关系如图1所示:横坐标是输入灰度值,纵坐标是输出灰度值,蓝色曲线是gamma值小于1时的输入输出关系,红色曲线是gamma值大于1时的输入输出关系。可以观察到,当gamma值小于1时(蓝色曲线),图像的整体亮度值得到提升,同时低灰度处的对比度得到增加,更利于分辩低灰度值时的图像细节。因此设置Gamme参数可以控制图像的曝光度,在0-1时会造成图像过度曝光。
实现抖音视频闪烁
了解了视频闪烁曝光的原理。下面,我们直接来实现其效果,具体代码如下所示:
#曝光图片
def exposure_effect(img, gamma):
gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]
gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)
return cv2.LUT(img, gamma_table)
if __name__ == "__main__":
cap = cv2.VideoCapture("45.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
i = 1
count = 5
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
videoWriter = cv2.VideoWriter("output.avi", fourcc, fps, (width, height))
while (cap.isOpened()):
ret, frame = cap.read()
if ret:
if (i % 5 == 0 or 0 < count < 5):
frame = exposure_effect(video_shake_effect(frame), 0.5)
videoWriter.write(frame)
else:
count = 5
cv2.imshow('video', frame)
videoWriter.write(frame)
i += 1
c = cv2.waitKey(1)
if c == 27:
break
else:
break
cap.release()
videoWriter.release()
cv2.destroyAllWindows()
这里,我们将前文的抖动与今天讲解的闪烁进行结合,最后观察其效果:
其中gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]曝光度的算法,但其值有浮点数,而图像是不允许有浮点数存在的,所以通过np.round四舍五入,然后将其转换为LTU的第一个参数类型输入值。