实现抖音闪烁效果---OpenCV-Python开发指南(54)

举报
择城终老 发表于 2021/07/27 01:32:15 2021/07/27
【摘要】 目录 抖音视频闪烁原理实现抖音视频闪烁 抖音视频闪烁原理 在抖音视频的抖动过程中,我们还可以发现其视频的颜色曝光度都发生了一些变化,并不是单纯的只有抖动效果。所以,本篇将来实现视频的闪烁效果。 而图像闪烁的原理,其实说白了就是其曝光度的变化。在更改视频曝光度的之前,我们需要认识一个OpenCV中新的函数:cv2.LTU()。 LUT就是Look Up...

抖音视频闪烁原理

在抖音视频的抖动过程中,我们还可以发现其视频的颜色曝光度都发生了一些变化,并不是单纯的只有抖动效果。所以,本篇将来实现视频的闪烁效果。

而图像闪烁的原理,其实说白了就是其曝光度的变化。在更改视频曝光度的之前,我们需要认识一个OpenCV中新的函数:cv2.LTU()。

LUT就是Look Up Table(颜色查找表)的缩写,简单点儿理解就是:通过LUT,我们可以将一组RGB值输出为另一组RGB值,从而改变画面的曝光与色彩。LUT文件就是一个包含了可以改变输入颜色信息的矩阵数据。LUT本身并不进行运算,只需在其中列举一系列输入与输出数据即可,这些数据呈一一对应的关系,系统按照此对应关系为每一个输入值查找到与其对应的输出值,这样即可完成转换。

了解其具体是干什么的之后,我们再来看看其函数的定义:

def LUT(src, lut, dst=None):

  
 
  • 1

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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

这里,我们将前文的抖动与今天讲解的闪烁进行结合,最后观察其效果:
闪烁

其中gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]曝光度的算法,但其值有浮点数,而图像是不允许有浮点数存在的,所以通过np.round四舍五入,然后将其转换为LTU的第一个参数类型输入值。

文章来源: liyuanjinglyj.blog.csdn.net,作者:李元静,版权归原作者所有,如需转载,请联系作者。

原文链接:liyuanjinglyj.blog.csdn.net/article/details/115252883

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。