Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果

目录

[Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果](#Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果)

一、简单介绍

二、简单视频卡通画效果实现原理

三、简单视频卡通画效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python 基于 OpenCV 进行视觉图像处理,......

二、简单视频卡通画效果实现原理

视频卡通画效果是一种图像处理技术,通过对视频进行处理,使其呈现出类似于卡通画风格的效果。这种效果通常会对视频中的图像进行简化和抽象化处理,使得图像更加平滑、颜色更加饱满,同时突出图像的轮廓和边缘,让整个画面看起来更加生动、有趣。

视频卡通画效果的主要特点包括:

  1. 简化和抽象化: 通过去除图像中的细节信息,简化图像的内容,使其更符合卡通画的风格。
  2. 颜色鲜艳: 增加图像的饱和度和对比度,使颜色更加鲜艳明亮。
  3. 轮廓突出: 通过增强图像的边缘和轮廓,使物体更加清晰和突出。
  4. 平滑过渡: 使图像的色彩过渡更加柔和,减少颜色的跳变,增加画面的连贯性。

实现视频卡通画效果的关键技术包括图像边缘检测、颜色增强、滤波处理等。通过这些处理手段,可以将原始视频转换为具有卡通画风格的效果。

卡通效果的实现原理如下:

  1. 灰度化:首先将彩色图像转换为灰度图像,以便进行边缘检测。

  2. 边缘检测:利用边缘检测算法(例如自适应阈值边缘检测)找到图像中的边缘部分,这些边缘部分将用于后续步骤。

  3. 颜色量化:对彩色图像进行颜色量化,使得图像中的颜色变得更加平滑。这一步通常使用双边滤波器来实现。

  4. 合并边缘和颜色图像:将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色。这样就得到了卡通效果的图像。

具体实现方法如下:

  • 使用OpenCV库提供的功能函数对图像进行处理,例如颜色转换、边缘检测、双边滤波等。

  • 对于边缘检测,可以选择不同的算法,例如自适应阈值边缘检测、Canny边缘检测等,根据实际效果选择合适的算法。

  • 在颜色量化过程中,可以调节滤波器的参数来控制图像的平滑程度,从而调节卡通效果的强度。

  • 最后,将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色,得到最终的卡通效果图像。

实现卡通效果涉及了以下关键函数:

  1. cv2.cvtColor()

    • 作用:用于图像颜色空间转换,将彩色图像转换为灰度图像。
    • 参数:包括输入图像和转换类型。
    • 示例:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  2. cv2.adaptiveThreshold()

    • 作用:自适应阈值边缘检测,根据图像局部特性自适应地选择阈值。
    • 参数:包括输入图像、输出图像、最大灰度值、阈值类型等。
    • 示例:edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 2)
  3. cv2.bilateralFilter()

    • 作用:双边滤波器,同时考虑空间距离和像素值差异,可以保留图像的边缘信息。
    • 参数:输入图像、滤波器尺寸、颜色标准差和空间标准差等。
    • 示例:color_filtered = cv2.bilateralFilter(image, 9, 75, 75)
  4. cv2.bitwise_and()

    • 作用:对两个图像进行按位与操作,获取它们相交的部分。
    • 参数:输入两个图像。
    • 示例:cartoon = cv2.bitwise_and(color_filtered, color_filtered, mask=edges)

这些函数结合使用,实现了卡通效果的处理过程。首先将彩色图像转换为灰度图像,然后对灰度图像进行边缘检测,得到图像中的边缘部分。接着对彩色图像进行双边滤波处理,使得图像颜色更加平滑。最后将边缘图像和颜色图像结合起来,只保留边缘部分对应的颜色,得到最终的卡通效果图像。

三、简单视频卡通画效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

python 复制代码
"""
简单视频卡通画效果
    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()

四、注意事项

  1. 在处理视频时,需要逐帧处理每一帧图像,并将处理后的图像写入输出视频。

  2. 调节参数时要注意平衡效果和性能,过大的参数可能会导致处理时间过长,而过小的参数可能会导致效果不明显。

相关推荐
安静读书2 分钟前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小陈phd3 分钟前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
小二·2 小时前
java基础面试题笔记(基础篇)
java·笔记·python
小喵要摸鱼3 小时前
Python 神经网络项目常用语法
python
一念之坤4 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
wxl7812275 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器
NoneCoder5 小时前
Python入门(12)--数据处理
开发语言·python
如若1235 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉
LKID体6 小时前
Python操作neo4j库py2neo使用(一)
python·oracle·neo4j
小尤笔记6 小时前
利用Python编写简单登录系统
开发语言·python·数据分析·python基础