Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果
目录
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果
一、简单介绍
二、简单视频卡通画效果实现原理
三、简单视频卡通画效果案例实现简单步骤
四、注意事项
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
二、简单视频卡通画效果实现原理
视频卡通画效果是一种图像处理技术,通过对视频进行处理,使其呈现出类似于卡通画风格的效果。这种效果通常会对视频中的图像进行简化和抽象化处理,使得图像更加平滑、颜色更加饱满,同时突出图像的轮廓和边缘,让整个画面看起来更加生动、有趣。
视频卡通画效果的主要特点包括:
- 简化和抽象化: 通过去除图像中的细节信息,简化图像的内容,使其更符合卡通画的风格。
- 颜色鲜艳: 增加图像的饱和度和对比度,使颜色更加鲜艳明亮。
- 轮廓突出: 通过增强图像的边缘和轮廓,使物体更加清晰和突出。
- 平滑过渡: 使图像的色彩过渡更加柔和,减少颜色的跳变,增加画面的连贯性。
实现视频卡通画效果的关键技术包括图像边缘检测、颜色增强、滤波处理等。通过这些处理手段,可以将原始视频转换为具有卡通画风格的效果。
卡通效果的实现原理如下:
灰度化:首先将彩色图像转换为灰度图像,以便进行边缘检测。
边缘检测:利用边缘检测算法(例如自适应阈值边缘检测)找到图像中的边缘部分,这些边缘部分将用于后续步骤。
颜色量化:对彩色图像进行颜色量化,使得图像中的颜色变得更加平滑。这一步通常使用双边滤波器来实现。
合并边缘和颜色图像:将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色。这样就得到了卡通效果的图像。
具体实现方法如下:
使用OpenCV库提供的功能函数对图像进行处理,例如颜色转换、边缘检测、双边滤波等。
对于边缘检测,可以选择不同的算法,例如自适应阈值边缘检测、Canny边缘检测等,根据实际效果选择合适的算法。
在颜色量化过程中,可以调节滤波器的参数来控制图像的平滑程度,从而调节卡通效果的强度。
最后,将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色,得到最终的卡通效果图像。
实现卡通效果涉及了以下关键函数:
-
cv2.cvtColor():
- 作用:用于图像颜色空间转换,将彩色图像转换为灰度图像。
- 参数:包括输入图像和转换类型。
- 示例:
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-
cv2.adaptiveThreshold():
- 作用:自适应阈值边缘检测,根据图像局部特性自适应地选择阈值。
- 参数:包括输入图像、输出图像、最大灰度值、阈值类型等。
- 示例:
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 2)
-
cv2.bilateralFilter():
- 作用:双边滤波器,同时考虑空间距离和像素值差异,可以保留图像的边缘信息。
- 参数:输入图像、滤波器尺寸、颜色标准差和空间标准差等。
- 示例:
color_filtered = cv2.bilateralFilter(image, 9, 75, 75)
-
cv2.bitwise_and():
- 作用:对两个图像进行按位与操作,获取它们相交的部分。
- 参数:输入两个图像。
- 示例:
cartoon = cv2.bitwise_and(color_filtered, color_filtered, mask=edges)
这些函数结合使用,实现了卡通效果的处理过程。首先将彩色图像转换为灰度图像,然后对灰度图像进行边缘检测,得到图像中的边缘部分。接着对彩色图像进行双边滤波处理,使得图像颜色更加平滑。最后将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色,得到最终的卡通效果图像。
三、简单视频卡通画效果案例实现简单步骤
1、编写代码
2、运行效果
3、具体代码
"""
简单视频卡通画效果
1、灰度化:首先将彩色图像转换为灰度图像,以便进行边缘检测。
2、边缘检测:利用边缘检测算法(例如自适应阈值边缘检测)找到图像中的边缘部分,这些边缘部分将用于后续步骤。
3、颜色量化:对彩色图像进行颜色量化,使得图像中的颜色变得更加平滑。这一步通常使用双边滤波器来实现。
4、合并边缘和颜色图像:将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色。这样就得到了卡通效果的图像。
"""
import cv2
def cartoonize(image, edge_threshold=9, color_reduction=300):
"""
图片卡通画效果
:param image:
:param edge_threshold:
:param color_reduction:
:return:
"""
# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, edge_threshold)
# 颜色量化
color = cv2.bilateralFilter(image, 9, color_reduction, color_reduction)
# 合并边缘和颜色图像
cartoon = cv2.bitwise_and(color, color, mask=edges)
return cartoon
def main(input_video_path, output_video_path, edge_threshold=9, color_reduction=300):
"""
简单视频卡通画效果
:param input_video_path:
:param output_video_path:
:param edge_threshold:
:param color_reduction:
:return:
"""
# 读取输入视频
cap = cv2.VideoCapture(input_video_path)
if not cap.isOpened():
print("Error: Unable to open input video.")
return
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')
out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))
if not out.isOpened():
print("Error: Unable to create output video.")
return
# 逐帧处理视频
while True:
ret, frame = cap.read()
if not ret:
break
# 应用卡通画效果
cartoon_frame = cartoonize(frame, edge_threshold, color_reduction)
# 写入输出视频
out.write(cartoon_frame)
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
def main():
# 调用函数并指定输入和输出视频文件路径
input_video_path = "Videos/TwoPeopleRunning.mp4"
output_video_path = "Videos/VideoCartoonEffect.mp4"
main(input_video_path, output_video_path, edge_threshold=5, color_reduction=3000)
if __name__ == "__main__":
main()
四、注意事项
-
在处理视频时,需要逐帧处理每一帧图像,并将处理后的图像写入输出视频。
-
调节参数时要注意平衡效果和性能,过大的参数可能会导致处理时间过长,而过小的参数可能会导致效果不明显。