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. 调节参数时要注意平衡效果和性能,过大的参数可能会导致处理时间过长,而过小的参数可能会导致效果不明显。

相关推荐
Cachel wood几秒前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
終不似少年遊*6 分钟前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
Python之栈8 分钟前
【无标题】
数据库·python·mysql
袁袁袁袁满24 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
老大白菜1 小时前
Python 爬虫技术指南
python
古希腊掌管学习的神2 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
LucianaiB3 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
黑色叉腰丶大魔王3 小时前
基于 MATLAB 的图像增强技术分享
图像处理·人工智能·计算机视觉
PieroPc5 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
梧桐树04299 小时前
python常用内建模块:collections
python