美文网首页
实现抖音闪烁效果---OpenCV-Python开发指南(54)

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

作者: 极客学编程 | 来源:发表于2021-05-25 19:57 被阅读0次

    抖音视频闪烁原理

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

    而图像闪烁的原理,其实说白了就是其曝光度的变化。在更改视频曝光度的之前,我们需要认识一个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变化。

    2.png

    简单的来说,Gamma变换就是用来图像增强,其提升了暗部细节,就是通过非线性变换,让图像从曝光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。

    经过Gamma变换后的输入和输出图像灰度值关系如图1所示:横坐标是输入灰度值,纵坐标是输出灰度值,蓝色曲线是gamma值小于1时的输入输出关系,红色曲线是gamma值大于1时的输入输出关系。可以观察到,当gamma值小于1时(蓝色曲线),图像的整体亮度值得到提升,同时低灰度处的对比度得到增加,更利于分辩低灰度值时的图像细节。因此设置Gamme参数可以控制图像的曝光度,在0-1时会造成图像过度曝光。

    1.png

    实现抖音视频闪烁

    了解了视频闪烁曝光的原理。下面,我们直接来实现其效果,具体代码如下所示:

    #曝光图片
    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()
    

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


    output_1.gif

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

    相关文章

      网友评论

          本文标题:实现抖音闪烁效果---OpenCV-Python开发指南(54)

          本文链接:https://www.haomeiwen.com/subject/jbkelltx.html