Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之二 简单视频闪白效果
目录
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之二 简单视频闪白效果
一、简单介绍
二、简单视频闪白效果实现原理
三、简单视频闪白效果案例实现简单步骤
四、注意事项
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
二、简单视频闪白效果实现原理
视频闪白效果是指在视频播放过程中,画面突然闪现出白色,并迅速恢复到正常画面的现象。这种效果常常用于吸引观众的注意力,或者用于视频编辑中的过渡效果。
在编程中实现视频闪白效果意味着在视频的特定帧或时间点上将画面变为白色,然后迅速恢复为原来的画面。通常情况下,闪白效果可以通过在视频处理过程中对特定帧进行处理,将所有像素值设置为白色来实现。
闪白的特效,观察其对视频图像的影响,可以看出,图像整体颜色变淡,这是由于图像过度曝光所致,因此按照设置图像曝光度来进行算法设计。
图像的Gamma变换,主要是用来调整图像曝光度的算法。什么是Gamma变换呢?Gamma变换是对输入的图像灰度值进行的非线性操作,使输出图像的灰度值与输入图像的灰度值呈指数关系如下:
这个指数即为Gamma。
Gamma变换用来做图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从曝光强度的线性响应变得更接近人眼感受的响应,即将相机曝光或曝光不足的图片进行矫正。
Gamma值大于1时,对图像的灰度分布直方图具有拉伸作用,使灰度向高灰度值延展;而当小于1时,对图像的灰度分布直方图具有收缩作用,使灰度向低灰度值方向靠拢。因此设置Gamma参数可以控制图像的曝光度,在0~1时会造成图像过度曝光。
整个视频闪白特效的算法步骤如下:
(1)读取待处理的视频。
(2)设置出现闪白效果的帧数,比如对相邻5帧的图像进行Gamma参数调整使其过度曝光。
(3)设置视频中不变的帧数,比如以指定帧数为间隔来处理图像。
主要涉及函数简单说明:
cv2.imread(file_path, flags)
: 这个函数用于读取图像文件。它接收两个参数,第一个参数是文件路径,第二个参数是读取图像的标志。在这个场景中,cv2.imread
被用于读取棋盘图像以及视频的每一帧图像。
cv2.VideoWriter(output_path, fourcc, fps, frame_size)
: 这个函数用于创建一个视频写入对象,用于将处理后的帧写入输出视频文件中。它接收四个参数,分别是输出视频文件路径、视频编码器(fourcc
)、帧率(fps
)和帧尺寸(frame_size
)。
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
: 这个函数用于调整图像的大小。它接收多个参数,其中src
是源图像,dsize
是目标图像的尺寸(宽度和高度),fx
和fy
是水平和垂直方向的缩放因子,interpolation
是插值方法。在这个场景中,cv2.resize
被用于将棋盘图像放大两倍。
cv2.split(m[, mv])
: 这个函数用于将多通道图像分割成单通道图像。它接收一个参数m
,即多通道图像。在这个场景中,cv2.split
被用于将放大的棋盘图像的通道分离,以进行后续的颜色处理。
cv2.merge(mv[, dst])
: 这个函数用于将单通道图像合并成多通道图像。它接收一个参数mv
,即单通道图像列表。在这个场景中,cv2.merge
被用于将颜色通道重新合并,以恢复为完整的图像。
cv2.LUT(src, lut[, dst])
: 这个函数用于对图像进行查找表变换。它接收三个参数,分别是源图像src
、查找表lut
和目标图像dst
。在这个场景中,cv2.LUT
被用于应用伽马变换,实现增白效果。
三、简单视频闪白效果案例实现简单步骤
1、编写代码,实现图片增白效果
2、运行效果
3、具体代码
"""
图片增白处理
"""import cv2
import numpy as npdef gamma_trans(img, gamma):"""增白处理:param img::param gamma::return:"""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)def main():img = cv2.imread('Images/DogFace.jpg')# 设置窗口属性,并显示图片cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)cv2.imshow('Dog', img)value_of_gamma = 0.1image_gamma_correct = gamma_trans(img, value_of_gamma)# 设置窗口属性,并显示图片cv2.namedWindow("gamma_trans", cv2.WINDOW_KEEPRATIO)cv2.imshow("gamma_trans", image_gamma_correct)cv2.waitKey(0)if __name__ == '__main__':main()
4、编写代码,指定视频某些帧变白效果
5、运行效果
6、具体代码
"""
视频闪白效果1、读取视频: 使用OpenCV库中的cv2.VideoCapture()函数读取视频文件,获取视频的帧率、尺寸等信息。2、处理每一帧: 遍历视频的每一帧,对每一帧进行闪白处理。闪白处理通常有以下几种方法:3、将特定帧的所有像素值设置为白色。对特定帧进行增白处理,例如应用伽马变换使图像变亮。写入输出视频: 将处理后的每一帧写入一个新的视频文件中,形成闪白效果的视频。
"""import cv2
import numpy as npdef flash_white(frame, frame_index):"""闪白处理 1:param frame::param frame_index::return:"""if frame_index < 5 or frame_index % 5 == 0:return 255 * np.ones_like(frame, dtype=np.uint8)else:return framedef flash_white2(frame, frame_index):"""闪白处理 2:param frame::param frame_index::return:"""if frame_index < 5 or frame_index % 5 == 0:return gamma_trans(frame, 0.03)else:return framedef gamma_trans(img, gamma):"""增白处理:param img::param gamma::return:"""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)def main():video_path = "Videos/CatRun.mp4"output_path = "Videos/VideoFlashWhite.mp4"cap = cv2.VideoCapture(video_path)# 获取视频信息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))# 定义视频编码器fourcc = cv2.VideoWriter_fourcc(*'mp4v')# 创建 VideoWriter 对象out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))frame_index = 0while cap.isOpened():ret, frame = cap.read()if not ret:break# 闪白效果frame = flash_white2(frame, frame_index)out.write(frame)frame_index += 1cap.release()out.release()cv2.destroyAllWindows()if __name__ == "__main__":main()
四、注意事项
- 确保正确处理视频的每一帧,不要跳帧或漏帧。
- 选择合适的帧索引进行闪白处理,通常是在视频开始的前几帧和特定的时间点。
- 在处理视频时注意内存占用和运行时间,避免出现卡顿或内存溢出的情况。
- 根据需要调整闪白效果的强度和持续时间,以达到预期的视觉效果。
- 测试和调试代码,确保生成的视频满足预期的要求,并且没有出现问题。